簡易計算器課程設計_第1頁
簡易計算器課程設計_第2頁
簡易計算器課程設計_第3頁
簡易計算器課程設計_第4頁
簡易計算器課程設計_第5頁
已閱讀5頁,還剩21頁未讀 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領

文檔簡介

1、實訓成績批閱教師日 期課程設計課程名稱 單片機原理及接口技術 專業(yè)班級 電氣 學 號 2013118508 學生姓名 指導教師 實訓地點 2015年07月17日摘要隨著社會的發(fā)展,科學的進步,人們的生活水平在逐步的提高,尤其是微電子技術的發(fā)展,猶如雨后春筍般的變化。電子產(chǎn)品的更新速度快就不足驚奇了, 單片機的應用已經(jīng)越來越貼近生活,用單片機來實現(xiàn)一些電子設計也變得容易起來。近年來,單片機以其體積小、價格廉、面向控制等獨特優(yōu)點,在各種工業(yè)控制、儀器儀表、設備、產(chǎn)品的自動化、智能化方面獲得了廣泛的應用。與此同時,單片機應用系統(tǒng)的可靠性成為人們越來越關注的重要課題。影響可靠性的因素是多方面的,如構成

2、系統(tǒng)的元器件本身的可靠性、系統(tǒng)本身各部分之間的相互耦合因素等。其中系統(tǒng)的抗干擾性能是系統(tǒng)可靠性的重要指標。本設計采用80S51 芯片,實現(xiàn)了利用單片機進行了一個簡單計算器設計。允許對輸入數(shù)據(jù)進行加減乘除運算及LCD 顯示。實例所設計的計算器是用LCD1LM016L顯示的,當然也可以用其他的器件顯示,如LED 顯示屏,這樣就可以顯示出更多的字符??萍嫉倪M步告別了以前復雜的模擬電路,一塊幾厘米平方的單片機可以省去很多繁瑣的電路?,F(xiàn)在應用較廣泛的是科學計算器,但在市場還是需要簡易計算器,因為其價格低廉,設計簡單,使用方便被廣泛的運用于我們的日常生活之中。 目錄一、設計的大體思路1二、所用元件的詳細功

3、能11、運算模塊AT89C5112、鍵盤輸入43、液晶模塊簡介6三、計算器程序流程圖7四、總的設計圖8五、計算器C語言編程9六、功能實現(xiàn)截圖171、圖注釋172、圖注釋:183、圖注釋:194、圖注釋:205、圖注釋:21七、實訓心得與體會22一、設計的大體思路我選到的本次課程設計的最終目的是要實現(xiàn)一個簡單計算器,要求編寫一個程序,每運行一次可執(zhí)行程序,可以實現(xiàn)數(shù)的加減乘除四則運算。比如,十進制數(shù)的加減乘除四則運算。我們曾經(jīng)學習過兩個具體數(shù)字進行加減法運算,但是對于簡單計算器用匯編語言實現(xiàn)難點在于寄存器所存的數(shù)據(jù)較少,很難實現(xiàn)多位數(shù)的四則運算,C語言確有著解決匯編語言的優(yōu)點,所以選用C語言完成

4、該程序的制作,首先運用單片機AT89c51掃描4*4矩陣鍵盤,從而實現(xiàn)按鍵的輸入功能,鍵盤的輸入是按照每行的電平掃描,并判斷按下數(shù)字鍵之后是否有符號鍵,如果沒有則在原數(shù)之后添加數(shù)字,如果按下符號接收符號后數(shù)據(jù),并判斷是否有等號鍵按下,如果按下,則調(diào)用運算函數(shù)和輸出結果。二、所用元件的詳細功能1、運算模塊AT89C51MCS-51單片機是在一塊芯片中集成了CPU、RAM、ROM、定時器/計數(shù)器和多功能I/O等一臺計算機所需要的基本功能部件。如果按功能劃分,它由如下功能部件組成,即微處理器(CPU)、數(shù)據(jù)存儲器(RAM)、程序存儲器(ROM/EPROM)、并行I/O 口、串行口、定時器/計數(shù)器、中

5、斷系統(tǒng)及特殊功能寄存器(SFR)。單片機是靠程序運行的,并且可以修改。通過不同的程序?qū)崿F(xiàn)不同的功能,尤其是特殊的獨特的一些功能,通過使用單片機編寫的程序可以實現(xiàn)高智能,高效率,以及高可靠性!因此我們采用單片機作為計算器的主要功能部件,可以進行很快地實現(xiàn)運算功能,如圖所示:第 2 頁單片機(AT89S51)的引腳功能51系列單片機8031、8051及89c51/89s51均采用40Pin封裝的雙列直接DIP結構。上圖是它們的引腳配置:40個引腳中,正電源和地線兩根,外置石英振蕩器的時鐘線兩根,4組8位共32個I/O口,中斷口線與P3口線復用,如圖所示:完整引腳圖引腳介紹電源引腳:Vcc40腳正電

