單片機計算器(重理工大二課程設(shè)計)計算范圍_第1頁
單片機計算器(重理工大二課程設(shè)計)計算范圍_第2頁
單片機計算器(重理工大二課程設(shè)計)計算范圍_第3頁
單片機計算器(重理工大二課程設(shè)計)計算范圍_第4頁
單片機計算器(重理工大二課程設(shè)計)計算范圍_第5頁
已閱讀5頁,還剩9頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

本文格式為Word版,下載可任意編輯——單片機計算器(重理工大二課程設(shè)計)計算范圍

課程:電子綜合設(shè)計試驗

項目:計算器

學期:2023.2~2023.7

學院:電子信息與自動化學院專業(yè):自動化班級:713姓名:王瀚興學號:10807010325指導教師:陳古波

電工電子技術(shù)試驗中心

一、設(shè)計任務(wù)和目標

1.1設(shè)計任務(wù)

利用單片機設(shè)計一個計算器,要求

(1)鍵盤包含加、減、乘、除及數(shù)字鍵。

(2)能夠顯示輸入數(shù)字并顯示公式,計算結(jié)果。(3)四種運算都可以實現(xiàn)。

1.2性能指標

(1)單片機程序設(shè)計使用KeilC51實現(xiàn)。編譯器使用longint,因此運算范圍為±2147483648,并且浮點數(shù)精度總是15位。假使數(shù)據(jù)溢出,自動提醒溢出錯誤信息。

(2)可運算加、減、乘、除在內(nèi)的四種運算。包括顯示正數(shù)與負數(shù)。除零錯誤將自動提醒。顯示公式。

(3)ON鍵用于清空并重新輸入。

二、設(shè)計方案

依照單片機設(shè)計功能的要求,初步確定硬件系統(tǒng)由主控模塊,顯示模塊,鍵掃描電路模塊等組成。電路構(gòu)成框圖如圖2-1所示。主控芯片使用51系列AT89C52單片機,該單片機采用高性能靜態(tài)89C51設(shè)計,由先進工藝制造,并帶有非易失性Flash程序存儲器。它是一種高性能,低功耗8位CMOS處理芯片,市場應(yīng)用好多。

圖2-1計算器電路構(gòu)成原理圖

軟件系統(tǒng)由鍵盤掃描模塊、數(shù)據(jù)計算模塊、數(shù)據(jù)糾錯模塊、數(shù)據(jù)顯示模塊等構(gòu)成。

三、系統(tǒng)硬件設(shè)計

3.1單片機最小系統(tǒng)

單片機最小系統(tǒng)就是支持主芯片正常工作的最小部分,包括主控芯片和晶振電路部分。

主控芯片選取STC89C52RC芯片,因其具有良好的性能和穩(wěn)定性,價格低廉使用便利。晶振選用1MHZ,晶振旁電容選用1pf。下面是單片機最小系統(tǒng)的電路圖:

圖3-1單片機最小系統(tǒng)電路圖

3.2鍵盤接口電路

計算器所需按鍵有數(shù)字鍵:“0〞、“1〞、“2〞、“3〞、“4〞、“5〞、“6〞、“7〞、“8〞、“9〞。功能鍵:“+〞、“-〞、“×〞、“÷〞、“=〞、“ON(清零)〞。

共計16個按鍵,行列均連接有公共端,連接至單片機的P3.0—P3.7端口。這樣掃描P3口就可以完成對所有鍵盤的掃描,通過對16個按鍵的編碼,從而得到鍵盤端口地址。分別進行行掃描和列掃描,確定按鍵,經(jīng)過單片機處理后輸入數(shù)據(jù)至LED顯示屏,完成了鍵盤的功能。

下面為鍵盤接口電路圖。

圖3-2鍵盤接口電路

3.3數(shù)碼顯示電路

數(shù)碼顯示電路采用的是LM016L顯示器?;緟?shù)及引腳功能

1602LCD分為帶背光和不帶背光兩種,基控制器大部分為HD44780,帶背光的比不帶背光的厚,是否帶背光在應(yīng)用中并無區(qū)別,兩者尺寸區(qū)別如下圖10-54所示:

1602LCD尺寸圖

1602LCD主要技術(shù)參數(shù):顯示容量:16×2個字符芯片工作電壓:4.5—5.5V工作電流:2.0mA(5.0V)模塊最正確工作電壓:5.0V字符尺寸:2.95×4.35(W×H)引腳功能說明

1602LCD采用標準的14腳(無背光)或16腳(帶背光)接口,各引腳接口說明如表10-13所示:

編符引腳說明編符引腳說明號號號號

1V9D2電源地數(shù)據(jù)

SS2V10D3電源正極數(shù)據(jù)

DD3V11D4液晶顯示偏壓數(shù)據(jù)

L4RS12D5數(shù)據(jù)/命令選擇數(shù)據(jù)5R/13D6讀/寫選擇數(shù)據(jù)

