基于單片機(jī)的多功能計(jì)算器設(shè)計(jì)_第1頁(yè)
基于單片機(jī)的多功能計(jì)算器設(shè)計(jì)_第2頁(yè)
基于單片機(jī)的多功能計(jì)算器設(shè)計(jì)_第3頁(yè)
基于單片機(jī)的多功能計(jì)算器設(shè)計(jì)_第4頁(yè)
基于單片機(jī)的多功能計(jì)算器設(shè)計(jì)_第5頁(yè)
已閱讀5頁(yè),還剩15頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、工程設(shè)計(jì)訓(xùn)練設(shè)計(jì)報(bào)告 工程設(shè)計(jì)訓(xùn)練設(shè)計(jì)報(bào)告課題名稱 基于單片機(jī)的多功能計(jì)算器設(shè)計(jì) 院系 物理與電子工程學(xué)院 年 級(jí) 專 業(yè) 電子信息工程 班 級(jí) 學(xué) 號(hào) 學(xué)生姓名 任課教師 吳正陽(yáng) 設(shè)計(jì)時(shí)間 TOC o 1-3 h u 目錄 HYPERLINK l _Toc21541 第一章 概述 HYPERLINK l _Toc12359 第二章 硬件設(shè)計(jì)方案 HYPERLINK l _Toc13311 第三章 程序設(shè)計(jì) HYPERLINK l _Toc18490 第四章 軟件仿真調(diào)試 HYPERLINK l _Toc9815 心得體會(huì)參考文獻(xiàn) 附錄工程設(shè)計(jì)訓(xùn)練基于單片機(jī)的多功能計(jì)算器設(shè)計(jì)任務(wù)書(shū)一、設(shè)計(jì)課題

2、:基于單片機(jī)的多功能計(jì)算器設(shè)計(jì)二、設(shè)計(jì)目的:運(yùn)用已學(xué)課程的基本知識(shí),在設(shè)計(jì)中加以應(yīng)用,進(jìn)而得到理解、鞏固和提高發(fā)展,通過(guò)實(shí)踐的過(guò)程學(xué)習(xí)掌握分析與解決實(shí)際問(wèn)題的方法與手段,提高設(shè)計(jì)、編程與調(diào)試的實(shí)際動(dòng)手能力,作為工程技術(shù)工作的一次基本訓(xùn)練。三、設(shè)計(jì)任務(wù):使用AT89C51單片機(jī)設(shè)計(jì)一個(gè)多功能計(jì)算器,主要用到矩陣鍵盤(pán),LCD液晶顯示器。要求進(jìn)行硬件、軟件系統(tǒng)設(shè)計(jì)。四、主要任務(wù):1、在多功能計(jì)算器上能夠顯示所輸入的表達(dá)式,例如:(20+10)/102、在設(shè)計(jì)中,能進(jìn)行加減乘除及優(yōu)先級(jí)運(yùn)算,例如:2+6*2,并且有清除功能用C表示。3、能夠計(jì)算的最大數(shù)字位數(shù)是兩位。4、程序設(shè)計(jì)完過(guò)后,進(jìn)行電路設(shè)計(jì)。用

3、protues軟件進(jìn)行仿真。二,具體內(nèi)容I-硬件設(shè)計(jì) 單片機(jī)用AT89C51,4*4矩陣鍵盤(pán),顯示用LCD1602,上拉電阻,74HC21與門和一些外設(shè)設(shè)備(晶振,電容)設(shè)置1AT89C51單片機(jī)2-計(jì)算器的鍵盤(pán)布局:計(jì)算器有16個(gè)鍵(0,1,2,3,4,5,6,7,8,9,/,*,+,-,=,ON/AC)組成,在單片機(jī)中正好有一個(gè)端口實(shí)現(xiàn)16個(gè)按鍵功能,這種形式在單片機(jī)系統(tǒng)中最常用是矩陣鍵盤(pán)。矩陣式結(jié)構(gòu)的鍵盤(pán)識(shí)別要復(fù)雜一些,列線通過(guò)電阻接正電源,并將行線所接的單片機(jī)的I/O口作為輸出端,而列線所接的I/O口則作為輸入。這樣,當(dāng)按鍵沒(méi)有按下時(shí),所有的輸入端都是高電平,代表無(wú)鍵按下。行線輸出是低

