單片機(jī)開(kāi)發(fā)板計(jì)算器電梯密碼鎖萬(wàn)年歷交通燈課程設(shè)計(jì)寶貝及程序_第1頁(yè)
單片機(jī)開(kāi)發(fā)板計(jì)算器電梯密碼鎖萬(wàn)年歷交通燈課程設(shè)計(jì)寶貝及程序_第2頁(yè)
單片機(jī)開(kāi)發(fā)板計(jì)算器電梯密碼鎖萬(wàn)年歷交通燈課程設(shè)計(jì)寶貝及程序_第3頁(yè)
單片機(jī)開(kāi)發(fā)板計(jì)算器電梯密碼鎖萬(wàn)年歷交通燈課程設(shè)計(jì)寶貝及程序_第4頁(yè)
單片機(jī)開(kāi)發(fā)板計(jì)算器電梯密碼鎖萬(wàn)年歷交通燈課程設(shè)計(jì)寶貝及程序_第5頁(yè)
已閱讀5頁(yè),還剩28頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、開(kāi)發(fā)板 實(shí)驗(yàn)報(bào)告 設(shè) 計(jì) 課 題:基于單片機(jī)的簡(jiǎn)易計(jì)算器指 導(dǎo) 老 師: 班 級(jí): 學(xué) 號(hào): 姓 名: 一 設(shè)計(jì)內(nèi)容和目的本次實(shí)驗(yàn)的任務(wù)就是要以51系列單片機(jī)為核心實(shí)現(xiàn)一個(gè)簡(jiǎn)易計(jì)算器計(jì)算器,它的結(jié)構(gòu)非常簡(jiǎn)單,外部主要由4*4矩陣鍵盤(pán)和一個(gè)液晶顯示屏構(gòu)成,內(nèi)部由一塊AT89C51單片機(jī)構(gòu)成,通過(guò)軟件編程可實(shí)現(xiàn)簡(jiǎn)單加減乘除。目的:做自己喜歡的實(shí)驗(yàn),提高自學(xué)能力。二 方案論證經(jīng)分析,計(jì)算器電路包括三個(gè)部分:顯示電路、4*4鍵掃描電路、單片機(jī)微控制電路。具體如下:1) LCD顯示電路 LCD1602作為一個(gè)成熟的產(chǎn)品,使用簡(jiǎn)單,模式固定,便于移植到各種類(lèi)型的程序,但是初學(xué)者往往要注意結(jié)合LCD本身的時(shí)

2、序圖來(lái)完善初始化程序。又以其微功耗、體積小、顯示內(nèi)容豐富、超薄輕巧的諸多優(yōu)點(diǎn),故采用LCD.2) 4*4鍵盤(pán)掃描電路(中斷式,掃描式,反轉(zhuǎn)式)用戶(hù)設(shè)計(jì)行列鍵盤(pán)接口,一般常采用3 種方法讀取鍵值。一種是中斷式,外兩種是掃描法和反轉(zhuǎn)法。中斷式:在鍵盤(pán)按下時(shí)產(chǎn)生一個(gè)外部中斷通知CPU,并由中斷處理程序通過(guò)不同的地址讀取數(shù)據(jù)線上的狀態(tài),判斷哪個(gè)案件被按下。本實(shí)驗(yàn)采用中斷式實(shí)現(xiàn)用戶(hù)鍵盤(pán)接口。掃描法:對(duì)鍵盤(pán)上的某一行送低電平,其他行為高電平,然后讀取列值。若列值中有一位是低,則表明該行與低電平對(duì)應(yīng)列的鍵被按下;否則,掃描下一行。反轉(zhuǎn)法:先將所有行掃描線輸出低電平,讀列值。若列值有一位是低,則表明有鍵按下,

3、讀列值;然后所有列掃描線輸出低電平,再讀行值。根據(jù)讀到的值組合就可以查表1 得到的鍵碼。這個(gè)就仁者見(jiàn)仁智者見(jiàn)智了,不過(guò)如果熟悉了掃描式,建議果斷升級(jí)自己的硬件(很簡(jiǎn)單加個(gè)74LS08與門(mén)),故采用節(jié)省CPU的中斷式掃描電路。 ) 單片機(jī)微控制電路微控制電路就是以AT89C51為核心的控制核心,主要注意晶振電路的接法和復(fù)位電路的接法。三 硬件電路的設(shè)計(jì)21 硬件設(shè)計(jì)電路框圖51系列單片機(jī)系統(tǒng)4*4鍵盤(pán)LCD顯示 晶振電路復(fù)位電路線路原理框圖22 硬件設(shè)計(jì)電路的元件清單器件名稱(chēng)數(shù)量AT89C511按鍵1774LS08110K電阻9電容22uF1LCD16021晶振12MHz1電容30pF25K電位

