基于單片機(jī)設(shè)計(jì)計(jì)算器C語(yǔ)言編碼_第1頁(yè)
基于單片機(jī)設(shè)計(jì)計(jì)算器C語(yǔ)言編碼_第2頁(yè)
基于單片機(jī)設(shè)計(jì)計(jì)算器C語(yǔ)言編碼_第3頁(yè)
基于單片機(jī)設(shè)計(jì)計(jì)算器C語(yǔ)言編碼_第4頁(yè)
基于單片機(jī)設(shè)計(jì)計(jì)算器C語(yǔ)言編碼_第5頁(yè)
已閱讀5頁(yè),還剩17頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、基于單片機(jī)的計(jì)算器設(shè)計(jì) 目錄1.設(shè)計(jì)概述 2.硬件設(shè)計(jì) 3.軟件設(shè)計(jì) 4.設(shè)計(jì)總結(jié) 5.參考文獻(xiàn) 1設(shè)計(jì)概述單片機(jī)是單片微型機(jī)的簡(jiǎn)稱,故又稱為微控制器mcu(micro control unit)。通常由單塊集成電路芯片組成,內(nèi)部包含有計(jì)算機(jī)的基本功能部件:中央處理器cpu,存儲(chǔ)器和i/o接口電路等。因此,單片機(jī)只要和適當(dāng)?shù)能浖巴獠吭O(shè)備相結(jié)合,便可成為一個(gè)單片機(jī)控制系統(tǒng)。在此次設(shè)計(jì)中,設(shè)計(jì)課題是基于單片機(jī)的計(jì)算器設(shè)計(jì)。由于計(jì)算器需要比較多的輸入輸出口,所以采用內(nèi)部存儲(chǔ)資源比較pic18f452單片機(jī)(本打算使用自己比較熟悉的at89c52,但是在一些單片機(jī)論壇上大多數(shù)有設(shè)計(jì)經(jīng)驗(yàn)者推薦使用pi

2、c18f452,所以在此也選用pic18f452),8位lcd動(dòng)態(tài)顯示,需要14根數(shù)據(jù)線,其中6根作為線選,相當(dāng)于地址線,選擇其中一位顯示,另外8根作為lcd顯示碼輸入線。根據(jù)計(jì)算器的輸入功能需求,采用44矩陣鍵盤,采用矩陣鍵盤也是利用軟件節(jié)省硬件,利用內(nèi)部rom,進(jìn)行循環(huán)查詢。揚(yáng)聲器可以用一個(gè)準(zhǔn)io口。采用pic18f452作為運(yùn)算和控制單元完全滿足系統(tǒng)的需求。計(jì)算器輸出部分采用lcd,因?yàn)橛?jì)算器是8位數(shù)據(jù)顯示,所以用8位8段lcd,采用lcd動(dòng)態(tài)顯示,利用軟件節(jié)省硬件外部資源。軟件方面從分析計(jì)算器功能、流程圖設(shè)計(jì),再到程序的編寫進(jìn)行系統(tǒng)設(shè)計(jì)。編程語(yǔ)言方面采用c語(yǔ)言進(jìn)行編寫。設(shè)計(jì)的結(jié)果能夠完

3、成最高8位有效數(shù)字無(wú)浮點(diǎn)加、減、乘、除計(jì)算功能。 2硬件設(shè)計(jì) 2.1 計(jì)算器模擬系統(tǒng)功能要求:(1)要求模擬的計(jì)算器至少顯示8位數(shù)字,開機(jī)運(yùn)行時(shí),只有數(shù)碼管最低位顯示為“0”,其余位全部不顯示;(2)設(shè)計(jì)44鍵盤,分別表示09、/ 、,輸入的數(shù)字從設(shè)計(jì)的鍵盤輸入;(3)第一次按下時(shí),顯示“d1”;第二次按下時(shí),顯示“d1d2”;第三次按下時(shí),顯示“d1d2d3”,8個(gè)顯示完畢后,再按下按鍵時(shí),給出“嘀”提示音;(4)可以對(duì)計(jì)算結(jié)果小于256的兩個(gè)無(wú)符號(hào)數(shù)進(jìn)行加法運(yùn)算,并顯示計(jì)算結(jié)果。對(duì)于、/、和的運(yùn)算為提高部分;2.2總體設(shè)計(jì)方案由于計(jì)算器需要比較多的輸入輸出口,所以采用內(nèi)部存儲(chǔ)資源比較多的p