4、電平,一旦有鍵按下,則輸入線就會(huì)被拉低,這樣,通過(guò)讀入輸入線的狀態(tài)就可得知是否有鍵按下了。在 HYPERLINK /emb/danpianji/20111025226489.html 矩陣式鍵盤(pán)中,每條水平線和垂直線在交叉處不直接連通,而是通過(guò)一個(gè)按鍵加以連接。這樣,一個(gè)端口(如P1口)就可以構(gòu)成4*4=16個(gè)按鍵,比之直接將端口線用于鍵盤(pán)多出了一倍,而且線數(shù)越多,區(qū)別越明顯,比如再多加一條線就可以構(gòu)成20鍵的鍵盤(pán),而直接用端口線則只能多出一鍵(9鍵)。由此可見(jiàn),在需要的鍵數(shù)比較多時(shí),采用矩陣法來(lái)做鍵盤(pán)是合理的。確定矩陣式鍵盤(pán)上何鍵被按下介紹一種“行掃描法”。行掃描法 行掃描法又稱為逐行(或列

5、)掃描查詢法,是一種最常用的按鍵識(shí)別方法,如上圖所示鍵盤(pán),介紹過(guò)程如下。1、判斷鍵盤(pán)中有無(wú)鍵按下 將全部行線Y0-Y3置低電平,然后檢測(cè)列線的狀態(tài)。只要有一列的電平為低,則表示鍵盤(pán)中有鍵被按下,而且閉合的鍵位于低電平線與4根行線相交叉的4個(gè)按鍵之中。若所有列線均為高電平,則鍵盤(pán)中無(wú)鍵按下。2、判斷閉合鍵所在的位置 在確認(rèn)有鍵按下后,即可進(jìn)入確定具體閉合鍵的過(guò)程。其方法是:依次將行線置為低電平,即在置某根行線為低電平時(shí),其它線為高電平。在確定某根行線位置為低電平后,再逐行檢測(cè)各列線的電平狀態(tài)。若某列為低,則該列線與置為低電平的行線交叉處的按鍵就是閉合的按鍵。確定矩陣式鍵盤(pán)上何鍵被按下介紹一種“高

6、低電平翻轉(zhuǎn)法”。首先讓P1口高四位為1,低四位為0,。若有按鍵按下,則高四位中會(huì)有一個(gè)1翻轉(zhuǎn)為0,低四位不會(huì)變,此時(shí)即可確定被按下的鍵的行位置。然后讓P1口高四位為0,低四位為1,。若有按鍵按下,則低四位中會(huì)有一個(gè)1翻轉(zhuǎn)為0,高四位不會(huì)變,此時(shí)即可確定被按下的鍵的列位置。最后將上述兩者進(jìn)行或運(yùn)算即可確定被按下的鍵的位置。本設(shè)計(jì)用第一種“行掃描法”。鍵盤(pán)與單片機(jī)接口是P10=R1,P11=R2, P12=R3, P13=R4. P14=L1,P15=L2, P16=L3, P17=L43-74HC21與門接線圖 4-上拉電阻作用是驅(qū)動(dòng)LCD16025LCD1602顯示模塊本設(shè)計(jì)采用LCD液晶顯示

7、器來(lái)顯示輸出數(shù)據(jù)。LCD的特性有:1、+5V電壓,對(duì)比可調(diào)度;2、內(nèi)含復(fù)位電路;3、提供各種控制命令,如:清屏、字符閃爍、光標(biāo)閃爍、顯示移位等多種功能;4、有80字節(jié)顯示數(shù)據(jù)存儲(chǔ)器DDRAM;5、內(nèi)建有160個(gè)5X7點(diǎn)陣的字型的字符發(fā)生器CGROM;6、8個(gè)可由用戶自定義的5X7的字符發(fā)生器CGRAM。本設(shè)計(jì)通過(guò)D0-D7引腳向LCD寫(xiě)指令字或?qū)憯?shù)據(jù)以使LCD實(shí)現(xiàn)不同的功能或顯示相應(yīng)的數(shù)據(jù)。接口電路如下:II-軟件設(shè)計(jì)輸入數(shù)據(jù)和表達(dá)式并顯示表達(dá)式。判斷輸入是否正確,如果輸入錯(cuò)誤顯示”ERROR”,如果輸入正確就進(jìn)行分辨符號(hào)“*”,“/”,“+”,“-”然后按這樣順序(乘,除,加,減)進(jìn)行運(yùn)算