4、器123 硬件設(shè)計(jì)電路圖將4*4的鍵盤(pán)直接接在P1口上,用P0口作為L(zhǎng)CD的顯示輸出,P3.2口的INT0作為外部中斷位。24 硬件設(shè)計(jì)的補(bǔ)充說(shuō)明四 軟件設(shè)計(jì)程序及描述本程序組成可分為3個(gè)模塊:矩陣鍵盤(pán)模塊,LCD顯示模塊,和運(yùn)算模塊(源程序見(jiàn)底頁(yè))開(kāi)始初始化參數(shù)初始化LCD顯示有鍵輸入?讀取鍵碼LCD顯示數(shù)字鍵清零鍵功能鍵狀態(tài)清零輸入數(shù)值數(shù)值送顯示緩沖YN等待數(shù)值輸入結(jié)果送顯示緩沖根據(jù)上次功能鍵和輸入的數(shù)據(jù)計(jì)算結(jié)果本次功能鍵?等待數(shù)值輸入結(jié)果送顯示緩沖等待數(shù)值輸入結(jié)果送顯示緩沖五 硬軟件的調(diào)試及方法我個(gè)人遇到的主要問(wèn)題出現(xiàn)在LCD1602上,要不是我自己買(mǎi)了塊新的LCD恐怕我的結(jié)論,就只能在

5、軟件仿真實(shí)現(xiàn)了。硬件上:在不加芯片調(diào)試時(shí),LCD1602只顯示一排全黑,一般說(shuō)明該元件是好的。(但也不一定,我那時(shí)就一直認(rèn)為我的元件沒(méi)壞);給15,16管腳分別接上+5v和0v,測(cè)試背光是否完好;給VEE接上電位器,檢查對(duì)比度是否可調(diào);一般LCD易出現(xiàn)的現(xiàn)象,我再做實(shí)驗(yàn)的時(shí)候遇到過(guò)以下幾種情況:狀態(tài)1 上電之后,1602的第一行全黑,即16個(gè)5x7黑塊產(chǎn)生原因:液晶根本就沒(méi)有進(jìn)行初始化操作,需要檢查連線或者程序。運(yùn)氣不好的情況下就是整塊LCD是壞的。狀態(tài)2 屏上顯示兩排灰格 產(chǎn)生原因:程序中對(duì)液晶初始化不正常,應(yīng)是部分初始化指令沒(méi)有正常接收,建議按照標(biāo)準(zhǔn)初始化步驟調(diào)整程序,或者調(diào)整指令之間的延

6、時(shí)(加大一些試試)-補(bǔ)充:也有可能是對(duì)比度太大,建議優(yōu)先調(diào)整對(duì)比度電阻 狀態(tài)3 顯示亂碼 這是我在實(shí)驗(yàn)室組合版上做的,原因是接線問(wèn)題狀態(tài)3 正確顯示 六 實(shí)驗(yàn)結(jié)果與性能達(dá)標(biāo)我的計(jì)算器只能準(zhǔn)確進(jìn)行得數(shù)為09的四則運(yùn)算。1.加法計(jì)算2.減法計(jì)算3.乘法計(jì)算4.除法計(jì)算5.字符顯示實(shí)物與仿真不一致。這就是傳說(shuō)中的BUG了。我不明白。七 實(shí)驗(yàn)改進(jìn)與心得體會(huì)很明顯我的計(jì)算器處理數(shù)據(jù)及顯示存在太大的局限性,我覺(jué)得主要還是我對(duì)程序中的運(yùn)算模塊理解不深,這點(diǎn)仍需大大加強(qiáng)。這個(gè)實(shí)驗(yàn)給我的感覺(jué),硬件和軟件上都不是很難。我的焊工也不馬虎,即使難看了點(diǎn),但只要軟件能行,就能完美運(yùn)行。可惜,我就敗在LCD1602,從學(xué)