6、源腳,工作電壓為5V,另有AT89LV51工作電壓則是2.7-6V, 引腳功能一樣。GND20腳接地端。型號同樣為AT89C51的芯片,在其后面還有頻率編號,有12,16,20,24MHz可選。大家在購買和選用時要注意了。如AT89C51 24PC就是最高振蕩頻率為24MHz,40P6封裝的普通商用芯片。復位:在振蕩器運行時,有兩個機器周期(24個振蕩周期)以上的高電平出現(xiàn)在此引腳時,將使單片機復位,只要這個腳保持高電平,51芯片便循環(huán)復位。復位后P0P3口均置1引腳表現(xiàn)為高電平,程序計數(shù)器和特殊功能寄存器SFR全部清零。當復位腳由高電平變?yōu)榈碗娖綍r,芯片為ROM的0000H處開始運行程序。復

7、位操作不會對內(nèi)部RAM有所影響。當8051通電,時鐘電路開始工作,在RESET引腳上出現(xiàn)24個時鐘周期以上的高電平,系統(tǒng)即初始復位。什么叫復位?復位是單片機重新執(zhí)行程序代碼的意思。8051的復位方式可以是自動復位,也可以是手動復位,如圖3-6所示。此外,RESET/Vpd還是一復用腳,Vcc掉電期間,此腳可接上備用電源, 以保證單片機內(nèi)部RAM的數(shù)據(jù)不丟失。輸入輸出(I/O)引腳:P39-P32為P0.0-P0.7輸入輸出腳,稱為P0口,是一個8位漏極開路型雙向I/O口。內(nèi)部不帶上拉電阻,當外接上拉電阻時,P0口能以吸收電流的方式驅(qū)動八個LSTTL負載電路。通常在使用時外接上拉電阻,用來驅(qū)動多

8、個數(shù)碼管。 在訪問外部程序和外部數(shù)據(jù)存儲器時,P0口是分時轉換的地址(低8位)/數(shù)據(jù)總線,不需要外接上拉電阻。P1-P8為P1.0-P1.7輸入輸出腳,稱為P1口,是一個帶內(nèi)部上拉電阻的8位雙向I/0口。P1口能驅(qū)動4個LSTTL負載。 通常在使用時外不需要外接上拉電阻,就可以直接驅(qū)動發(fā)光二極管。端口置1時,內(nèi)部上拉電阻將端口拉到高電平,作輸入用。P21-P28為P2.0-P2.7輸入輸出腳,稱為P2口,是一個帶內(nèi)部上拉電阻的8位雙向I/O口,P2口能驅(qū)動4個LSTTL負載。端口置1時,內(nèi)部上拉電阻將端口拉到高電平,作輸入用。對內(nèi)部Flash程序存儲器編程時,接收高8位地址和控制信息。在訪問外

9、部程序和16位外部數(shù)據(jù)存儲器時,P2口送出高8位地址。而在訪問8位地址的外部數(shù)據(jù)存儲器時其引腳上的內(nèi)容在此期間不會改變。 P10-P17為P3.0-P3.7輸入輸出腳,稱為P3口,是一個帶內(nèi)部上拉電阻的8位雙向I/O口,P2口能驅(qū)動4個LSTTL負載,這8個引腳還用于專門的第二功能。端口置1時,內(nèi)部上拉電阻將端口拉到高電平,作輸入用。P1P3端口在做輸入使用時,因內(nèi)部有上接電阻,被外部拉低的引腳會輸出一定的電流。除此之外P3端口還用于一些專門功能,如P3引腳兼用功能P3.0串行通訊輸入(RXD)P3.1串行通訊輸出(TXD)P3.2外部中斷0( INT0)P3.3外部中斷1(INT1)P3.4

10、定時器0輸入(T0)P3.5定時器1輸入(T1)P3.6外部數(shù)據(jù)存儲器寫選通WRP3.7外部數(shù)據(jù)存儲器寫選通RD控制或復用引腳:(1) ALE/PROG 30 訪問外部存儲器時,ALE(地址鎖存允許)的輸出用于鎖存地址的低位字節(jié)。即使不訪問外部存儲器,ALE端仍以不變的頻率輸出脈沖信號(此頻率是振蕩器頻率的1/6)。在訪問外部數(shù)據(jù)存儲器時,出現(xiàn)一個ALE脈沖。對Flash存儲器編程時,這個引腳用于輸入編程脈沖PROG(2) PSEN 29 該引是外部程序存儲器的選通信號輸出端。當AT89C51由外部程序存儲器取指令或常數(shù)時,每個機器周期輸出2個脈沖即兩次有效。但訪問外部數(shù)據(jù)存儲器時,將不會有脈