W6E14D7使能信號數(shù)據(jù)7D015BL背光源正極數(shù)據(jù)

A

8D116BL背光源負極數(shù)據(jù)

K

表10-13:引腳接口說明表第1腳:VSS為地電源。

第2腳:VDD接5V正電源。

第3腳:VL為液晶顯示器對比度調(diào)整端,接正電源時對比度最弱,接地時對比度最高,對比度過高時會產(chǎn)生“鬼影〞,使用時可以通過一個10K的電位器調(diào)整對比度。

第4腳:RS為寄放器選擇,高電平日選擇數(shù)據(jù)寄放器、低電平日選擇指令寄放器。第5腳:R/W為讀寫信號線,高電平日進行讀操作,低電平日進行寫操作。當RS和R/W共同為低電平日可以寫入指令或者顯示地址,當RS為低電平R/W為高電平日可以讀忙信號,當RS為高電平R/W為低電平日可以寫入數(shù)據(jù)。

第6腳:E端為使能端,當E端由高電平跳變成低電平日,液晶模塊執(zhí)行命令。第7~14腳:D0~D7為8位雙向數(shù)據(jù)線。第15腳:背光源正極。第16腳:背光源負極。2LCD的指令說明及時序

1602液晶模塊內(nèi)部的控制器共有11條控制指令,如表10-14所示:

RRDDDDDD序指令

D0

S/W7654321號

1000000001清顯示200000001*光標返回

I/置輸入模

30000000S

D式

顯示開/關(guān)

40000001CB

控制光標或字

S