7、校拿了兩塊,幸好最后實(shí)在沒(méi)辦法,自己買(mǎi)了一塊。最終證實(shí)我之前的實(shí)驗(yàn)就是LCD的損壞。沒(méi)知識(shí)真可怕,我不懂真正排查L(zhǎng)CD的好壞。不過(guò)也因禍得福,我在磕磕碰碰中,固執(zhí)的認(rèn)為L(zhǎng)CD是好的,反而使我對(duì)LCD初始化,LCD字符顯示,3種不同的矩陣鍵盤(pán)掃描的方法,及軟件上的巧妙技巧有了更好的了解。我在這次實(shí)驗(yàn)上,感覺(jué)收獲的更多. 下面是源代碼:#include<reg51.h>#define CLEARSCREEN LCD_write_command(0x01) #define uint unsigned int #define uchar unsigned char/*定義接口*/ #def

8、ine LCDIO P0#define KEYBOARD P1/保留sbit LCD1602_RS=P20; sbit LCD1602_RW=P21; sbit LCD1602_EN=P22; /*/code uchar mayuan16='0','1','2','3','4','5','6','7','8','9','0','/','*','-','+',

9、'='/不錯(cuò),這個(gè)比較明了unsigned char code keycode=0x11,0x21,0x41,0x81,0x12,0x22,0x42,0x82,0x14,0x24,0x44,0x84,0x18,0x28,0x48,0x88;/鍵盤(pán)編碼值()int i,j,k=1,s;/int t,t1,t2,a;/void delay(uchar);/延時(shí)/*定義函數(shù)*/void LCD_init(void);/初始化函數(shù)void delay_nms(unsigned int n);/延時(shí)函數(shù)void LCD_write_command(unsigned char comman

10、d);/寫(xiě)入指令函數(shù)void LCD_write_dat(unsigned char dat);/寫(xiě)入數(shù)據(jù)函數(shù)void delay_10ms();initial();uchar keyscan();/鍵盤(pán)掃描函數(shù)calc(uchar);/計(jì)算函數(shù)uchar num,temp,key,keynum;void main()/主函數(shù)LCD_init();delay_nms(100);while(1)initial();/有中斷KEYBOARD =0xf0;/鍵盤(pán)的列值全置高電平/*開(kāi)中斷*/initial()EA=1;/總開(kāi)關(guān)EX0=1;/中斷方式0開(kāi)啟IT0=0;/*/*中斷函數(shù)*/void in

11、ter0() interrupt 0unsigned char n;delay_10ms();/延時(shí)if(INT0=0)/沒(méi)鍵按下EX0=0;/關(guān)中斷n=keyscan();calc(n);EX0=1;/開(kāi)中斷KEYBOARD=0xf0;/鍵盤(pán)的列值全置高電平/*/calc(uchar n)if(n<10)/鍵值小于10t1=t1*10+n;LCD_write_command(0x00);/寫(xiě)命令語(yǔ)句LCD_write_dat(mayuann);/寫(xiě)數(shù)據(jù)函數(shù)elseif(n=10)LCD_init();t1=0;t2=0,t=0;k=1;elseif(n<15)t2=t1;t1=0

12、;j=n;LCD_write_command(0x00);LCD_write_dat(mayuann);elseLCD_write_command(0x00);LCD_write_dat(mayuann);switch(j)case 11:t=t2/t1;break;case 12:t=t2*t1;break;case 13:t=t2-t1;break;case 14:t=t2+t1;break;if(t<=9)LCD_write_command(0x00);LCD_write_dat(t+48);if(t>9)while(t>9)s=t%10;t=t/10;ak=s;k+;

13、if(t<=9)LCD_write_command(0x00);LCD_write_dat(t+48);for(i=k-1;i>=1;i-)LCD_write_command(0x00);LCD_write_dat(ai+48);/*鍵盤(pán)掃描函數(shù)*/uchar keyscan()/鍵盤(pán)掃描KEYBOARD=0xf0;/鍵盤(pán)的列值全置高電平delay_10ms();/延時(shí)if(KEYBOARD!=0xf0)/有鍵按下temp=KEYBOARD;/保存鍵盤(pán)此刻的鍵植delay_10ms();/延時(shí)if(KEYBOARD=temp)/再次確認(rèn)鍵盤(pán)是否被按下uchar i;KEYBOARD