11、沖輸出。(3) EA/Vpp 31 外部訪問允許端。當該引腳訪問外部程序存儲器時,應輸入低電平。要使AT89S51只訪問外部程序存儲器(地址為0000H-FFFFH),這時該引腳必須保持低電平。對Flash存儲器編程時,用于施加Vpp編程電壓。2、鍵盤輸入當無按鍵閉合時,P10P13 與P14P17 之間開路;當有鍵閉合時,與閉合鍵相連的兩條I/O 口線之間短路。判斷有無按鍵按下的方法是:第一步,置列線P14P17 為輸入狀態(tài),從行線P10P13 輸出低電平,讀入列線數(shù)據(jù),若某一列線為低電平,則該列線上有鍵閉合。第二步,行線輪流輸出低電平,從列線P14P17 讀入數(shù)據(jù),若有某一列為低電平,則對

12、應行線上有鍵按下。綜合一二兩步的結果,可確定按鍵編號。但是鍵閉合一次只能進行一次鍵功能操作,因此須等到按鍵釋放后,再進行鍵功能操作,否則按一次鍵,有可能會連續(xù)多次進行同樣的鍵操作。這種情況下,編程會很簡單,但是會占用大量的I/O 口資源,因此在很多情況下都不采用這種方式。為此,我們引入了矩陣鍵盤的應用,采用四條I/O 線作為行線,四條I/O 線作為列線組成鍵盤。在行線和列線的每個交叉點上設置一個按鍵。這樣鍵盤上按鍵的個數(shù)就為4×4個。這種行列式鍵盤結構能有效地提高單片機系統(tǒng)中I/O 口的利用率,如圖所示:鍵盤介紹:每個按鍵都有它的行值和列值,行值和列值的組合就是識別這個按鍵的編碼。矩

13、陣的行線和列線分別通過兩并行接口和CPU通信。鍵盤的一端(列線)通過電阻接VCC,而接地是通過程序輸出數(shù)字“0”實現(xiàn)的。鍵盤處理程序的任務是:確定有無鍵按下,判斷哪一個鍵按下,鍵的功能是什么?還要消除按鍵在閉合或斷開時的抖動。兩個并行口中,一個輸出掃描碼,使按鍵逐行動態(tài)接地;另一個并行口輸入按鍵狀態(tài),由行掃描值和回饋信號共同形成鍵編碼而識別按鍵,通過軟件查表,查出該鍵的功能。3、液晶模塊簡介LM016L的結構及功能LM016L液晶模塊采用HD44780控制器,hd44780具有簡單而功能較強的指令集,可以實現(xiàn)字符移動,閃爍等功能,LM016L與單片機MCU通訊可采用8位或4位并行傳輸兩種方式,

14、hd44780控制器由兩個8位寄存器,指令寄存器(IR)和數(shù)據(jù)寄存器(DR)忙標志(BF),顯示數(shù)RAM(DDRAM),字符發(fā)生器ROMA(CGOROM)字符發(fā)生器RAM(CGRAM),地址計數(shù)器RAM(AC)。IR用于寄存指令碼,只能寫入不能讀出,DR用于寄存數(shù)據(jù),數(shù)據(jù)由內(nèi)部操作自動寫入DDRAM和CGRAM,或者暫存從DDRAM和CGRAM讀出的數(shù)據(jù),BF為1時,液晶模塊處于內(nèi)部模式,不響應外部操作指令和接受數(shù)據(jù),DDTAM用來存儲顯示的字符,能存儲80個字符碼,CGROM由8位字符碼生成5*7點陣字符160中和5*10點陣字符32種.8位字符編碼和字符的對應關系Proteus仿真:使用P

15、roteus仿真1602-即LM016L-依照數(shù)據(jù)手冊說明可能遇到困難,可以嘗試采用以下方案解決:1、數(shù)據(jù)手冊中可能介紹1602內(nèi)部D0D7已有上拉,可以使用P0口直接驅(qū)動。在Proteus里LM016L內(nèi)部可能沒有,應該人為加上拉電阻。建議不要使用排阻,使用普通電阻一個一個拉應該可以解決問題;2、可能碰到不能檢測忙信號的問題,嘗試使用延時把忙信號拖過去.引腳說明1602字符型LCD通常有14條引腳線電路接口設計,AT889C51的P0口作為數(shù)據(jù)的輸出端,P2.0和P2.1,P2.2作為控制信號的輸出端三、計算器程序流程圖 系統(tǒng)程序流程圖 LCD顯示流程圖開始預設數(shù)據(jù)顯示開始調(diào)整指針指向下一行