4、ic18f452單片機(jī),8位lcd動(dòng)態(tài)顯示,需要14根數(shù)據(jù)線,其中6根作為線選,相當(dāng)于地址線,選擇其中一位顯示,另外8根作為lcd顯示碼輸入線。根據(jù)計(jì)算器的輸入功能需求,采用44矩陣鍵盤,采用矩陣鍵盤也是利用軟件節(jié)省硬件,利用內(nèi)部rom,進(jìn)行循環(huán)查詢。揚(yáng)聲器可以用一個(gè)準(zhǔn)io口。采用pic18f452作為運(yùn)算和控制單元完全滿足系統(tǒng)的需求。2.3系統(tǒng)硬件設(shè)計(jì)復(fù)位電路:rst引腳是復(fù)位信號(hào)輸入端,高電平有效。采用上電復(fù)位,因?yàn)楸鞠到y(tǒng)設(shè)計(jì)的計(jì)算器鍵盤具有復(fù)位鍵,所以不需要進(jìn)行手動(dòng)復(fù)位,以節(jié)省硬件資源。上電復(fù)位是利用電容充電來實(shí)現(xiàn)的,上電瞬間rst端口電位與vcc相同,隨著充電電流的減少,rst電位下降

5、,最后被嵌位在0v。電容采用22f電容,電阻選擇10k。時(shí)鐘電路:時(shí)鐘是時(shí)序的基礎(chǔ),51核片內(nèi)由一個(gè)反相放大器構(gòu)成振蕩器,可以由它產(chǎn)生時(shí)鐘,時(shí)鐘可以由兩種方式產(chǎn)生內(nèi)部方式和外部方式。本系統(tǒng)采用內(nèi)部方式,在xtal1和xtal2端外接石英晶體作為定時(shí)元件,內(nèi)部反相放大器自激振蕩,產(chǎn)生時(shí)鐘。時(shí)鐘發(fā)生器對(duì)振蕩脈沖二分頻。電容采用30pf電容。顯示電路:采用8位8段共陰極lcd,p0口作為lcd顯示碼輸出端,p2口接線選端。p0口因內(nèi)部沒有上拉電阻,無(wú)法提供較大電流,需連接上拉電阻。鍵盤電路:采用p3口與矩陣鍵盤連接。 3軟件設(shè)計(jì)3.1仿真軟件選擇電路仿真軟件選用proteus isis,本來是選用偉

6、福仿真軟件,但是在安裝過程中,偉福仿真軟件無(wú)法在本人win7 64位操作系統(tǒng)上正常安裝,于是采用proteus isis。3.1.1 proteus isis簡(jiǎn)介 proteus isis是英國(guó)labcenter公司開發(fā)的電路分析與實(shí)物仿真軟件。它運(yùn)行于windows操作系統(tǒng)上,可以仿真、分析(spice)各種模擬器件和集成電路。該軟件的特點(diǎn)是:(1)全部滿足我們提出的單片機(jī)軟件仿真系統(tǒng)的標(biāo)準(zhǔn),并在同類產(chǎn)品中具有明顯的優(yōu)勢(shì)。(2)具有模擬電路仿真、數(shù)字電路仿真、單片機(jī)及其外圍電路組成的系統(tǒng)的仿真、rs232動(dòng)態(tài)仿真、i2 c調(diào)試器、spi調(diào)試器、鍵盤和lcd系統(tǒng)仿真的功能;有各種虛擬儀器,如示