14、=0x0f;/鍵盤(pán)的行值全置高電平delay_10ms();/10MS時(shí)間延時(shí)keynum=temp | KEYBOARD;/保存鍵盤(pán)的行值while(KEYBOARD!=0x0f);/松手檢測(cè)for(i=0;i<16;i+)if(keycodei=keynum)return (i);return -1;/*/* 延時(shí)*/void delay_nms(unsigned int n) unsigned int i=0,j=0; for (i=n;i>0;i-) for (j=0;j<10;j+); void delay_10ms()/10MS延時(shí)unsigned char i,

15、j;for(i=0;i<10;i+)for(j=0;j<120;j+);/*/ /*寫(xiě)指令函數(shù)*/ void LCD_write_command(unsigned char command) LCDIO=command; LCD1602_RS=0; LCD1602_RW=0; LCD1602_EN=0; LCD1602_EN=1; delay_nms(10);/*/*寫(xiě)數(shù)據(jù)函數(shù)*/void LCD_write_dat(unsigned char dat)LCDIO=dat;LCD1602_RS=1;LCD1602_RW=0;LCD1602_EN=0;delay_nms(1);LCD

16、1602_EN=1;/*/ /*初始化函數(shù)*/void LCD_init(void)CLEARSCREEN;/clear screenLCD_write_command(0x38);/set 8 bit data transmission modeLCD_write_command(0x0c);/open display (enable lcd display)LCD_write_command(0x80);/set lcd first display addressCLEARSCREEN;/clear screen/*/為了方便初學(xué)者學(xué)習(xí)LCD,特留下字符顯示代碼,電路圖與本實(shí)驗(yàn)一致。已通過(guò)

17、實(shí)物測(cè)試,絕對(duì)沒(méi)問(wèn)題。#include <reg51.h>unsigned char table1=0x03,0x07,0x0f,0x1f,0x1f,0x1f,0x1f,0x1f, 0x18,0x1E,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f, 0x07,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f, 0x10,0x18,0x1c,0x1E,0x1E,0x1E,0x1E,0x1E, 0x0f,0x07,0x03,0x01,0x00,0x00,0x00,0x00, 0x1f,0x1f,0x1f,0x1f,0x1f,0x0f,0x07,0x01

18、, 0x1f,0x1f,0x1f,0x1f,0x1f,0x1c,0x18,0x00, 0x1c,0x18,0x10,0x00,0x00,0x00,0x00,0x00;/心圖案unsigned char table=0x10,0x06,0x09,0x08,0x08,0x09,0x06,0x00;/字符 #define CLEARSCREEN LCD_write_command(0x01) /*定義接口*/ #define LCDIO P0sbit LCD1602_RS=P20; sbit LCD1602_RW=P21; sbit LCD1602_EN=P22; /*定義函數(shù)*/void LCD_

19、write_command(unsigned char command);/寫(xiě)入指令函數(shù)void LCD_write_dat(unsigned char dat);/寫(xiě)入數(shù)據(jù)函數(shù)void LCD_set_xy( unsigned char x, unsigned char y );/設(shè)置顯示位置函數(shù)void LCD_dsp_char( unsigned x,unsigned char y,unsigned char dat);/顯示一個(gè)字符函數(shù)void LCD_dsp_string(unsigned char X,unsigned char Y,unsigned char *s);/顯示字符串

20、函數(shù)void LCD_init(void);/初始化函數(shù)void delay_nms(unsigned int n);/延時(shí)函數(shù)/*/ /*初始化函數(shù)*/void LCD_init(void)CLEARSCREEN;/clear screenLCD_write_command(0x38);/set 8 bit data transmission modeLCD_write_command(0x0c);/open display (enable lcd display)LCD_write_command(0x80);/set lcd first display addressCLEARSCREE

21、N;/clear screen/*/ /*寫(xiě)指令函數(shù)*/ void LCD_write_command(unsigned char command) LCDIO=command; LCD1602_RS=0; LCD1602_RW=0; LCD1602_EN=0; LCD1602_EN=1; delay_nms(10);/*/*寫(xiě)數(shù)據(jù)函數(shù)*/void LCD_write_dat(unsigned char dat)LCDIO=dat;LCD1602_RS=1;LCD1602_RW=0;LCD1602_EN=0;delay_nms(1);LCD1602_EN=1;/*/ /*設(shè)置顯示位置*/voi