16、LCD初始化功能設置系統(tǒng)初始化LCD初始化顯示結束?顯示RAM區(qū)清 N顯示指針指向下一行處理按鍵值 Y待顯示數(shù)據(jù)送緩沖判斷當前狀態(tài)結束LCD顯示四、總的設計圖簡易計算器主要包括:鍵盤電路、顯示電路。以下是設計的整個系統(tǒng)的圖五、計算器C語言編程#include<reg51.h> /頭文件 #define uint unsigned int / 將unit定義為無符號整數(shù)#define uchar unsigned char / 將uchar定義為無符號變量sbit lcden=P23; /定義引腳 sbit rs=P24; /定義引腳sbit rw=P20; /定義引腳sbit bu

17、sy=P07; /定義引腳char i,j,temp,num,num_1;long a,b,c;/a為第一個數(shù) b為第二個數(shù) c,得數(shù)float a_c,b_c;uchar flag,fuhao;/flag表示是否有符號鍵按下,fuhao表征按下的是哪個符號 uchar code table=7,8,9,0,4,5,6,0,1,2,3,0,0,0,0,0;定義無符號數(shù)組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; /十六進制碼 2f(除法)2a

18、(乘法)2d(減)01(清零)3d(等號)2b(加號)void delay(uchar z) / 延遲函數(shù)uchar y; uchar/定義為無符號變量for(z;z>0;z-)for(y=0;y<110;y+);void check() / 判斷忙或空閑doP0=0xFF;rs=0; /指令rw=1; /讀lcden=0; /禁止讀寫delay(1); /等待,液晶顯示器處理數(shù)據(jù)lcden=1; /允許讀寫 while(busy=1); /判斷是否為空閑,1為忙,0為空閑 void write_com(uchar com) / 寫指令函數(shù) P0=com; /com指令付給P0口r

19、s=0;rw=0;lcden=0;check();lcden=1; void write_date(uchar date) / 寫數(shù)據(jù)函數(shù) P0=date;rs=1;rw=0;lcden=0;check();lcden=1; void init() /初始化 num=-1;lcden=1; /使能信號為高電平write_com(0x38); /8位,2行write_com(0x0c); /顯示開,光標關,不閃爍*/write_com(0x06); /增量方式不移位 顯竟獗暌貧 柚?write_com(0x80); /檢測忙信號write_com(0x01); /顯示開,光標關,不閃爍num_1

20、=0;i=0;j=0;a=0; /第一個參與運算的數(shù)b=0; /第二個參與運算的數(shù)c=0;flag=0; /flag表示是否有符號鍵按下,fuhao=0; / fuhao表征按下的是哪個符號void keyscan() / 鍵盤掃描程序P3=0xfe;if(P3!=0xfe) delay(20); /延遲20ms if(P3!=0xfe) temp=P3&0xf0; switch(temp) case 0xe0:num=0;break;case 0xd0:num=1;break;case 0xb0:num=2;break; case 0x70:num=3;break; while(P3

21、!=0xfe);/鍵盤第一行7 8 9 /if(num=0|num=1|num=2)/如果按下的是'7','8'或'9 if(j!=0) write_com(0x01); j=0; if(flag=0)/沒有按過符號鍵 a=a*10+tablenum; else/如果按過符號鍵 b=b*10+tablenum; else/如果按下的是'/' flag=1; fuhao=4;/4表示除號已按 i=table1num; write_date(0x30+i);P3=0xfd;if(P3!=0xfd)delay(5);if(P3!=0xfd)te

22、mp=P3&0xf0;switch(temp) case 0xe0:num=4; break;case 0xd0:num=5;break;case 0xb0:num=6;break;case 0x70:num=7;break;while(P3!=0xfd);/鍵盤第二行4 5 6 *if(num=4|num=5|num=6&&num!=7)/如果按下的是'4','5'或'6'if(j!=0) write_com(0x01); j=0;if(flag=0)/沒有按過符號鍵 a=a*10+tablenum;else/如果按過符

23、號鍵 b=b*10+tablenum; else/如果按下的是'/'flag=1; fuhao=3;/3表示乘號已按i=table1num;write_date(0x30+i);P3=0xfb;if(P3!=0xfb)delay(5); if(P3!=0xfb) temp=P3&0xf0; switch(temp) case 0xe0:num=8; break; case 0xd0:num=9; break; case 0xb0:num=10; break; case 0x70:num=11; break; while(P3!=0xfb); /鍵盤第三行1 2 3 -