7、波器、邏輯分析儀、信號(hào)發(fā)生器等。(3)目前支持的單片機(jī)類型有:arm7系列、68000系列、8051系列、avr系列、pic12系列、pic16系列、pic18系列、z80系列、hc11系列以及各種外圍芯片。(4)支持大量的存儲(chǔ)器和外圍芯片。3.2仿真軟件電路圖在仿真軟件proteus isis上根據(jù)設(shè)計(jì)需求,設(shè)計(jì)出完整的電路圖:3.3計(jì)算流程圖設(shè)計(jì)鍵盤模塊是否cl初始化yy+aba=10a+key保存運(yùn)算符b=10b+key是否+-*/是否a是否a代表按下運(yùn)算符號(hào)前的數(shù)(程序中為a1),b代表按下運(yùn)算符號(hào)后的數(shù)(程序中為b1)。程序中另外定義一個(gè)變量ab以區(qū)分a與b。流程圖中省略了一些細(xì)節(jié),

8、比如運(yùn)算結(jié)果如果首位是0則不顯示,開機(jī)顯示0,每次按下鍵時(shí)將lcd移位顯示,以及將最終運(yùn)算結(jié)果的每一位上數(shù)字計(jì)算出來。3.4程序設(shè)計(jì)程序代碼采用c語(yǔ)言:#include#define uchar unsigned char uchar data dispbuf8=0,16,16,16,16,16,16,16;/display the code of dispcode uchar code dispcode=0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x00; / the cc

9、 code & bank!uchar code dispbitcode=0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f;/ select the lcd bituchar code getkeycode=0xee,0xed,0xeb,0xe7, 0xde,0xdd,0xdb,0xd7, 0xbe,0xbd,0xbb,0xb7, 0x7e,0x7d,0x7b,0x77;/ input the key and get the keycodeuchar code actioncode= 7,4,1,10, 8,5,2,0, 9,6,3,11, 15,14,13,12;

10、/ the value of the key uchar code initkeycode= 0xef,0xdf,0xbf,0x7f;/ put the initkeycode to keysbit p1_0 =p10;ucharab = 0; / distinguish the a1(0) or b1(1) (the first key and second key)uchar signal = 11; / distinguish the +、 -、 *、 / (11,12,13,14)uchar i,j,key; / i,j for the circulation key is the v

11、alueuchar keypos = 0; / the position of the keyuchar dispbitcount = 0;/ turn on the bit of 8 lcd by the dispbitcountunsigned long a1 = 0, b1 = 0;unsigned long y= 0;void delay(uchar t) / the delay programmewhile(t-)for(j=140;j0;) j-; void ring() / make the speaker ringchar d;for(d=10;d0;d-)p1_0=p1_0;

12、delay(1); /* name: display() display the lcd by using the interrupt of t0*/void display(void) interrupt 1 / using the isr 1 t0th0 = (65536-2000)/256; tl0 = (65536-2000)%256; / display the lcd by using the interrupt of t0 p1_0 = 0;p2 = dispbitcode dispbitcount ;/ select the bit of lcdp0 = dispcode di

13、spbuf dispbitcount ; /put out the display codedispbitcount+;delay(1);if(dispbitcount = 8) dispbitcount = 0;/* name:keyscan() put the value of the keyboard to key*/ void keyscan(void)uchar sender = 0x00;uchar count1 = 0x00;ucharcount2 = 0x00; for(count1 = 0; count1 4; count1+)p3=initkeycodecount1;sen