22、d LCD_set_xy( unsigned char x, unsigned char y )unsigned char address;if (y = 1) address = 0x80 + x;else address =0xc0+ x;LCD_write_command(address);/*/ /*顯示一個(gè)字符*/void LCD_dsp_char( unsigned x,unsigned char y,unsigned char dat)LCD_set_xy( x, y );LCD_write_dat(dat);/*/ /*顯示字符串函數(shù)*/void LCD_dsp_string(

23、unsigned char X,unsigned char Y,unsigned char *s) LCD_set_xy( X, Y ); while (*s) LCD_write_dat(*s); s +; /*/ /* 延時(shí)*/void delay_nms(unsigned int n) unsigned int i=0,j=0; for (i=n;i>0;i-) for (j=0;j<10;j+); /*/ /*主函數(shù)*/void main(void)unsigned char i,j,k,tmp;LCD_init();delay_nms(100);tmp=0x40;/設(shè)置C

24、GRAM地址的格式字k=0;for(j=0;j<8;j+) for(i=0;i<8;i+) LCD_write_command(tmp+i); / 設(shè)置自定義字符的 CGRAM 地址 delay_nms(2); LCD_write_dat(table1k); / 向CGRAM寫(xiě)入自定義字符表的數(shù)據(jù) k+; delay_nms(2); tmp=tmp+8; LCD_dsp_string(1,1,"LCD TEST ");/在第一行第一列顯示"LCD TEST" LCD_dsp_string(1,2,"SUCCESSFUL "

25、);/在第二行第一列顯示"SUCCESSFUL" for (i=0;i<4;i+) LCD_dsp_char( 12+i,1,i);/在第一行第12列位置顯示心圖案的上半部 delay_nms(1); for (i=4;i<8;i+) LCD_dsp_char( 12+i-4,2,i);/在第二行第12列位置顯示心圖案的下半部 delay_nms(1); while (1);/*/3.1 硬件連接  圖3-1所示為簡(jiǎn)易計(jì)算器的電路原理圖。P3口用于鍵盤(pán)輸入,接4*4矩陣鍵盤(pán),鍵值與鍵盤(pán)的對(duì)應(yīng)表如表-所示,p0口和p2口用于顯示,p2口用于顯示

26、數(shù)值的高位,po口用于顯示數(shù)值的低位。圖3-1 簡(jiǎn)易計(jì)算器電路原理圖鍵值與功能對(duì)應(yīng)表鍵值0123456789+-×/=ON/C功能0123456789+-×÷=清零表3-13.2 計(jì)算器的軟件設(shè)計(jì)#include<reg51.h>   /頭文件#define uint unsigned int / #define uchar unsigned charsbit lcden=P23; /定義引腳sbit rs=P24;sbit rw=P20;sbit busy=P07;char i,j,temp,num,num_1;long a,b,

27、c;     /a,第一個(gè)數(shù) b,第二個(gè)數(shù) c,得數(shù)float a_c,b_c;uchar flag,fuhao;/flag表示是否有符號(hào)鍵按下,fuhao表征按下的是哪個(gè)符號(hào)uchar code table=7,8,9,0,4,5,6,0,1,2,3,0,0,0,0,0;uchar code table1=7,8,9,0x2f-0x30,4,5,6,0x2a-0x30,1,2,3,0x2d-0x30,0x01-0x30,0,0x3d-0x30,0x2b-0x30;void delay(uchar z) / 延遲函數(shù)uchar y;for(z;z>0;z-)

28、   for(y=0;y<110;y+);void check() / 判斷忙或空閑do    P0=0xFF;    rs=0;     /指令    rw=1;     /讀    lcden=0;     /禁止讀寫(xiě)    delay(1); /等待,液晶顯示器處理數(shù)據(jù)    lcden=1; &

29、#160;   /允許讀寫(xiě)    while(busy=1); /判斷是否為空閑,1為忙,0為空閑void write_com(uchar com) / 寫(xiě)指令函數(shù)P0=com;    /com指令付給P0口rs=0;rw=0;lcden=0;check();lcden=1;void write_date(uchar date) / 寫(xiě)數(shù)據(jù)函數(shù)    P0=date;rs=1;rw=0;lcden=0;check();lcden=1;void init() /初始化  

30、60; num=-1;lcden=1; /使能信號(hào)為高電平write_com(0x38); /8位,2行write_com(0x0c); /顯示開(kāi),光標(biāo)關(guān),不閃爍*/write_com(0x06); /增量方式不移位 顯竟獗暌貧 柚?write_com(0x80); /檢測(cè)忙信號(hào)write_com(0x01); /顯示開(kāi),光標(biāo)關(guān),不閃爍num_1=0;i=0;j=0;a=0;     /第一個(gè)參與運(yùn)算的數(shù)b=0;     /第二個(gè)參與運(yùn)算的數(shù)c=0;flag=0; /flag表示是否有符號(hào)鍵按下, fuhao=0; / fuhao表征