5000001/**符移位

/C

L

D置功能

600001N**

L

置字符發(fā)字符發(fā)生存貯器地址

70001

生存貯器地址

置數(shù)據(jù)存顯示數(shù)據(jù)存貯器地址

8001

貯器地址

B讀忙標志計數(shù)器地址

901

F或地址

寫數(shù)到要寫的數(shù)據(jù)內(nèi)容

1

10CGRAM或

0

DDRAM)

從讀出的數(shù)據(jù)內(nèi)容

1

11CGRAM或

1

DDRAM讀數(shù)表10-14:控制命令表

1602液晶模塊的讀寫操作、屏幕和光標的操作都是通過指令編程來實現(xiàn)的。(說明:1為高電平、0為低電平)

圖字符代碼與圖形對應(yīng)表下面為數(shù)碼顯示電路電路圖。

圖3-3數(shù)碼顯示電路

四、系統(tǒng)軟件設(shè)計

4.1鍵盤掃描程序設(shè)計

要進行數(shù)據(jù)計算就需要先進行數(shù)據(jù)的輸入,也就必需確定按鍵輸入的數(shù)值是什么,這就需要對按鍵進行掃描,從而確定是哪個按鍵按下了。

按鍵掃描的程序代碼十分明了易懂,并且寫好了解釋。下面是源代碼。

//按鍵處理命令//獲取按鍵位置//16為無按鍵按下ucharKeyPosRowScan()//返回行掃描結(jié)果

{

ucharTemp=0;//掃描狀態(tài)暫存。ucharRow;//行號P3=0x0f;

Temp=P3;//暫存P2狀態(tài)for(Row=0;Row9999||Data[3]

}}}

return7;

4-4程序顯示功能設(shè)計。

LM016L顯示器需要初始化,寫端口等操作。voidWaitCheck()//等待空閑{

do{

P0=0xFF;

RS=0;//選擇指令寄放器

RW=1;//讀rsrw值為01時,忙標志和地址計數(shù)器讀出EN=0;//E=0,阻止讀寫

Delay(1);//等待,液晶顯示器處理數(shù)據(jù)EN=1;//E=1,允許讀寫

}while(BUSY==1);//判斷是否為空閑,1為忙,0為空閑}

voidWriteCom(ucharcom)//寫指令{

P0=com;RS=0;RW=0;EN=0;

WaitCheck();EN=1;}

然后需要進行初始化voidInit()//初始化{

EN=1;//使能信號為高電平WriteCom(0x38);//顯示模式設(shè)置

WriteCom(0x0e);//顯示開,光標開,不閃爍WriteCom(0x06);//光標右移文字移動無效WriteCom(0x80);//設(shè)置訪問地址}

初始化完成后我寫了幾個基本的命令,用來擴展對LCD屏幕更簡單的顯示。//設(shè)置命令

voidSetLine1Pos(ucharpos)//設(shè)置光標位置{

WriteCom(0x80|pos);}

voidSetLine2Pos(ucharpos)//設(shè)置光標位置

{

WriteCom(0xC0|pos);}

voidSetCursorStyle(ucharstyle)//0光標左移1光標右移{

if(style)WriteCom(0x04);//光標左移elseWriteCom(0x06);//光標右移}

//運算命令

uintAbs(intnumber){

if(number32767||number9999)bitnum=10000;elseif(number>999)bitnum=1000;elseif(number>99)bitnum=100;elseif(number>9)bitnum=10;elseif(number>=0)bitnum=1;//SetCursorStyle(1);

if(minusflag)ShowChar(0x2d);//顯示負號while(bitnum>0){

bitbuf=number/bitnum;ShowBitNum(bitbuf);

number-=(bitbuf*bitnum);bitnum/=10;}}

voidShowFormula()//顯示公式命令,用來顯示公式{

SetLine1Pos(0);

ShowNumber(Data[0]);switch(Data[1]){

case10:ShowChar('+');break;case11:ShowChar('-');break;case12:ShowChar('*');break;case13:ShowChar('/');break;}

ShowNumber(Data[2]);ShowChar('=');SetLine2Pos(0);

ShowStr(\ShowNumber(Data[3]);

}

if((Data[1]==13)}

4.4主程序設(shè)計

下面為主程序

主程序既把各個功能串聯(lián)一起,又能夠進行循環(huán)執(zhí)行。

首先進行LCD的初始化,再進行歡迎詞,在進行鍵盤掃描,根據(jù)ShowFlag變量的值進行顯示錯誤提醒或者顯示結(jié)果或者顯示數(shù)值等。

voidmain(){

Init();

while(Welcome(10));while(1){

if(KeyPosScan()==12){

DataInit();

if(ShowFlag<3)ShowFlag=InputChar(//勿影響顯示

if(ShowFlag<3)ShowFlag=InputChar(//結(jié)果和錯誤

}

RegisterShowFlag();}}

還有部分代碼未貼出,整體程序清單見附錄。

五、調(diào)試及分析1調(diào)試分析

做好器件后先不要把芯片插在芯片板上,先驗證電源是否好用,有無短路等狀況,接上低電源測試各個點無誤后方可插上芯片。

芯片插好后進行測試各個硬件模塊是否能夠完成功能,包括按鍵是否好用,顯示是否正常等。

2性能分析

(1)單片機程序設(shè)計由于使用的是KeilC51。為擴大運算范圍,使用longint范圍。假如數(shù)據(jù)溢出,自動提醒溢出錯誤信息。

(2)可運算加、減、乘、除在內(nèi)的四種運算。包括顯示正數(shù)與負數(shù)。除零錯誤將自動提醒等信息。

(3)可以顯示運算的公式。

六、心得體會

通過本次課程設(shè)計我真正的完成了自己設(shè)計計算器的目標,了解了從設(shè)計硬件,電路設(shè)計,電路板設(shè)計,軟件設(shè)計,成品調(diào)試等各方面的過程,從而從整體學到了多方面的知識,為以后工作打下了一定的基本基礎(chǔ)。

另外從本次試驗中我也發(fā)現(xiàn)了自己有好多的不足,對知識了解的可能仍不夠扎實,做事不夠穩(wěn)定等。相信同樣的問題以后能夠很好的解決,并能夠把單片機做的更好。

七、

程序源代碼

#include#include

#defineuintunsignedint#defineucharunsignedchar

sbitEN=P2^2;//定義引腳sbitRS=P2^0;sbitRW=P2^1;sbitBUSY=P0^7;sbitP13=P1^3;//鍵盤數(shù)據(jù)

ucharLineScan[4]={0xE0,0xD0,0xB0,0x70};//列線掃描電壓,分為第1,2,3,4根列線ucharRowScan[4]={0x0E,0x0D,0x0B,0x07};//行線掃描電壓,分為第1,2,3,4根行線//計算類定義

ucharShowFlag=9;//0顯示Data[0]1正常允許進行下一步2顯示Data[2]3顯示Data[3]4顯示溢出錯誤5顯示除零錯誤6顯示錯誤7初始化程序8操作錯誤9提醒按初始化

鍵99無法預計錯誤

ucharDivFloatFlag=0;//是否顯示除法所得的float數(shù)據(jù)//該變量設(shè)置取消ucharDivFloatData[15]={0};ucharFloatShowNum=0;

longintData[4]={0,10,0,0};//記錄運算數(shù)據(jù)及結(jié)果//系統(tǒng)端口操作函數(shù)voidDelay(uinto){uinti,j;for(i=0;i2147483647||number=0;bitbuf--){ShowBitNum(idnumbuf[bitbuf]);}return0;}

voidShowFormula(){SetLine1Pos(0);ShowNumber(Data[0]);switch(Data[1]){case10:ShowChar('+');break;case11:ShowChar('-');break;case12:ShowChar('*');break;case13:ShowChar('/');break;

}ShowNumber(Data[2]);ShowChar('=');SetLine2Pos(0);ShowNumber(Data[3]);if(Data[1]==13){ShowChar('.');for(FloatShowNum=0;FloatShowNumucharKeyPosScan()//返回按鍵位置{returnKeyPosRowScan()*4+KeyPosLineScan();}

//返回指定位置按鍵的鍵值

ucharGetPosKeyID(ucharkeypos){switch(keypos)

溫馨提示

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

評論

0/150

提交評論