單片機課程設計 題目: 簡易計算器的設計
院 系:信息工程學院 班 級: 自動化1班 姓 名:黃浩 學 號: 2010550123 指導教師:張瑩
目錄
1 設計說明.... 1 1.1 設計內(nèi)容.... 1 1.2 設計要求.... 1 1.3設備及工作環(huán)境.... 1 2 硬件方案.... 1 2.1 設計思路.... 1 2.2 原理電路圖.... 2 2.3 主要元件功能說明.... 2 2.4 硬件工作原理闡述.... 7 3 軟件方案.... 8 3.1 分析論證.... 8 3.2 程序流程圖.... 9 3.3 程序清單.... 10 4 調(diào)試過程及結果分析..... 16 5 設計總結..... 16 參考文獻..... 16
1.設計說明
1.1設計內(nèi)容
本次的設計是利用單片機設計簡單的計算器,本設計利用單片機的I/O接口設計2×4鍵盤,8個鍵依次對應0~3、“+”、“-”、“=”和清除鍵。通過檢測不同數(shù)字鍵、功能鍵的按下,可以進行小于255的數(shù)的加減乘除運算,并可連續(xù)運算。當鍵入值大于255時,將自動清零,可以重新輸入。對應每一個數(shù)字鍵按下的同時,LED顯示按下鍵的值,并顯示最后的運算結果。
1.2設計要求
要求能實現(xiàn)小于255的數(shù)的加減運算,采用2×4鍵盤,8個鍵依次對應0~3、“+”、“-”、“=”和清除鍵。根據(jù)輸入鍵的按下實現(xiàn)不同的功能,最終結果通過LED顯示。
1.3設備及工作環(huán)境
8051單片機一片、七段四顯示數(shù)碼管一個、排阻一個、導線若干、12MHz晶振一個、30pF電容兩個
所有設備均工作在常溫下(0℃~70℃)
2.硬件方案
2.1設計思路
本設計利用單片機的I/O接口設計2×4鍵盤,兩行四列分別由單片機的P2.4\P2.5及P2.0-P2.3輸入輸出數(shù)據(jù)。采用P0口和P1.0-P1.3輸出數(shù)據(jù)到數(shù)碼管顯示由鍵盤輸入的數(shù)據(jù)及最終計算結果。
2.2原理電路圖
圖2.1 硬件電路圖
2.3主要元件功能說明
2.3.1單片機概述
單片機微型計算機是微型計算機的一個重要分支,也是頗具生命力的機種。單片機微型計算機簡稱單片機,特別適用于控制領域,故又稱為微控制器。
通常,單片機由單塊集成電路芯片構成,內(nèi)部包含有計算機的基本功能部件:中央處理器、存儲器和I/O接口電路等。因此,單片機只需要和適當?shù)能浖巴獠吭O備相結合,便可成為一個單片機控制系統(tǒng)。
單片機經(jīng)過1、2、3,3代的發(fā)展,目前單片機正朝著高性能和多品種方向發(fā)展,它們的CPU功能在增強,內(nèi)部資源在增多,引腳的多功能化,以及低電壓低功耗。
2.3.2芯片簡介
MSC-51芯片簡介:
8051單片機包含中央處理器、程序存儲器(ROM)、數(shù)據(jù)存儲器(RAM)、定時/計數(shù)器、并行接口、串行接口和中斷系統(tǒng)等幾大單元及數(shù)據(jù)總線、地址總線和控制總線等三大總線,現(xiàn)在我們分別加以說明:
中央處理器:
中央處理器(CPU)是整個單片機的核心部件,是8位數(shù)據(jù)寬度的處理器,能處理8位二進制數(shù)據(jù)或代碼,CPU負責控制、指揮和調(diào)度整個單元系統(tǒng)協(xié)調(diào)的工作,完成運算和控制輸入輸出功能等操作。
數(shù)據(jù)存儲器(RAM):
8051內(nèi)部有128個8位用戶數(shù)據(jù)存儲單元和128個專用寄存器單元,它們是統(tǒng)一編址的,專用寄存器只能用于存放控制指令數(shù)據(jù),用戶只能訪問,而不能用于存放用戶數(shù)據(jù),所以,用戶能使用的RAM只有128個,可存放讀寫的數(shù)據(jù),運算的中間結果或用戶定義的字型表。
定時/計數(shù)器(ROM)
8051有兩個16位的可編程定時/計數(shù)器,以實現(xiàn)定時或計數(shù)產(chǎn)生中斷用于控制程序轉(zhuǎn)向。
并行輸入輸出(I/O)口:
8051共有4組8位I/O口(P0、 P1、P2或P3),用于對外部數(shù)據(jù)的傳輸。
全雙工串行口:
8051內(nèi)置一個全雙工串行通信口,用于與其它設備間的串行數(shù)據(jù)傳送,該串行口既可以用作異步通信收發(fā)器,也可以當同步移位器使用。
中斷系統(tǒng):
8051具備較完善的中斷功能,有兩個外中斷、兩個定時/計數(shù)器中斷和一個串行中斷,可滿足不同的控制要求,并具有2級的優(yōu)先級別選擇。
時鐘電路:
8051內(nèi)置最高頻率達12MHz的時鐘電路,用于產(chǎn)生整個單片機運行的脈沖時序,但8051單片機需外置振蕩電容。
圖2.2 單片機結構圖
MCS-51的引腳說明:
MCS-51系列單片機中的8031、8051及8751均采用40Pin封裝的雙列直接DIP結構,下圖是它們的引腳配置,40個引腳中,正電源和地線兩根,外置石英振蕩器的時鐘線兩根,4組8位共32個I/O口,中斷口線與P3口線復用,F(xiàn)在我們對這些引腳的功能加以說明:如圖2.3
圖2.3單片機引腳圖
Pin9:RESET/Vpd復位信號復用腳,當8051通電,時鐘電路開始工作,在RESET引腳上出現(xiàn)24個時鐘周期以上的高電平,系統(tǒng)即初始復位。初始化后,程序計數(shù)器PC指向0000H,P0-P3輸出口全部為高電平,堆棧指針寫入07H,其它專用寄存器被清“0”。RESET由高電平下降為低電平后,系統(tǒng)即從0000H地址開始執(zhí)行程序。然而,初始復位不改變RAM(包括工作寄存器R0-R7)的狀態(tài),8051的初始態(tài)。
8051的復位方式可以是自動復位,也可以是手動復位,見圖2.4。此外,RESET/Vpd還是一復用腳,Vcc掉電其間,此腳可接上備用電源,以保證單片機內(nèi)部RAM的數(shù)據(jù)不丟失。
圖2.4單片機復位電路
Pin30:ALE/當訪問外部程序器時,ALE(地址鎖存)的輸出用于鎖存地址的低位字節(jié)。而訪問內(nèi)部程序存儲器時,ALE端將有一個1/6時鐘頻率的正脈沖信號,這個信號可以用于識別單片機是否工作,也可以當作一個時鐘向外輸出。更有一個特點,當訪問外部程序存儲器,ALE會跳過一個脈沖。
如果單片機是EPROM,在編程其間,將用于輸入編程脈沖。
Pin29:當訪問外部程序存儲器時,此腳輸出負脈沖選通信號,PC的16位地址數(shù)據(jù)將出現(xiàn)在P0和P2口上,外部程序存儲器則把指令數(shù)據(jù)放到P0口上,由CPU讀入并執(zhí)行。
Pin31:EA/Vpp程序存儲器的內(nèi)外部選通線,8051和8751單片機,內(nèi)置有4kB的程序存儲器,當EA為高電平并且程序地址小于4kB時,讀取內(nèi)部程序存儲器指令數(shù)據(jù),而超過4kB地址則讀取外部指令數(shù)據(jù)。如EA為低電平,則不管地址大小,一律讀取外部程序存儲器指令。顯然,對內(nèi)部無程序存儲器的8031,EA端必須接地。
在編程時,EA/Vpp腳還需加上21V的編程電壓。
2.3.3相關知識
數(shù)碼管顯示
在本任務中用4位數(shù)碼管顯示當前數(shù)值的千,百,十,個,由于數(shù)碼管個數(shù)多,如采用靜態(tài)顯示方式,則占用單片機的I/O口線太多,如果用定時器/計數(shù)器的串行移位寄存器工作方式及外接串入并出移位寄存器74LS164的方式,則電路復雜。所以,在數(shù)碼管個數(shù)較多時,常采用動態(tài)顯示方式。
如圖2.1所示為單片機應用系統(tǒng)中的一種數(shù)碼管動態(tài)顯示電路圖,4位數(shù)碼管的相同段并聯(lián)在一起,由一個8位I/O(P1口)輸出字形碼控制顯示某一字形,每個數(shù)碼管的公共端由另外一個I/O口(P0口)輸出的字位碼控制,即數(shù)碼管顯示的字形是由單片機I/O口輸出的字形碼確定,而哪個數(shù)碼管點亮是由單片機I/O口輸出的字位碼確定的。4個數(shù)碼管分時輪流循環(huán)點亮,在同一時刻只有1個數(shù)碼管點亮,但由于數(shù)碼管具有余輝特性及人眼具有視覺暫留特性,所以適當?shù)剡x取循環(huán)掃描頻率,看上去所有數(shù)碼管是同時點亮的,察覺不出閃爍現(xiàn)象。動態(tài)顯示方式所接數(shù)碼管不能太多,否則會因每個數(shù)碼管所分配的實際導通時間太少,使得數(shù)碼管的亮度不足。在本任務中,為了簡便,字形碼和字位碼都沒由加驅(qū)動電路,在實際應用中應加驅(qū)動電路。數(shù)碼管有共陰極和共陽極兩種,對于共陽數(shù)碼管,字形驅(qū)動輸出0有效,字位驅(qū)動輸出1有效;而對于共陰數(shù)碼管則相反,即:字形驅(qū)動輸出1有效,字位驅(qū)動輸出0有效。
矩陣按鍵
鍵盤是單片機系統(tǒng)中最常用的人機對話輸入設備,用戶通過鍵盤向單片機輸入數(shù)據(jù)或指令。鍵盤控制程序需完成的任務有:監(jiān)測是否有鍵按下,有鍵按下時,在無硬件去抖的動電路時,應用軟件延時方法消除按鍵抖動影響;當有多個鍵同時按下時,只處理一個按鍵,不管一次按鍵持續(xù)多長時間,僅執(zhí)行一次按鍵功能程序。
矩陣按鍵掃描程序是一種節(jié)省I/O口的方法,按鍵數(shù)目越多節(jié)省I/O口就越可觀,思路:先判斷某一列(行)是否有按鍵按下,再判斷該行(列)是那一只鍵按下。但是,在程序的寫法上,采用了最簡單的方法,使得程序效率最高。本程序中,如果檢測到某鍵按下了,就不再檢測其它的按鍵,這完全能滿足絕大多數(shù)需要,又能節(jié)省大量的CPU時間。
本鍵盤掃描程序的優(yōu)點在于:不用專門的按鍵延時程序,提高了CPU效率,也不用中斷來掃描鍵盤,節(jié)省了硬件資源。另外,本鍵盤掃描程序,每次掃描占用CPU時最短,不論有鍵按下或者無鍵按下都可以在很短的時間完成一次掃描。
2.4 硬件工作原理闡述
8051單片機的P2口作鍵盤口,其中P2.4-P2.5為鍵盤掃描輸出線,P2.0-P2.3為鍵盤掃描輸入線。鍵盤由2*4共8個按鍵組成,4個數(shù)字鍵(由0-3組成)3個運算符號(加減等于)組成,1個清除鍵(作用相當于整體復位)。4個數(shù)碼管用于顯示當前數(shù)值的千,百,十,個,采用動態(tài)顯示方式,P1口接4個數(shù)碼管的七段,P0口分別接4個數(shù)碼管的公共端,P1口輸出數(shù)碼管的字形碼,P0口輸出數(shù)碼管的字位碼。
3.軟件方案
3.1 分析論證
程序工作過程如下:
(1)首先賦予顯示緩沖初始值‘00 00’,并把數(shù)據(jù)存儲單元清零。
(2)主程序調(diào)用鍵盤掃描子程序,判斷鍵值,是數(shù)字第一次直接賦予23H單元,如是第二次輸入數(shù)字,則把第一次值乘十后與第二次值相加,結果存儲到23H單元,并R4計數(shù)2次,表示已輸入兩位,掃描鍵值時就不再賦值和顯示。等待運算符號的按下,按下等于號就直接計算并顯示,如加減就R5加一并把R4清零,表示可以輸入下一操作數(shù),與第一次相同,并等待等于鍵按下。清零鍵則不管在任何情況下都清零,相當于軟復位。
(3)在掃描完鍵盤后,調(diào)用數(shù)據(jù)顯示轉(zhuǎn)換子程序把值轉(zhuǎn)換為七段碼。
(4)調(diào)用數(shù)碼管動態(tài)顯示子程序,顯示數(shù)值,重新循環(huán)
3.2 程序流程圖
3.3 程序清單
3.3.1存儲單元分配
30H單元:數(shù)值個位顯示單元;31H單元:數(shù)值十位顯示單元;32H單元:數(shù)值百位顯示單元;33H單元:數(shù)值千位顯示單元;23H單元:第一操作數(shù)存儲單元;24H單元:第二操作數(shù)存儲單元;25H單元:鍵值暫存單元;27H單元:清除鍵狀態(tài);34H-37H單元:結果數(shù)據(jù)轉(zhuǎn)換暫存單元;38H-39H單元:結果高低8位暫存單元;R5單元:操作數(shù)計數(shù)單元;R4單元:操作數(shù)數(shù)值位數(shù)計數(shù)單元;R3單元:運算符號存儲單元。
3.3.2主程序設計
主程序進行程序中用到的一些存儲單元的初始化,數(shù)值顯示和2*4鍵盤掃描。首先,進行存儲單元初始化,給數(shù)碼管顯示單元30H-33H賦予“0000”字形數(shù)據(jù),將數(shù)值計數(shù)單元,存儲單元,賦予初值零。之后,調(diào)用鍵盤掃描子程序,和數(shù)碼管顯示數(shù)據(jù)轉(zhuǎn)換程序,數(shù)碼管動態(tài)顯示子程序。主程序不斷進行鍵盤掃描,數(shù)碼管顯示數(shù)據(jù)轉(zhuǎn)換子程序和動態(tài)顯示子程序。
3.3.3數(shù)碼管顯示數(shù)據(jù)轉(zhuǎn)換子程序CONV
由于數(shù)值單元存放的是二進制數(shù),而用戶熟悉的是十進制數(shù),所以應將數(shù)值單元中的二進制轉(zhuǎn)換為十進制數(shù),即BCD碼。要通過數(shù)碼管顯示出當前數(shù)值,還必須將BCD碼進一步轉(zhuǎn)換為七段碼,轉(zhuǎn)換的最終結果數(shù)據(jù)存放于顯示緩沖區(qū)30H-33H單元中,其中30H單元存放數(shù)值的個位七段碼,31H單元存放數(shù)值的十位七段碼,32H單元存放數(shù)值的百位七段碼,33H單元存放數(shù)值的千位七段碼。
3.3.4數(shù)碼管動態(tài)顯示子程序
本任務由P1口輸出字形碼,P0口輸出字位碼。先將存放于30H單元的數(shù)值個位七段碼由P1口輸出,同時P0口輸出使數(shù)值個位顯示數(shù)碼管點亮的字位碼。由于采用的是共陽數(shù)碼管,所以只有該位數(shù)碼管對應的P0.0為1,其他位P0.1-P0.3為0,點亮延時10MS。然后P1口輸出數(shù)值十位七段碼,P0.1為1,數(shù)值十位數(shù)碼管點亮,延時10MS。接著P1口輸出數(shù)值百位七段碼,P0.2為1,數(shù)值百位數(shù)碼管點亮,延時10MS。最后P1口輸出數(shù)值千位七段碼,P0.3為1,數(shù)值千位數(shù)碼管點亮,延時10MS。
程序源代碼:
DISPBUF EQU 30H ;顯示數(shù)據(jù)存儲位置
ORG 0000H ;主程序的入口地址
START:MOV DISPBUF,#0C0H ;4個數(shù)碼管顯示"0000"字形數(shù)據(jù)
MOV DISPBUF+1,#0C0H
MOV DISPBUF+2,#0C0H
MOV DISPBUF+3,#0C0H
MOV 37H,#00H ;數(shù)值初始化
MOV 27H,#00H
MOV 26H,#00H
MOV 25H,#00H
MOV 24H,#00H
MOV 23H,#00H
MOV R3,#00H
MOV R5,#00H
MOV R4,#00H
LOOP: LCALLKEY ;調(diào)用鍵盤掃描子程序
MOV R6,27H
CJNE R6,#00H,START ;清除鍵判斷
MOV R6,26H
CJNE R6,#00H,FA ;顯示數(shù)據(jù)轉(zhuǎn)換子程序選擇
LCALL CONV ;調(diào)用數(shù)碼管顯示數(shù)據(jù)轉(zhuǎn)換子程序
FA: LCALL DISPSCAN ;調(diào)用數(shù)碼管動態(tài)顯示子程序
SJMP LOOP
KEY: MOVP2,#0FH ;鍵盤掃描子程序 ;低4位送1
MOV A,P2 ;行輸入
ANL A,#0FH
CJNE A,#0FH,K10 ;有按下跳轉(zhuǎn)
RET
K10: JBP2.0,K20 ;第一列
K11: MOVP2,#0EFH ;一行一列
JB P2.0,K12
CJNE R5,#00H,L1
MOV R4,#00H
INC R5
MOV R3,#1H
L1: LJMP CEND
K12: MOVP2,#0DFH
JB P2.0,K13
CJNE R5,#00H,L2
MOV R4,#00H
INC R5
MOV R3,#2H
L2: LJMP CEND
KIL: LJMPKEND
L4: LJMPCEND
K20: JBP2.1,K30 ;第二列
K21: MOVP2,#0EFH
JB P2.1,K22
LJMP DYU
K22: MOV P2,#0DFH
JB P2.1,K23
MOV 25H,#3H
LJMP OPR
CCTV:LJMP KEND
K30: JBP2.2,K40 ;第三列
K31: MOVP2,#0EFH
JB P2.2,K32
MOV 25H,#0H
LJMP OPR
K32: MOV P2,#0DFH
JB P2.2,K33
MOV 25H,#2H
LJMP OPR
K40: JBP2.3,KEND ;第四列
K41: MOVP2,#0EFH
JB P2.3,K42
INC 27H
LJMP KEND
K42: MOV P2,#0DFH
JB P2.3,K43
MOV 25H,#1H
LJMP OPR
OPR: INC R4 ;鍵值存儲
CJNE R5,#00H,CHANG
CJNER4,#2H,KBK
ZHI: MOV A,20H
MOV B,#0AH
MUL AB
MOV20H,25H
ADD A,20H
CJNER5,#00H,CZH
MOV 23H,A
LJMP KEND
CZH: MOV 24H,A
LJMP KEND
KEND:MOV P2,#0FH
MOV A,P2
ANL A,#0FH
CJNEA,#0FH,KEND
RET
CHANG: CJNE R4,#2H,HONG
AJMP ZHI
HONG:JNC CEND
INC R5
MOV 20H,25H
MOV24H,25H
LJMP CEND
KBK: JNC CEND
MOV 20H,25H
MOV 23H,25H
LJMP CEND
DYU: MOV R5,#00H ;結果計算
MOV R4,#00H
MOV25H,#00H
CJNER3,#1H,S
MOV A,23H
ADD A,24H
MOV 23H,A
SJMP CEND
S: CJNE R3,#2H,S1
CLR C
MOV A,23H
CJNEA,#00H,JIANFA
MOV23H,#0EH
SJMP CEND
JIANFA:SUBB A,24H
MOV 23H,A
SJMP CEND
S1: CJNE R3,#3H,S2
MOV A,23H
MOV B,24H
MOV A,23H
MUL AB
MOV R6,B
CJNER6,#00H,CHENG
MOV 23H,A
SJMP CEND
S2: CJNE R3,#4,CEND
MOV A,24H
CJNE A,#00H,ZY
MOVA,#00H
SJMP CEND
ZY: MOV A,23H
MOV B,24H
DIV AB
MOV 23H,A
CEND:MOV P2,#0FH
MOV A,P2
ANL A,#0FH
CJNEA,#0FH,CEND
CONV: CJNE R5,#02H,BEI ;數(shù)碼管顯示數(shù)據(jù)轉(zhuǎn)換子程序
MOV A,24H
AJMP JING
BEI: MOV A,23H
JING: MOVB,#64H
DIV AB
MOV DPTR,#TABLE
MOVCA,@A+DPTR
MOVDISPBUF+2,A
MOV A,B
MOVB,#0AH
DIV AB
MOVCA,@A+DPTR
MOVDISPBUF+1,A
MOV A,B
MOVCA,@A+DPTR
MOVDISPBUF,A
RET
DISPSCAN:MOV R0,#DISPBUF ;數(shù)碼管動態(tài)顯示子程序
MOV R2,#4H
MOV A,#1H
SC: PUSH ACC
MOV A,@R0
MOV P1,A
POP ACC
MOV P0,A
LCALLDELAY1
RL A
INC R0
DJNZR2,SC
MOVP0,#1H
RET
DEL12: MOV R6,#1EH
DEL2: MOV R7,#64H
DEL1: DJNZ R7,DEL1
DJNZ R6,DEL2
RET
DELAY1:MOV R6,#70 ;延時程序
D2: MOV R7,#100
DJNZ R7,$
DJNZ R6,D2
RET
TABLE:DB0C0H,0F9H,0A4H,0B0H,99H ;------字符表------
DB92H,82H,0F8H,80H,90H
DB88H,83H,0C6H,0A1H,86H
END
4.調(diào)試過程及結果分析
1.首先賦予顯示緩沖初始值‘00 00’,并把數(shù)據(jù)存儲單元清零。
2.主程序調(diào)用鍵盤掃描子程序,判斷鍵值,是數(shù)字第一次直接賦予23H單元,如是第二次輸入數(shù)字,則把第一次值乘十后與第二次值相加,結果存儲到23H單元,并R4計數(shù)2次,表示已輸入兩位,掃描鍵值時就不再賦值和顯示。等待運算符號的按下,按下等于號就直接計算并顯示,如加減就R5加一并把R4清零,表示可以輸入下一操作數(shù),與第一次相同,并等待等于鍵按下。清零鍵則不管在任何情況下都清零,相當于軟復位。
3.在掃描完鍵盤后,調(diào)用數(shù)據(jù)顯示轉(zhuǎn)換子程序把值轉(zhuǎn)換為七段碼。
4.調(diào)用數(shù)碼管動態(tài)顯示子程序,顯示數(shù)值,重新循環(huán)。
參 考 文 獻
[1] 李華.單片機原理及應用[M].蘭州:蘭州大學出版社,2001
[2] 卓越科技.MCS-51單片機原理與應用實例[M].北京:電子工業(yè)出版,2008
|