8、仿真用Keil Uvision2軟件和Proteus 7軟件仿真結(jié)果#include /#include#define uint signed int #define uchar unsigned char#define fuhao_1 -1/除符號(hào)#define fuhao_2 -2/乘符號(hào)#define fuhao_3 -3/減符號(hào)#define fuhao_4 -4/加符號(hào)sbit lcden=P35; /定義引腳 E 使能sbit rs=P37;sbit rw=P36;sbit busy=P07;sbit p33=P33;float arry20;int arry_1=0 x52,0

9、x4f,0 x52,0 x52,0 x45; /ERRORlong c; /結(jié)果long q; / 結(jié)果的絕對(duì)數(shù)uchar error; /錯(cuò)誤標(biāo)志uchar m; /輸入新表達(dá)式的標(biāo)志uchar ok_flag; /輸入完畢的標(biāo)志uchar fuhao;/符號(hào)標(biāo)志void delay(uchar z) / 延遲函數(shù)uchar y; for(z;z0;z-) for(y=0;y110;y+);/* 判斷忙或空閑*/void check() do P0=0 xFF; rs=0; rw=1; /讀 rs rw 值為01時(shí),忙標(biāo)志和地址計(jì)數(shù)器讀出 lcden=0; /E=0,禁止讀寫(xiě) delay(1

10、); /等待,液晶顯示器處理數(shù)據(jù) lcden=1; /E=1,允許讀寫(xiě) while(busy=1); /判斷是否為空閑,1為忙,0為空閑/* 寫(xiě)指令函數(shù)*/void write_com(uchar com) P0=com; /com指令付給P0口 rs=0; rw=0; lcden=0; check(); lcden=1;/*寫(xiě)數(shù)據(jù)函數(shù)*/void write_date(uchar date) P0=date; rs=1; rw=0; lcden=0; check(); lcden=1;void init() /初始化 uchar i; lcden=1; /使能信號(hào)為高電平 write_com

11、(0 x38); /功能設(shè)置命令:8位,2行 DDRAM的地址 write_com(0 x0e); /顯示開(kāi),光標(biāo)開(kāi),不閃爍 write_com(0 x06); /地址計(jì)數(shù)器加1模式,顯示屏不移位 write_com(0 x80); /設(shè)置訪問(wèn)地址 for(i=0;i20;i+) arryi=0; error=0; ok_flag=0; c=0; q=0; /結(jié)果 fuhao=0; / fuhao表征按下的是哪個(gè)符號(hào)/*鍵盤(pán)掃描程序*/void keyscan(void)/ 鍵盤(pán)掃描程序uchar temp,i,num;void int0(); if (m=1) /輸入新表達(dá)式 write_c

12、om(0 x01); /清屏命令 for(i=0;i20;i+) arryi=0;m=0;ok_flag=0;fuhao=0; P1=0 xfe; if(P1!=0 xfe)/第1行有鍵按下 delay(20);/20ms if(P1!=0 xfe) /第1行確實(shí)有鍵按下 temp=P1&0 xf0; switch(temp) case 0 xe0:num=0; /確定按鍵為第1行第1列,置標(biāo)示符num break; case 0 xd0:num=1; break; case 0 xb0:num=2; break; case 0 x70:num=3; break; while(P1!=0 xf

13、e); if(num=0) arry2*fuhao=10*(arry2*fuhao)+7;write_date(0 x30+7); /第1行第1列鍵值7,存在數(shù)組arry if(num=1) arry2*fuhao=10*(arry2*fuhao)+8;write_date(0 x30+8); if(num=2) arry2*fuhao=10*(arry2*fuhao)+9;write_date(0 x30+9); if(num=3) arry2*fuhao+1=fuhao_1;fuhao+;write_date(0 x2f); /第1行第4列鍵值/,存在數(shù)組arry P1=0 xfd; if

14、(P1!=0 xfd) /第2行有鍵按下 delay(20); if(P1!=0 xfd)/第2行確實(shí)有鍵按下 temp=P1&0 xf0; switch(temp) case 0 xe0:num=4; /確定按鍵為第2行第1列, 置標(biāo)示符num break; case 0 xd0:num=5; break; case 0 xb0:num=6; break; case 0 x70:num=7; break; while(P1!=0 xfd); if(num=4) arry2*fuhao=10*(arry2*fuhao)+4;write_date(0 x30+4); /第2行第1列鍵值為4,存在