31、按下的是哪個(gè)符號(hào)void keyscan() / 鍵盤(pán)掃描程序P3=0xfe; if(P3!=0xfe)   delay(20); 延遲20ms   if(P3!=0xfe)       temp=P3&0xf0;    switch(temp)         case 0xe0:num=0;       break; 

32、0;   case 0xd0:num=1;       break;      case 0xb0:num=2;       break;     case 0x70:num=3;       break;          while(P3!=0x

33、fe);   if(num=0|num=1|num=2)/如果按下的是'7','8'或'9          if(j!=0)                  write_com(0x01);         

34、; j=0;                if(flag=0)/沒(méi)有按過(guò)符號(hào)鍵         a=a*10+tablenum;         else/如果按過(guò)符號(hào)鍵         b=b*10+tablenum;    

35、       else/如果按下的是'/'       flag=1;    fuhao=4;/4表示除號(hào)已按      i=table1num;   write_date(0x30+i);P3=0xfd;if(P3!=0xfd)   delay(5);   if(P3!=0xfd)       temp=P3&

36、amp;0xf0;    switch(temp)         case 0xe0:num=4;         break;     case 0xd0:num=5;         break;     case 0xb0:num=6; &#

37、160;       break;     case 0x70:num=7;         break;          while(P3!=0xfd);   if(num=4|num=5|num=6&&num!=7)/如果按下的是'4','5'或'6'

38、0;      if(j!=0)                  write_com(0x01);          j=0;                if(fl

39、ag=0)/沒(méi)有按過(guò)符號(hào)鍵         a=a*10+tablenum;         else/如果按過(guò)符號(hào)鍵         b=b*10+tablenum;           else/如果按下的是'/'       flag=1; 

40、60;  fuhao=3;/3表示乘號(hào)已按      i=table1num;   write_date(0x30+i);P3=0xfb;if(P3!=0xfb)   delay(5);   if(P3!=0xfb)       temp=P3&0xf0;    switch(temp)         case 0xe0:num

41、=8;         break;     case 0xd0:num=9;         break;     case 0xb0:num=10;         break;     case 0x70:num=11; &

42、#160;       break;          while(P3!=0xfb);   if(num=8|num=9|num=10)/如果按下的是'1','2'或'3'       if(j!=0)             &

43、#160;    write_com(0x01);          j=0;               if(flag=0)/沒(méi)有按過(guò)符號(hào)鍵         a=a*10+tablenum;         else

44、/如果按過(guò)符號(hào)鍵         b=b*10+tablenum;           else if(num=11)/如果按下的是'-'       flag=1;    fuhao=2;/2表示減號(hào)已按      i=table1num;   write_date(0x30+i);P3=0xf7;i

45、f(P3!=0xf7)   delay(5);   if(P3!=0xf7)       temp=P3&0xf0;    switch(temp)         case 0xe0:num=12;         break;     case 0xd0:num=13;

46、0;        break;     case 0xb0:num=14;         break;     case 0x70:num=15;         break;          while(P3!=

47、0xf7);   switch(num)       case 12:write_com(0x01);a=0;b=0;flag=0;fuhao=0;/按下的是"清零"     break;    case 13:                /按下的是"0" 

48、0;     if(flag=0)/沒(méi)有按過(guò)符號(hào)鍵               a=a*10;        write_date(0x30);        P1=0;           

49、;   else if(flag=1)/如果按過(guò)符號(hào)鍵               b=b*10;        write_date(0x30);                   break;  