14、der = p3; for(count2 = 0; count2 16; count2+)if(sender = getkeycodecount2) delay(20);/ delay 10 ms if(sender = p3)/ clear up the shiver key = actioncodecount2;if(key = 10) /if put the c (reset) ,initialize the programmea1=0; b1=0; y=0; ab=0; keypos = 0;dispbitcount = 0;dispbuf0 = 0;p1_0 = 0;for(i =

15、1; i 8 ,display e !dispbuf7 = 14;for(i=0;i0; i-)if(dispbufi = 0)dispbufi=16;continue;else break; / dont display the highest bit if it is 0 / end key is =if(key = 12 | key = 13 | key = 14 | key = 15 ) /if key if + - * /signal = key; ab = !ab;/ swap a1(0) & b1(1) keypos = 0; / end key is + - * / !if(k

16、ey = 0 | key=1 | key=2 | key=3 | key=4 | key=5 | key=6 | key=7 | key=8 | key=9) /if key is the numberif(keypos keypos;i-)dispbufi=16;for(i = keypos; i0; i-)dispbufi = dispbufi-1;dispbuf0 = key;keypos+;if(keypos = 8)/make the bell ringring();switch (ab)case 0:a1 = 10 * a1 + key; break;case 1:b1 = 10

17、* b1 + key; break;/end key is number ! /end if (sender = p3)/end the if(sender = getkey)/end the 16 circle/end the 4 circle /end the keyscan()void main( )tmod = 0x01; /mode 1: 16 bit timer ,make the timer0 on&off by the tri th0 = (65536-2000)/256;tl0 = (65536-2000)%256;ea = 1; /enable the interrupt

18、of the cpuet0 = 1; /turn on the timer0tr0 = 1;/enable the timer0 a1=0;b1=0;y=0;ab=0;keypos = 0;dispbitcount = 0;dispbuf0 = 0;while(1) keyscan();3.5鍵盤設(shè)計(jì)在初始化時(shí),先將0xef,0xdf,0xbf,0x7f輸給p3口,再讀取p3口狀態(tài),保存至變量sender,然后將變量sender與保存在程序存儲(chǔ)器rom中預(yù)先計(jì)算好的16個(gè)鍵值依次進(jìn)行比較判斷,如果相等,表明可能該值被按下,再延遲10ms然后第二次循環(huán)再次判斷p3口狀態(tài)是否與變量sender中的

19、值相等,如果相等,則表明的確有代表該值的鍵被按下。然后根據(jù)所按下的鍵值分步執(zhí)行分支程序。3.5 lcd動(dòng)態(tài)顯示如圖 lcd動(dòng)態(tài)顯示3.5.2 lcd移位顯示計(jì)算器程序設(shè)計(jì)中,難度最大的就是實(shí)現(xiàn)lcd的移位顯示。當(dāng)輸入一個(gè)數(shù)字,利用一個(gè)循環(huán)和一個(gè)記錄按鍵變量,將低位數(shù)字依次送到高位數(shù)字,最后把按鍵的顯示碼送到最低位,如此一來便實(shí)現(xiàn)了lcd的移位。當(dāng)依次輸入5,1,7時(shí)顯示效果如圖所示:顯示數(shù)字“”顯示數(shù)字“”顯示數(shù)字“”3.6電路設(shè)計(jì)效果運(yùn)行proteus程序后,進(jìn)入軟件的主界面。通過左側(cè)工具欄中的p(從庫(kù)中選擇元件命令)命令,在pick devices 左側(cè)窗口中選擇所需元件的關(guān)鍵字,然后放置元件并調(diào)整方向和位置以及參數(shù)設(shè)置,最后進(jìn)行連線。proteus仿真效果載入通過編譯軟件編譯后的hex文件進(jìn)行模擬仿真,可以全速運(yùn)行也可以單步調(diào)試運(yùn)行。模擬加法:123+456=579如圖所示:輸入數(shù)字“”輸入數(shù)字“”得出結(jié)果“”模擬減法:654-321=333如圖所示:輸入數(shù)字“”輸入數(shù)字“”得出結(jié)果“”模擬乘法:123*4567561741如圖所示:輸入數(shù)字“”輸入數(shù)字“”得出結(jié)果“”模擬除法:05如圖所示:輸入數(shù)字“”輸入數(shù)字“”得出結(jié)果“” 設(shè)計(jì)總結(jié)設(shè)計(jì)這個(gè)課題時(shí)其實(shí)對(duì)我來說是有不小難度的,畢竟我所學(xué)習(xí)的單片機(jī)知識(shí)是

溫馨提示

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

評(píng)論

0/150

提交評(píng)論