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

下載本文檔

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

文檔簡介

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

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

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

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

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

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

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

8、仿真用Keil Uvision2軟件和Proteus 7軟件仿真結(jié)果#include /#include#define uint signed int #define uchar unsigned char#define fuhao_1 -1/除符號#define fuhao_2 -2/乘符號#define fuhao_3 -3/減符號#define fuhao_4 -4/加符號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é)果的絕對數(shù)uchar error; /錯誤標(biāo)志uchar m; /輸入新表達(dá)式的標(biāo)志uchar ok_flag; /輸入完畢的標(biāo)志uchar fuhao;/符號標(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時,忙標(biāo)志和地址計數(shù)器讀出 lcden=0; /E=0,禁止讀寫 delay(1

10、); /等待,液晶顯示器處理數(shù)據(jù) lcden=1; /E=1,允許讀寫 while(busy=1); /判斷是否為空閑,1為忙,0為空閑/* 寫指令函數(shù)*/void write_com(uchar com) P0=com; /com指令付給P0口 rs=0; rw=0; lcden=0; check(); lcden=1;/*寫數(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; /使能信號為高電平 write_com

11、(0 x38); /功能設(shè)置命令:8位,2行 DDRAM的地址 write_com(0 x0e); /顯示開,光標(biāo)開,不閃爍 write_com(0 x06); /地址計數(shù)器加1模式,顯示屏不移位 write_com(0 x80); /設(shè)置訪問地址 for(i=0;i20;i+) arryi=0; error=0; ok_flag=0; c=0; q=0; /結(jié)果 fuhao=0; / fuhao表征按下的是哪個符號/*鍵盤掃描程序*/void keyscan(void)/ 鍵盤掃描程序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行確實有鍵按下 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行確實有鍵按下 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行確實有鍵按下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; /置第一行全部按下 /*條件運算條件*/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; /*運算*/void process(void) uchar h,k,i,j; for(k=0;k=(2*fuhao);k+) if (arryk=fuhao_2) /乘符號/ 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) /除符號/ 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) /減符號/ arry0=arry0-arry2; fuhao=fuhao-1; for(i=1;i=(2*fuhao);i+) arryi=arryi+2; else if(arry1=fuhao_4) /加符號/ arry0=arry0+arry2; fuhao=fuhao-1; for(i=1;i=(2*fuhao);i+) arryi=arryi+2; /*顯示運算結(jié)果*/if(fuhao=0)c=arry0; /小位數(shù)取三位/ write_com(0 x80+0 x4f); /按下等于鍵,光標(biāo)前進(jìn)至第二行最后一個顯示處/ write_com(0 x04); /設(shè)置從后住前寫數(shù)據(jù)每寫

溫馨提示

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

最新文檔

評論

0/150

提交評論