50、;  case 14:j=1;           if(fuhao=1)write_com(0x80+0x4f);/按下等于鍵,光標(biāo)前進(jìn)至第二行最后一個(gè)顯示處           write_com(0x04);     /設(shè)置從后住前寫(xiě)數(shù)據(jù),每寫(xiě)完一個(gè)數(shù)據(jù),光標(biāo)后退一格       &

51、#160;   c=a+b;           while(c!=0)                        write_date(0x30+c%10);        

52、     c=c/10;                      write_date(0x3d);     /再寫(xiě)"="           a=0;b=0;flag=0;fuhao=0; 

53、60;               else if(fuhao=2)write_com(0x80+0x4f);/光標(biāo)前進(jìn)至第二行最后一個(gè)顯示處            write_com(0x04);     /設(shè)置從后住前寫(xiě)數(shù)據(jù),每寫(xiě)完一個(gè)數(shù)據(jù),光標(biāo)后退一格(這個(gè)照理說(shuō)順序不對(duì),可顯示和上段一樣)  

54、0;        if(a-b>0)             c=a-b;           else              c=b-a;   &

55、#160;       while(c!=0)                        write_date(0x30+c%10);             c=c/10;  

56、;                    if(a-b<0)             write_date(0x2d);           write_date(0x3d);  &#

57、160;  /再寫(xiě)"="                      a=0;b=0;flag=0;fuhao=0;                else if(fuhao=3)write_com(0x80+0x4f);

58、            write_com(0x04);             c=a*b;             while(c!=0)         

59、                 write_date(0x30+c%10);             c=c/10;                  

60、60;       write_date(0x3d);               a=0;b=0;flag=0;fuhao=0;                   else if(fuhao=4)write_com(0x80+

61、0x4f);            write_com(0x04);            i=0;            c=(long)(float)a/b)*1000);        

62、;    while(c!=0)                            write_date(0x30+c%10);               c=c/

63、10;           i+;           if(i=3)               write_date(0x2e);          

64、60;              if(a/b<=0)              write_date(0x30);            write_date(0x3d);      

65、;                                    a=0;b=0;flag=0;fuhao=0;           

66、;                    break;     case 15:write_date(0x30+table1num);flag=1;fuhao=1;     break;   main()init();while(1)   keyscan();第4章 仿真和調(diào)試下面用KEIL uVision與

67、 porteus仿真軟件實(shí)現(xiàn)簡(jiǎn)易計(jì)算器的仿真與調(diào)試。4.1 keil 軟件的介紹單片機(jī)開(kāi)發(fā)中除必要的硬件外,同樣離不開(kāi)軟件,我們寫(xiě)的匯編語(yǔ)言源程序要變?yōu)镃PU可以執(zhí)行的機(jī)器碼有兩種方法,一種是手工匯編,另一種是機(jī)器匯編,目前已極少使用手工匯編的方法了。機(jī)器匯編是通過(guò)匯編軟件將源程序變?yōu)闄C(jī)器碼,用于MCS-51單片機(jī)的匯編軟件有早期的A51,隨著單片機(jī)開(kāi)發(fā)技術(shù)的不斷發(fā)展,從普遍使用匯編語(yǔ)言到逐漸使用高級(jí)語(yǔ)言開(kāi)發(fā),單片機(jī)的開(kāi)發(fā)軟件也在不斷發(fā)展,Keil軟件是目前最流行開(kāi)發(fā)MCS-51系列單片機(jī)的軟件,這從近年來(lái)各仿真機(jī)廠商紛紛宣布全面支持Keil即可看出。Keil提供了包括C編譯器、宏匯編、連接器、庫(kù)管理和一個(gè)功能強(qiáng)大的仿真調(diào)試器等在內(nèi)的完整開(kāi)發(fā)方案,通過(guò)一個(gè)集成開(kāi)發(fā)環(huán)境(uVision)將這些部份組合在一起。運(yùn)行Keil軟件需要Pentium或以上的CPU,16MB或更多RAM、20M以上空閑的硬盤(pán)空間、WIN98、NT、WIN2000、WINXP等操作系統(tǒng)。掌握這一軟件的使用對(duì)于使用51系列單片機(jī)的愛(ài)好者來(lái)說(shuō)是十分必要的,如果你使用

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論