24、if(num=8|num=9|num=10)/如果按下的是'1','2'或'3' if(j!=0) write_com(0x01); j=0; if(flag=0)/沒有按過符號鍵 a=a*10+tablenum; else/如果按過符號鍵 b=b*10+tablenum; else if(num=11)/如果按下的是'-' flag=1; fuhao=2;/2表示減號已按 i=table1num; write_date(0x30+i); P3=0xf7; if(P3!=0xf7) delay(5); if(P3!=0xf7) t

25、emp=P3&0xf0; switch(temp) case 0xe0:num=12; break; case 0xd0:num=13; break; case 0xb0:num=14; break; case 0x70:num=15; break; /鍵盤第四行 while(P3!=0xf7); switch(num) case 12:write_com(0x01);a=0;b=0;flag=0;fuhao=0;/按下的是"清零" break; case 13: /按下的是"0" if(flag=0) /沒有按過符號鍵 a=a*10; writ

26、e_date(0x30); P1=0; else if(flag=1)/如果按過符號鍵 b=b*10; write_date(0x30); break; /加法 case 14:j=1; if(fuhao=1)write_com(0x80+0x4f);/按下等于鍵,光標前進至第二行最后一個顯示處 write_com(0x04); /設置從后住前寫數(shù)據(jù),每寫完一個數(shù)據(jù),光標后退一格 c=a+b; while(c!=0) write_date(0x30+c%10); c=c/10; write_date(0x3d); /再寫"=" a=0;b=0;flag=0;fuhao=0;

27、 /減法 else if(fuhao=2)write_com(0x80+0x4f); /光標前進至第二行最后一個顯示處 write_com(0x04); /設置從后住前寫數(shù)據(jù),每寫完一個數(shù)據(jù),光標后退一格 if(a-b>0) c=a-b; else c=b-a; while(c!=0) write_date(0x30+c%10); c=c/10; if(a-b<0) write_date(0x2d); write_date(0x3d); /再寫"=" a=0;b=0;flag=0;fuhao=0; /乘法 else if(fuhao=3)write_com(0x

28、80+0x4f); write_com(0x04); c=a*b; while(c!=0) write_date(0x30+c%10); c=c/10; write_date(0x3d); a=0;b=0;flag=0;fuhao=0; /除法 else if(fuhao=4)write_com(0x80+0x4f); write_com(0x04); i=0; c=(long)(float)a/b)*1000); while(c!=0) write_date(0x30+c%10); c=c/10; i+; if(i=3) write_date(0x2e); /如果除數(shù)為零輸出=/ if(a/

29、b=0) write_date(0x30); write_date(0x3d); a=0;b=0;flag=0;fuhao=0; break;case 15:write_date(0x30+table1num);flag=1;fuhao=1; break; main()init();while(1) keyscan();六、功能實現(xiàn)截圖圖1、圖注釋:可實現(xiàn)小數(shù)點后3位的顯示,來自源程序c=(long)(float)a/b)*1000);Float:單精度實型變量取值范圍在-1038到1038,有4字節(jié),有效位數(shù)78位圖2、圖注釋:減法的實現(xiàn)可以實現(xiàn)負數(shù),源程序if(fuhao=2)write_

30、com(0x80+0x4f); /光標前進至第二行最后一個顯示處 write_com(0x04); /設置從后住前寫數(shù)據(jù),每寫完一個數(shù)據(jù),光標后退一格 if(a-b>0) c=a-b; else c=b-a; while(c!=0) write_date(0x30+c%10); c=c/10; if(a-b<0) write_date(0x2d); write_date(0x3d); /再寫"=" a=0;b=0;flag=0;fuhao=0; 圖3、圖注釋:源程序if(fuhao=1)write_com(0x80+0x4f);/按下等于鍵,光標前進至第二行最后

31、一個顯示處 write_com(0x04); /設置從后住前寫數(shù)據(jù),每寫完一個數(shù)據(jù),光標后退一格 c=a+b; while(c!=0) write_date(0x30+c%10); c=c/10; write_date(0x3d); /再寫"=" a=0;b=0;flag=0;fuhao=0;圖4、圖注釋:源程序if(fuhao=3)write_com(0x80+0x4f); write_com(0x04); c=a*b; while(c!=0) write_date(0x30+c%10); c=c/10; write_date(0x3d); a=0;b=0;flag=0;fuhao=0; /最大可實現(xiàn)被

溫馨提示

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

評論

0/150

提交評論