15、數(shù)組arry if(num=5) arry2*fuhao=10*(arry2*fuhao)+5;write_date(0 x30+5); if(num=6) arry2*fuhao=10*(arry2*fuhao)+6;write_date(0 x30+6); if(num=7) arry2*fuhao+1=fuhao_2;fuhao+;write_date(0 x2a); /第2行第4列鍵值為*,存在數(shù)組arry P1=0 xfb;/第3行有鍵按下if(P1!=0 xfb)delay(20);if(P1!=0 xfb) /第3行確實(shí)有鍵按下temp=P1&0 xf0;switch(temp)

16、case 0 xe0:num=8; /確定按鍵為第3行第1列,置標(biāo)示符numbreak;case 0 xd0:num=9;break;case 0 xb0:num=10;break;case 0 x70:num=11;break;while(P1!=0 xfb);if(num=8) arry2*fuhao=10*(arry2*fuhao)+1;write_date(0 x30+1); /第3行第1列鍵值為1,存在數(shù)組arryif(num=9) arry2*fuhao=10*(arry2*fuhao)+2;write_date(0 x30+2);if(num=10) arry2*fuhao=10

17、*(arry2*fuhao)+3;write_date(0 x30+3);if(num=11) arry2*fuhao+1=fuhao_3;fuhao+;write_date(0 x2d); /第3行第4列鍵值為-,存在數(shù)組arryP1=0 xf7;if(P1!=0 xf7)delay(20);if(P1!=0 xf7)temp=P1&0 xf0;switch(temp)case 0 xe0:num=12;break;case 0 xd0:num=13;break;case 0 xb0:num=14;break;case 0 x70:num=15;break;while(P1!=0 xf7);

18、if (num=12) /第4行第1列ON/C鍵,清屏 write_com(0 x01); for(i=0;i20;i+) arryi=0; fuhao=0; ok_flag=0; if(num=13) arry2*fuhao=10*(arry2*fuhao);write_date(0 x30); /第4行第2列鍵值為0,存在數(shù)組arryif(num=14) ok_flag=1;m=1; / 第4行第3列j鍵值=,輸入完畢,輸入新表達(dá)式if(num=15) arry2*fuhao+1=fuhao_4;fuhao+;write_date(0 x2b); / /第2行第4列鍵值為*,存在數(shù)組arr

19、yP1=0 xf0; /置第一行全部按下 /*條件運(yùn)算條件*/void stop(void)uchar k,h; h=2*fuhao; for (k=0;k=h;k+) if(arryk)0) if(arryk+1)=0) if(arryk+20) error=1;if (arryk=fuhao_1) if(arryk+1=0) error=1; /*運(yùn)算*/void process(void) uchar h,k,i,j; for(k=0;k=(2*fuhao);k+) if (arryk=fuhao_2) /乘符號(hào)/ j=k-1;h=2*fuhao-2;arryj=arryj*arryj+

20、2;for(i=(j+1);i=h;i+)arryi=arryi+2;fuhao=fuhao-1;k=k-1; for(k=0;k=(2*fuhao);k+) if (arryk=fuhao_1) /除符號(hào)/ j=k-1;h=2*fuhao-2;arryj=arryj/arryj+2;for(i=(j+1);i=h;i+) arryi=arryi+2;fuhao=fuhao-1;k=k-1; h=fuhao; for(k=1;k=h;k+) if(arry1=fuhao_3) /減符號(hào)/ arry0=arry0-arry2; fuhao=fuhao-1; for(i=1;i=(2*fuhao);i+) arryi=arryi+2; else if(arry1=fuhao_4) /加符號(hào)/ arry0=arry0+arry2; fuhao=fuhao-1; for(i=1;i=(2*fuhao);i+) arryi=arryi+2; /*顯示運(yùn)算結(jié)果*/if(fuhao=0)c=arry0; /小位數(shù)取三位/ write_com(0 x80+0 x4f); /按下等于鍵,光標(biāo)前進(jìn)至第二行最后一個(gè)顯示處/ write_com(0 x04); /設(shè)置從后住前寫(xiě)數(shù)據(jù)每寫(xiě)

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝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ù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 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)論