版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、<p><b> 1 引言</b></p><p><b> 1.1 概述</b></p><p> 眾所周知單片機是一種集成在電路芯片,是采用超大規(guī)模集成電路技術(shù)把具有數(shù)據(jù)處理能力的中央處理器CPU隨機存儲器RAM、只讀存儲器ROM、多種I/O口和中斷系統(tǒng)、定時器/計時器等功能(可能還包括顯示驅(qū)動電路、脈寬調(diào)制電路、模擬多路
2、轉(zhuǎn)換器、A/D轉(zhuǎn)換器等電路)集成到一塊硅片上構(gòu)成的一個小而完善的計算機系統(tǒng)。本設(shè)計要制作的就是單片機于生活中最為常見的幾種應(yīng)用——簡易計算器。本簡易計算器以AT89S52單片機作為核心,可以顯示簡易的計算和時間,時間可以人為設(shè)定;另外還可以顯示當(dāng)前的日歷,顯示格式為年(四位),月(兩位),日(兩位)。設(shè)置時間的位切換、設(shè)定數(shù)值、啟動定時器、切換日歷通過外部中斷來實現(xiàn)。簡易計算器不僅可以進行簡易的計算還可以顯示時間。簡易計算器顯示電路由L
3、CD1602組成, 制作該裝置的材料需要有軟硬件的支持,硬件方面AT89C51單片機,晶振,電源,液晶屏LCD1602。</p><p><b> 1.2 設(shè)計思路</b></p><p> 1、本課題設(shè)計的是簡單的計算器,可以進行四則運算,為了得到較好的顯示效果,所以采用LCD顯示數(shù)據(jù)和結(jié)果;</p><p> 2、計算器部分:鍵盤包
4、括數(shù)字鍵(0-9)、符號鍵(+、-、*、/)、清除鍵(ON/C)和等號鍵(=),故需要16個按鍵,設(shè)計中采用矩陣鍵盤;</p><p> 3、時間顯示的部分,有年、月、日、時、分、秒、時間顯示和計算器控制鍵的分別設(shè)置,故需要8個獨立的按鍵;</p><p> 3、執(zhí)行程序:開機顯示零,等待鍵入數(shù)值,當(dāng)鍵入數(shù)字,通過LCD顯示出來,當(dāng)鍵入+、-、*、/運算符,計算器在內(nèi)部執(zhí)行數(shù)值轉(zhuǎn)換和存
5、儲,并等待再次鍵入數(shù)值后將顯示鍵入的數(shù)值,按等號就會在LCD上輸出運算結(jié)果;</p><p> 4、錯誤提示:當(dāng)單片機執(zhí)行程序中有錯誤時,會在LCD上顯示相應(yīng)的提示,如:當(dāng)輸入的數(shù)值或計算器得到的結(jié)果大于計算器的顯示范圍時,計算器會在LCD上提示溢出;當(dāng)除數(shù)為0時,計算器會在LCD上提示錯誤,顯示“error”。</p><p> 2 單片機及其應(yīng)用</p><p
6、> 單片機是一種集成在電路芯片,是采用超大規(guī)模集成電路技術(shù)把具有數(shù)據(jù)處理能力的中央處理器CPU隨機存儲器RAM、只讀存儲器ROM、多種I/O口和中斷系統(tǒng)、定時器/計時器等功能(可能還包括顯示驅(qū)動電路、脈寬調(diào)制電路、模擬多路轉(zhuǎn)換器、A/D轉(zhuǎn)換器等電路)集成到一塊硅片上構(gòu)成的一個小而完善的計算機系統(tǒng)。</p><p> 圖2.1 AT89S52</p><p> 2.1 單片機
7、介紹</p><p> 單片微型計算機簡稱單片機,是典型的嵌入式微控制器(Microcontroller Unit),常用英文字母的縮寫MCU表示單片機,它最早是被用在工業(yè)控制領(lǐng)域。單片機由芯片內(nèi)僅有CPU的專用處理器發(fā)展而來。最早的設(shè)計理念是通過將大量外圍設(shè)備和CPU集成在一個芯片中,使計算機系統(tǒng)更小,更容易集成進復(fù)雜的而對體積要求嚴(yán)格的控制設(shè)備當(dāng)中。INTEL的Z80是最早按照這種思想設(shè)計出的處理器,從此以
8、后,單片機和專用處理器的發(fā)展便分道揚鑣</p><p> 單片機是靠程序運行的,并且可以修改。通過不同的程序?qū)崿F(xiàn)不同的功能,尤其是特殊的獨特的一些功能,這是別的器件需要費很大力氣才能做到的,有些則是花大力氣也很難做到的。一個不是很復(fù)雜的功能要是用美國50年代開發(fā)的74系列,或者60年代的CD4000系列這些純硬件來搞定的話,電路一定是一塊大PCB板!但是如果要是用美國70年代成功投放市場的系列單片機,結(jié)果就會有
9、天壤之別!只因為單片機的通過你編寫的程序可以實現(xiàn)高智能,高效率,以及高可靠性!</p><p> 單片機的硬件特性:單片機集成度高。單片機包括CPU、4KB容量的ROM(8031 無)、128 B容量的RAM、 2個16位定時/計數(shù)器、4個8位并行口、全雙工串口行口。系統(tǒng)結(jié)構(gòu)簡單,使用方便,實現(xiàn)模塊化。</p><p> 2.2 單片機的應(yīng)用</p><p>
10、 目前單片機滲透到我們生活的各個領(lǐng)域,幾乎很難找到哪個領(lǐng)域沒有單片機的蹤跡。導(dǎo)彈的導(dǎo)航裝置,飛機上各種儀表的控制,計算機的網(wǎng)絡(luò)通訊與數(shù)據(jù)傳輸,工業(yè)自動化過程的實時控制和數(shù)據(jù)處理,廣泛使用的各種智能IC卡,民用豪華轎車的安全保障系統(tǒng),錄像機、攝像機、全自動洗衣機的控制,以及程控玩具、電子寵物等等,這些都離不開單片機。更不用說自動控制領(lǐng)域的機器人、智能儀表、醫(yī)療器械了。因此,單片機的學(xué)習(xí)、開發(fā)與應(yīng)用將造就一批計算機應(yīng)用與智能化控制的科學(xué)家
11、、工程師。單片機廣泛應(yīng)用于儀器儀表、家用電器、醫(yī)用設(shè)備、航空航天、專用設(shè)備的智能化管理及過程控制等領(lǐng)域,大致可分如下幾個范疇: </p><p> ?。?)在智能儀器儀表上的應(yīng)用 </p><p> ?。?)在工業(yè)控制中的應(yīng)用 </p><p> ?。?)在家用電器中的應(yīng)用 </p><p> ?。?)在計算機網(wǎng)絡(luò)和通信領(lǐng)域中的應(yīng)用 <
12、/p><p> ?。?)單片機在醫(yī)用設(shè)備領(lǐng)域中的應(yīng)用 </p><p> ?。?)在各種大型電器中的模塊化應(yīng)用 </p><p> ?。?)單片機在汽車設(shè)備領(lǐng)域中的應(yīng)用 </p><p> 此外,單片機在工商,金融,科研、教育,國防航空航天等領(lǐng)域都有著十分廣泛的用途。</p><p> 2.3 AT89S52單片機&
13、lt;/p><p> AT89S52是一種低功耗、高性能CMOS8位微控制器,具有8K 在系統(tǒng)可編程Flash 存儲器。使用Atmel 公司高密度非易失性存儲器技術(shù)制造,與工業(yè)80C51 產(chǎn)品指令和引腳完全兼容。片上Flash允許程序存儲器在系統(tǒng)可編程,亦適于常規(guī)編程器。在單芯片上,擁有靈巧的8 位CPU 和在系統(tǒng)可編程Flash,使AT89S52為眾多嵌入式控制應(yīng)用系統(tǒng)提供高靈活、超有效的解決方案。</p&
14、gt;<p> AT89S52具有以下標(biāo)準(zhǔn)功能: 8k字節(jié)Flash,256字節(jié)RAM,32 位I/O 口線,看門狗定時器,2 個數(shù)據(jù)指針,3個16 位定時器/計數(shù)器,1個6向量2級中斷結(jié)構(gòu),全雙工串行口,片內(nèi)晶振及時鐘電路。另外,AT89S52 可降至0Hz 靜態(tài)邏輯操作,支持2種軟件可選擇節(jié)電模式。空閑模式下,CPU停止工作,允許RAM、定時器/計數(shù)器、串口、中斷繼續(xù)工作。掉電保護方式下,RAM內(nèi)容被保存,振蕩器被凍
15、結(jié),單片機一切工作停止,直到下一個中斷或硬件復(fù)位為止。</p><p><b> 主要性能:</b></p><p> 1、與MCS-51單片機產(chǎn)品兼容</p><p> 2、8K字節(jié)在系統(tǒng)可編程Flash存儲器</p><p> 3、1000次擦寫周期</p><p> 4、全靜態(tài)操作
16、:0Hz~33Hz</p><p> 5、三級加密程序存儲器</p><p> 6、32個可編程I/O口線</p><p> 7、三個16位定時器/計數(shù)器</p><p><b> 8、八個中斷源</b></p><p> 9、全雙工UART串行通道</p><p&g
17、t; 10、低功耗空閑和掉電模式</p><p> l1、掉電后中斷可喚醒</p><p><b> l2、看門狗定時器</b></p><p><b> l3、雙數(shù)據(jù)指針</b></p><p><b> l4、掉電標(biāo)識符</b></p><p&
18、gt; 圖2.2 AT89S52引腳結(jié)構(gòu)</p><p> P0 口:P0口是一個8位漏極開路的雙向I/O口。作為輸出口,每位能驅(qū)動8個TTL邏輯電平。對P0端口寫“1”時,引腳用作高阻抗輸入。當(dāng)訪問外部程序和數(shù)據(jù)存儲器時,P0口也被作為低8位地址/數(shù)據(jù)復(fù)用。在這種模式下,P0具有內(nèi)部上拉電阻。在flash編程時,P0口也用來接收指令字節(jié);在程序校驗時,輸出指令字節(jié)。程序校驗時,需要外部上拉電阻。</
19、p><p> P1 口:P1 口是一個具有內(nèi)部上拉電阻的8 位雙向I/O 口,P1 輸出緩沖器能驅(qū)動4 個TTL 邏輯電平。對P1 端口寫“1”時,內(nèi)部上拉電阻把端口拉高,此時可以作為輸入口使用。作為輸入使用時,被外部拉低的引腳由于內(nèi)部電阻的原因,將輸出電流。此外,P1.0和P1.2分別作定時器/計數(shù)器2的外部計數(shù)輸入(P1.0/T2)和定時器/計數(shù)器2的觸發(fā)輸入(P1.1/T2EX),具體如下表所示。在flash
20、編程和校驗時,P1口接收低8位地址字節(jié)。</p><p><b> 引腳號第二功能</b></p><p> P1.0 T2(定時器/計數(shù)器T2的外部計數(shù)輸入),時鐘輸出</p><p> P1.1 T2EX(定時器/計數(shù)器T2的捕捉/重載觸發(fā)信號和方向控制)</p><p> P1.5 MOSI(在系統(tǒng)編程用)
21、</p><p> P1.6 MISO(在系統(tǒng)編程用)</p><p> P1.7 SCK(在系統(tǒng)編程用)</p><p> P2 口:P2 口是一個具有內(nèi)部上拉電阻的8 位雙向I/O 口,P2 輸出緩沖器能驅(qū)動4 個TTL 邏輯電平。對P2 端口寫“1”時,內(nèi)部上拉電阻把端口拉高,此時可以作為輸入口使用。作為輸入使用時,被外部拉低的引腳由于內(nèi)部電阻的原因,將
22、輸出電流。在訪問外部程序存儲器或用16位地址讀取外部數(shù)據(jù)存儲器(例如執(zhí)行MOVX @DPTR)時,P2 口送出高八位地址。在這種應(yīng)用中,P2 口使用很強的內(nèi)部上拉發(fā)送1。在使用8位地址(如MOVX @RI)訪問外部數(shù)據(jù)存儲器時,P2口輸出P2鎖存器的內(nèi)容。在flash編程和校驗時,P2口也接收高8位地址字節(jié)和一些控制信號。</p><p> P3 口:P3 口是一個具有內(nèi)部上拉電阻的8 位雙向I/O 口,P2
23、輸出緩沖器能驅(qū)動4 個TTL 邏輯電平。對P3 端口寫“1”時,內(nèi)部上拉電阻把端口拉高,此時可以作為輸入口使用。作為輸入使用時,被外部拉低的引腳由于內(nèi)部電阻的原因,將輸出電流。P3口亦作為AT89S52特殊功能(第二功能)使用,如下表所示。在flash編程和校驗時,P3口也接收一些控制信號。</p><p><b> 引腳號第二功能:</b></p><p> P
24、3.0 RXD(串行輸入)</p><p> P3.1 TXD(串行輸出)</p><p> P3.2 INT0(外部中斷0)</p><p> P3.3 INT0(外部中斷0)</p><p> P3.4 T0(定時器0外部輸入)</p><p> P3.5 T1(定時器1外部輸入)</p>
25、<p> P3.6 WR(外部數(shù)據(jù)存儲器寫選通)</p><p> P3.7 RD(外部數(shù)據(jù)存儲器寫選通)</p><p> RST: 復(fù)位輸入。晶振工作時,RST腳持續(xù)2 個機器周期高電平將使單片機復(fù)位??撮T狗計時完成后,RST 腳輸出96 個晶振周期的高電平。特殊寄存器AUXR(地址8EH)上的DISRTO位可以使此功能無效。DISRTO默認狀態(tài)下,復(fù)位高電平有效。
26、 </p><p> ALE/PROG:地址鎖存控制信號(ALE)是訪問外部程序存儲器時,鎖存低8 位地址的輸出脈沖。在flash編程時,此引腳(PROG)也用作編程輸入脈沖。在一般情況下,ALE 以晶振六分之一的固定頻率輸出脈沖,可用來作為外部定時器或時鐘使用。然而,特別強調(diào),在
27、每次訪問外部數(shù)據(jù)存儲器時,ALE脈沖將會跳過。如果需要,通過將地址為8EH的SFR的第0位置“1”,ALE操作將無效。這一位置“1”,ALE 僅在執(zhí)行MOVX 或MOVC指令時有效。否則,ALE 將被微弱拉高。這個ALE 使能標(biāo)志位(地址為8EH的SFR的第0位)的設(shè)置對微控制器處于外部執(zhí)行模式下無效。PSEN:外部程序存儲器選通信號(PSEN)是外部程序存儲器選通信號。</p><p> 當(dāng)AT89S52從外
28、部程序存儲器執(zhí)行外部代碼時,PSEN在每個機器周期被激活兩次,而在訪問外部數(shù)據(jù)存儲器時,PSEN將不被激活。</p><p> EA/VPP:訪問外部程序存儲器控制信號。為使能從0000H 到FFFFH的外部程序存儲器讀取指令,EA必須接GND。為了執(zhí)行內(nèi)部程序指令,EA應(yīng)該接VCC。在flash編程期間,EA也接收12伏VPP電壓。</p><p> XTAL1:振蕩器反相放大器和內(nèi)
29、部時鐘發(fā)生電路的輸入端。</p><p> XTAL2:振蕩器反相放大器的輸出端。</p><p> 3 LCD1602的原理及其應(yīng)用</p><p> 3.1 LCD1602的介紹</p><p> LCD1602已很普遍了,具體介紹我就不多說了,市面上字符液晶絕大多數(shù)是基于HD44780液晶芯片的,控制原理是完全相同的,因此H
30、D44780寫的控制程序可以很方便地應(yīng)用于市面上大部分的字符型液晶。字符型LCD通常有14條引腳線或16條引腳線的LCD,多出來的2條線是背光電源線VCC(15腳)和地線GND(16腳),其控制原理與14腳的LCD完全一樣。</p><p> 3.2 LCD1602的引腳</p><p> 1602LCD采用標(biāo)準(zhǔn)的14腳(無背光)或16腳(帶背光)接口,各引腳接口說明如表3.1所示:
31、</p><p> 表3.1 LCD1602的引腳說明</p><p> 表3.1:引腳接口說明表</p><p> 第1腳:VSS為地電源。</p><p> 第2腳:VDD接5V正電源。</p><p> 第3腳:VL為液晶顯示器對比度調(diào)整端,接正電源時對比度最弱,接地時對比度最高,對比度過高時會產(chǎn)生“
32、鬼影”,使用時可以通過一個10K的電位器調(diào)整對比度。</p><p> 第4腳:RS為寄存器選擇,高電平時選擇數(shù)據(jù)寄存器、低電平時選擇指令寄存器。</p><p> 第5腳:R/W為讀寫信號線,高電平時進行讀操作,低電平時進行寫操作。當(dāng)RS和R/W共同為低電平時可以寫入指令或者顯示地址,當(dāng)RS為低電平R/W為高電平時可以讀忙信號,當(dāng)RS為高電平R/W為低電平時可以寫入數(shù)據(jù)。</p
33、><p> 第6腳:E端為使能端,當(dāng)E端由高電平跳變成低電平時,液晶模塊執(zhí)行命令。</p><p> 第7~14腳:D0~D7為8位雙向數(shù)據(jù)線。</p><p> 第15腳:背光源正極。</p><p> 第16腳:背光源負極。</p><p> 3.3 LCD1602的指令</p><p&
34、gt; 1602液晶模塊內(nèi)部的控制器共有11條控制指令,如表3.2所示:</p><p> 表3.2 LCD1602的指令說明</p><p> 表3.2:控制命令表</p><p> 1602液晶模塊的讀寫操作、屏幕和光標(biāo)的操作都是通過指令編程來實現(xiàn)的。(說明:1為高電平、0為低電平)</p><p> 指令1:清顯示,指令碼0
35、1H,光標(biāo)復(fù)位到地址00H位置。</p><p> 指令2:光標(biāo)復(fù)位,光標(biāo)返回到地址00H。</p><p> 指令3:光標(biāo)和顯示模式設(shè)置 I/D:光標(biāo)移動方向,高電平右移,低電平左移 S:屏幕上所有文字是否左移或者右移。高電平表示有效,低電平則無效。</p><p> 指令4:顯示開關(guān)控制。D:控制整體顯示的開與關(guān),高電平表示開顯示,低電平表示關(guān)顯示 C:控
36、制光標(biāo)的開與關(guān),高電平表示有光標(biāo),低電平表示無光標(biāo) B:控制光標(biāo)是否閃爍,高電平閃爍,低電平不閃爍。</p><p> 指令5:光標(biāo)或顯示移位 S/C:高電平時移動顯示的文字,低電平時移動光標(biāo)。</p><p> 指令6:功能設(shè)置命令 DL:高電平時為4位總線,低電平時為8位總線 N:低電平時為單行顯示,高電平時雙行顯示 F: 低電平時顯示5x7的點陣字符,高電平時顯示5x10的點陣字
37、符。</p><p> 指令7:字符發(fā)生器RAM地址設(shè)置。</p><p> 指令8:DDRAM地址設(shè)置。</p><p> 指令9:讀忙信號和光標(biāo)地址 BF:為忙標(biāo)志位,高電平表示忙,此時模塊不能接收命令或者數(shù)據(jù),如果為低電平表示不忙。</p><p><b> 指令10:寫數(shù)據(jù)。</b></p>
38、<p><b> 指令11:讀數(shù)據(jù)。</b></p><p> 與HD44780相兼容的芯片時序表如下:</p><p> 表3.3 LCD1602基本操作時序說明</p><p> 3.4 LCD1602的RAM地址映射及標(biāo)準(zhǔn)字庫表</p><p> 液晶顯示模塊是一個慢顯示器件,所以在執(zhí)行每
39、條指令之前一定要確認模塊的忙標(biāo)志為低電平,表示不忙,否則此指令失效。要顯示字符時要先輸入顯示字符地址,也就是告訴模塊在哪里顯示字符,圖3.1是1602的內(nèi)部顯示地址。</p><p> 圖3.1 LCD1602的內(nèi)部地址</p><p> 例如第二行第一個字符的地址是40H,那么是否直接寫入40H就可以將光標(biāo)定位在第二行第一個字符的位置呢?這樣不行,因為寫入顯示地址時要求最高位D7恒
40、定為高電平1所以實際寫入的數(shù)據(jù)應(yīng)該是01000000B(40H)+10000000B(80H)=11000000B(C0H)。</p><p> 在對液晶模塊的初始化中要先設(shè)置其顯示模式,在液晶模塊顯示字符時光標(biāo)是自動右移的,無需人工干預(yù)。每次輸入指令前都要判斷液晶模塊是否處于忙的狀態(tài)。</p><p> 1602液晶模塊內(nèi)部的字符發(fā)生存儲器(CGROM)已經(jīng)存儲了160個不同的點陣字
41、符圖形,如表3.4所示,這些字符有:阿拉伯?dāng)?shù)字、英文字母的大小寫、常用的符號、和日文假名等,每一個字符都有一個固定的代碼,比如大寫的英文字母“A”的代碼是01000001B(41H),顯示時模塊把地址41H中的點陣字符圖形顯示出來,我們就能看到字母“A”。</p><p> 表3.4 CGROM和CGRAM中字符代碼與字符圖形對應(yīng)關(guān)系</p><p><b> 4 整體設(shè)
42、計</b></p><p><b> 4.1 設(shè)計方法</b></p><p> 本電路設(shè)計采用AT89S52單片機為核心,利用晶振產(chǎn)生頻率為1HZ的時鐘脈沖信號,利用液晶屏LCD1602顯示計算及其時間信息,通過對AT89S52單片機的編程控制液晶屏LCD1602的顯示。顯示計算和簡易計算的信息同在LCD1602,通過按鍵切換選擇。外部按鍵可及時設(shè)
43、定或調(diào)整時間或計算的信息。</p><p><b> 4.2 硬件設(shè)計</b></p><p> 本系統(tǒng)以AT89S52單片機為核心,本系統(tǒng)選用12MHZ的晶振,,使得單片機有合理的運行速度。起振電容22pF對振蕩器的頻率高低、振蕩器的穩(wěn)定性和起振的快速性影響較合適,復(fù)位電路為按鍵高電平復(fù)位。</p><p> 4.2.1 按鍵調(diào)整電
44、路</p><p> 圖4.1 獨立按鍵</p><p> S0為調(diào)秒的按鍵,當(dāng)按下S0時秒加1;S1為調(diào)分的按鍵,當(dāng)按S1時分加1;S2按鍵為調(diào)時,當(dāng)按下S2時時加1;S3按鍵為調(diào)日,當(dāng)按下S3時日加1;S4為調(diào)月,當(dāng)按下S4時月加1;S5為調(diào)年,當(dāng)按下S5時年加1;當(dāng)S6按下時,顯示時間;S7按下時,顯示計算。</p><p> 4.2.2 復(fù)位電路&
45、lt;/p><p> 圖4.2 復(fù)位電路</p><p> 51單片機是高電平復(fù)位。所以本設(shè)計采用的是上電復(fù)位和手動復(fù)位相結(jié)合的方式。</p><p> 4.2.3 LCD1602的顯示電路</p><p><b> 圖4.3 顯示部分</b></p><p> 本設(shè)計采用液晶屏LCD1
46、602來顯示輸出數(shù)據(jù),通過D0-D7引腳向LCD寫指令字或?qū)憯?shù)據(jù)以使LCD實現(xiàn)不同的功能或顯示相應(yīng)的數(shù)據(jù)。</p><p> 4.2.4 電源供電電路 </p><p> 圖4.4 電源部分</p><p> 三端穩(wěn)壓集成電路LM7805,是指這種穩(wěn)壓用的集成電路,只有三條引腳輸出,分別是輸入端、接地端和輸出端。如圖4.4所示,這是一個輸出+5V直流電壓的
47、穩(wěn)壓電源電路。采用集成穩(wěn)壓器LM7805,二極管DS1起保護作用,C4為輸出端濾波電容,當(dāng)輸出電流較大時,LM7805應(yīng)配上散熱板,本設(shè)計中功率小不用。78/79系列集成穩(wěn)壓IC中的78或79后面的數(shù)字代表該三端集成穩(wěn)壓電路的輸出電壓,如7805表示輸出電壓為+5V。</p><p> 4.2.5 鍵盤的設(shè)計</p><p> 圖4.5 矩陣鍵盤</p><p&
48、gt; 計算器輸入數(shù)字和其他功能按鍵要用到很多按鍵,如果采用獨立按鍵的方式,在這種情況下,編程會很簡單,但是會占用大量的I/O 口資源,因此在很多情況下都不采用這種方式,而是采用矩陣鍵盤的方案。矩陣鍵盤采用四條I/O 線作為行線,四條I/O 線作為列線組成鍵盤,在行線和列線的每個交叉點上設(shè)置一個按鍵。這樣鍵盤上按鍵的個數(shù)就為4*4個。這種行列式鍵盤結(jié)構(gòu)能有效地提高單片機系統(tǒng)中I/O 口的利用率。</p><p>
49、;<b> 4.3 軟件設(shè)計</b></p><p> 本電路軟件設(shè)計采用C語言編寫程序(具體程序在附件中給出)。程序設(shè)計主要包括簡易計算的編程,按鍵編程,時間控制編程,液晶屏LCD1602的顯示編程。</p><p><b> 4.4 軟件仿真</b></p><p> 在硬件設(shè)計完成后,利用軟件對其進行仿真
50、,這樣,就會減少在做硬件時的錯誤,做到更準(zhǔn)確。本次我采用Proteus軟件仿真。</p><p> 如圖4.1所示,簡易計算器的時間顯示。</p><p> 如圖4.2所示,簡易計算器的計算顯示。</p><p> 經(jīng)過此次的軟件仿真,仿真結(jié)果正常,可以順利的進行硬件制作。</p><p> 圖4.6 時間顯示</p>
51、<p> 圖4.7 計算顯示</p><p><b> 4.5 硬件調(diào)試</b></p><p> 前期工作都是為了最后一步,就是自己動手焊接,制作出完整的實物。在確保焊接無誤后,接著將之前編好的程序燒進單片機,做最后的硬件調(diào)試。</p><p><b> 結(jié)束語</b></p>&l
52、t;p> 在用單片機實現(xiàn)簡易計算的設(shè)計中使用到了AT89S52、LCD1602及其4*4鍵盤的使用。在設(shè)計過程中我通過在網(wǎng)上和圖書館查閱資料,收集了關(guān)于單片機和液晶屏LCD1602顯示方面的資料,通過對這些資料的學(xué)習(xí),我了解了單片機的基本結(jié)構(gòu)和單片機在生活和生產(chǎn)中所發(fā)揮的作用以及液晶屏LCD1602的原理和使用。</p><p> 本次設(shè)計完成的主要工作和任務(wù)如下:對設(shè)計方案的理論研究,單片機的合理選型
53、,硬件電路的設(shè)計,電路板的制作,元器件的焊接,軟件的編寫和調(diào)試以及此次論文的編寫。通過設(shè)計簡易計算器的過程中,我掌握了單片機的基本原理及其基本的應(yīng)用,對它的各種硬件接口與軟件設(shè)計方法有一定的認識。通過對電路原理圖、PCB圖的繪制,又加深對Protel DXP的使用,電路仿真、電路板的制作掌握了對Proteus仿真軟件的使用。</p><p> 本次論文設(shè)計是對以前學(xué)過的理論知識進行了鞏固,加深了理解,提高了應(yīng)用
54、的能力,提高了自己的發(fā)現(xiàn)、分析、解決問題的能力。經(jīng)歷了從最初的選題、硬件設(shè)計、軟件設(shè)計到最后仿真結(jié)果的出現(xiàn),從一定程度上提高了對專業(yè)的認識及興趣,就我而言,對以后就業(yè)有及其重大的影響。</p><p><b> 致 謝</b></p><p> 在此也很感謝學(xué)校和老師給我們提供了這樣的平臺,能使我們的動手能力增強;感謝老師對我們提供的幫助,感謝他們帶給我知識
55、,使我完成本次的畢業(yè)設(shè)計。同時也感謝我的同學(xué)們,對我的支持!</p><p><b> 參考文獻</b></p><p> [1] 田立.田清.代方震.51單片機C語言程序設(shè)計.北京.人民郵電出版社.2008:132-148.</p><p> [2] 張儀和.例說51單片機(C語言版)(第三版).北京.人民郵電出版社.2010:374-
56、392.</p><p> [3] 譚浩強.C程序設(shè)計(第三版).北京.清華大學(xué)出版社.2003:140-150.</p><p> [4] 溫子祺.劉志峰.冼安勝.林秩謙.李益鴻.51單片機C語言創(chuàng)新教程.北京.北京航空航天大學(xué)出版社.2011:154-163.</p><p> [5] 俞錫存.曹國華.單片機原理及接口技術(shù).西安.西安電子科技大學(xué)出版社.2
57、000:80-95.</p><p><b> .</b></p><p><b> 附錄</b></p><p> 1. 硬件電路原理圖</p><p> 2. 軟件編程程序 </p><p> #inclu
58、de <reg52.h></p><p> #define uchar unsigned char</p><p> #define uint unsigned int</p><p> sbit rs=P0^0;</p><p> sbit rw=P0^1; sbit e=P0^2;</p><p&g
59、t; sbit k0=P1^0; sbit k1=P1^1;</p><p> sbit k2=P1^2; sbit k3=P1^3;</p><p> sbit k4=P1^4; sbit k5=P1^5;</p><p> sbit k6=P1^6; sbit k7=P1^7;</p><p> unsigned char co
60、de digit[ ]={"0123456789"}; //定義字符數(shù)組顯示數(shù)字</p><p> unsigned char s,m,h,day,month,year,count;</p><p> void write_dat(uchar dat); void write_com(uchar com);</p>
61、<p> void keyscan();</p><p> /***功能說明:顯示編碼,加上0x30,分別為'1'、'2'、'3'、'+'、'4'、'5'、'6'、'-'等***/</p><p> uchar code table1[]=&l
62、t;/p><p> { 1,2,3,0x2b-0x30, 4,5,6,0x2d-0x30, 7,8,9,0x2a-0x30, 0,0x3d-0x30,0x01-0x30,0x2f-0x30};</p><p> uchar k=0,flag=0,num,fuhao,i;</p><p> long a,b,c;</p><p> void
63、 delay(uint z)</p><p> { uint x,y;</p><p> for(x=z;x>0;x--)</p><p> for(y=110;y>0;y--); }</p><p> /***函數(shù)功能:指定字符顯示的實際地址 入口參數(shù):x***/</p><p>
64、void WriteAddress(unsigned char x)</p><p> { write_com(x|0x80); } //顯示位置的確定方法規(guī)定為"80H+地址碼x"</p><p> /***函數(shù)功能:顯示小時***/</p><p> void DisplayHour
65、()</p><p> { unsigned char i,j;</p><p> i=h/10; //取整運算,求得十位數(shù)字</p><p> j=h%10; //取余運算,求得各位數(shù)字</p>
66、;<p> WriteAddress(0x45); //寫顯示地址,將十位數(shù)字顯示在第2行第0列</p><p> write_dat(digit[i]); //將十位數(shù)字的字符常量寫入LCD</p><p> write_dat(digit[j]);
67、 //將個位數(shù)字的字符常量寫入LCD</p><p><b> }</b></p><p> /***函數(shù)功能:顯示分鐘***/</p><p> void DisplayMinute()</p><p> { unsigned char i,j;<
68、/p><p> i=m/10; //取整運算,求得十位數(shù)字</p><p> j=m%10; //取余運算,求得各位數(shù)字</p><p> WriteAddress(0x48);
69、 //寫顯示地址,將十位數(shù)字顯示在第2行第3列</p><p> write_dat(digit[i]); //將十位數(shù)字的字符常量寫入LCD</p><p> write_dat(digit[j]); //將個位數(shù)字的字符常量寫入LCD<
70、;/p><p><b> }</b></p><p> /***函數(shù)功能:顯示秒***/</p><p> void DisplaySecond()</p><p> { unsigned char i,j;</p><p> i=s/10;
71、 //取整運算,求得十位數(shù)字</p><p> j=s%10; //取余運算,求得各位數(shù)字</p><p> WriteAddress(0x4b); //寫顯示地址,將十位數(shù)字顯示在第2行第6列</p>&
72、lt;p> write_dat(digit[i]); //將十位數(shù)字的字符常量寫入LCD</p><p> write_dat(digit[j]); //將個位數(shù)字的字符常量寫入LCD</p><p><b> } </b></p&
73、gt;<p> /***函數(shù)功能:顯示年***/</p><p> void DisplayYear()</p><p> { unsigned char i,j; </p><p> i=year/10; //取整運算,求得十位數(shù)字</p><p&
74、gt; j=year%10; //取余運算,求得各位數(shù)字</p><p> WriteAddress(0x07); //寫顯示地址,將十位數(shù)字顯示在第2行第0列</p><p> write_dat(digit[i]);
75、 //將十位數(shù)字的字符常量寫入LCD</p><p> write_dat(digit[j]); //將個位數(shù)字的字符常量寫入LCD</p><p><b> }</b></p><p> /*** 函數(shù)功能:顯示月***/</p><p> void Disp
76、layMonth()</p><p> { unsigned char i,j;</p><p> i=month/10; //取整運算,求得十位數(shù)字</p><p> j=month%10; //取余運算,求得各
77、位數(shù)字</p><p> WriteAddress(0x0a); / /寫顯示地址,將十位數(shù)字顯示在第2行第3列</p><p> write_dat(digit[i]); //將十位數(shù)字的字符常量寫入LCD</p><p> write_dat(
78、digit[j]); //將個位數(shù)字的字符常量寫入LCD</p><p><b> }</b></p><p> /***函數(shù)功能:顯示日***/</p><p> void DisplayDay()</p><p> { unsigned char i
79、,j;</p><p> i=day/10; //取整運算,求得十位數(shù)字</p><p> j=day%10; //取余運算,求得各位數(shù)字</p><p> WriteAddress(0x0d);
80、 / /寫顯示地址,將十位數(shù)字顯示在第2行第6列</p><p> write_dat(digit[i]); //將十位數(shù)字的字符常量寫入LCD</p><p> write_dat(digit[j]); //將個位數(shù)字的字符常量寫入LCD</p><p><
81、b> }</b></p><p> void keyscan2()</p><p> {if(k0==0)</p><p> {delay(5);</p><p><b> if(k0==0)</b></p><p> { s++; </p>
82、<p><b> if(s==60)</b></p><p> s=0; } } </p><p><b> if(k1==0)</b></p><p> {delay(5);</p><p><b> if(k1==0)</b>&l
83、t;/p><p><b> {m++;</b></p><p><b> if(m==60)</b></p><p> m=0; } } </p><p><b> if(k2==0)</b></p><p> {del
84、ay(5);</p><p><b> if(k2==0)</b></p><p><b> {h++;</b></p><p><b> if(h==60)</b></p><p> h=0; } } </p>
85、<p><b> if(k3==0)</b></p><p> {delay(5);</p><p><b> if(k3==0)</b></p><p><b> {day++;</b></p><p> if(day==30)</p>&
86、lt;p> day=0; } } </p><p><b> if(k4==0)</b></p><p> {delay(5);</p><p><b> if(k4==0)</b></p><p><b> {month++;<
87、/b></p><p> if(month==13)</p><p> month=0; } } </p><p><b> if(k5==0)</b></p><p> {delay(5);</p><p><b> if(k5==0)&
88、lt;/b></p><p><b> {year++;</b></p><p> if(year==99)</p><p><b> year=0;</b></p><p> } } } </p><p> void keyscan()&l
89、t;/p><p> { uchar temp;</p><p><b> P3=0xfe;</b></p><p><b> temp=P3;</b></p><p> temp=temp&0xf0;</p><p> while(temp!=0xf0)&l
90、t;/p><p> { delay(5);</p><p><b> temp=P3;</b></p><p> temp=temp&0xf0;</p><p> while(temp!=0xf0)</p><p> { temp=P3;</p><p>
91、; switch(temp)</p><p> { case 0xee:num=0;</p><p><b> break; </b></p><p> case 0xde:num=1;</p><p><b> break;</b></p><p>
92、case 0xbe:num=2;</p><p><b> break;</b></p><p> case 0x7e:num=3;</p><p><b> break;</b></p><p><b> } </b></p><p>
93、while(temp!=0xf0)</p><p> { temp=P3;</p><p> temp=temp&0xf0; } } </p><p> /***當(dāng)按下1,2,3,松手后執(zhí)行下面這段語句***/</p><p> if(num==0||num==1||num==
94、2)</p><p> { if(flag==0)</p><p> a=a*10+table1[num]; //如果沒有按符號鍵,符號前的數(shù)值為a</p><p> else if(flag==1)</p><p> b=b*10+table1[num];
95、 //如果按了符號鍵,符號后的數(shù)值為b </p><p> if(k==1) //如果之前按了'='號,再按鍵時清屏,進行下一次計算</p><p> { k=0;</p><p> write_com(0x01); } } </p><p> els
96、e if(num==3) //判斷按下'+'</p><p> { flag=1;</p><p><b> fuhao=1;</b></p><p> } </p>
97、<p> i=table1[num]; //顯示按下的鍵</p><p> write_dat(0x30+i); </p><p><b> }</b></p><p><b> P3=0xfd;</b></p>&
98、lt;p><b> temp=P3;</b></p><p> temp=temp&0xf0;</p><p> while(temp!=0xf0)</p><p> { delay(5);</p><p><b> temp=P3;</b></p><
99、;p> temp=temp&0xf0;</p><p> while(temp!=0xf0)</p><p> { temp=P3;</p><p> switch(temp)</p><p> { case 0xed:num=4;</p><p><b> break;
100、 </b></p><p> case 0xdd:num=5;</p><p><b> break;</b></p><p> case 0xbd:num=6;</p><p><b> break;</b></p><p> case 0x7d:
101、num=7;</p><p><b> break;</b></p><p><b> } </b></p><p> while(temp!=0xf0)</p><p> { temp=P3;</p><p> temp=temp&0xf0; }
102、 } </p><p> if(num==4||num==5||num==6) //判斷是否按下'4','5','6'</p><p> { if(k==1)</p><p> { k=0;</p>
103、;<p> write_com(0x01);</p><p><b> }</b></p><p> if(flag==0)</p><p> a=a*10+table1[num];</p><p> else if(flag==1)</p><p> b=b*10+ta
104、ble1[num]; </p><p><b> }</b></p><p> else if(num==7)</p><p> { flag=1;</p><p> fuhao=2; </p><p><b> }</b></p>
105、<p> i=table1[num]; //顯示按下的鍵</p><p> write_dat(0x30+i); </p><p><b> }</b></p><p><b> P3=0xfb;</b></p><
106、p><b> temp=P3;</b></p><p> temp=temp&0xf0;</p><p> while(temp!=0xf0)</p><p> { delay(5);</p><p><b> temp=P3;</b></p><p&
107、gt; temp=temp&0xf0;</p><p> while(temp!=0xf0)</p><p> { temp=P3;</p><p> switch(temp) //</p><p> { case 0xeb:num=8;</p><p><b> brea
108、k; </b></p><p> case 0xdb:num=9; </p><p><b> break;</b></p><p> case 0xbb:num=10;</p><p><b> break; </b></p><p> case
109、 0x7b:num=11;</p><p> break; </p><p><b> } </b></p><p> while(temp!=0xf0)</p><p> { temp=P3;</p><p> temp=temp&0xf0; }
110、 } </p><p> if(num==8||num==9||num==10) //判斷是否按下'7','8','9'</p><p> { if(k==1)</p><p><b> { k=0;</b&
111、gt;</p><p> write_com(0x01); } </p><p> if(flag==0)</p><p> a=a*10+table1[num];</p><p> else if(flag==1)</p><p> b=b*10+table1[num];
112、} </p><p> else if(num==11) //判斷是否按下'*'</p><p> { flag=1;</p><p> fuhao=3; } </p><p> i=tabl
113、e1[num];</p><p> write_dat(0x30+i); } </p><p><b> P3=0xf7;</b></p><p><b> temp=P3;</b></p><p> temp=temp&0xf0;</p><p>
114、 while(temp!=0xf0)</p><p> { delay(5);</p><p><b> temp=P3;</b></p><p> temp=temp&0xf0;</p><p> while(temp!=0xf0)</p><p> { temp=P3
115、;</p><p> switch(temp)</p><p> { case 0xe7:num=12; // 0鍵</p><p><b> break; </b></p><p> case 0xd7:num=13;
116、 // '='</p><p><b> break;</b></p><p> case 0xb7:num=14; //清0鍵</p><p><b> break; </b></p><p> case 0x77:num=1
117、5; //'/'</p><p> break; } </p><p> while(temp!=0xf0)</p><p> { temp=P3;</p><p> temp=temp&0xf0; } }
118、 </p><p> switch(num)</p><p> { case 12: </p><p> { if(k==1) k=0;</p><p> { write_com(0x01); } </p><p> if(flag==0)</p>
119、<p><b> a=a*10;</b></p><p> else if(flag==1) b=b*10; </p><p> write_dat(0x30); } </p><p><b> break;</b></p><
120、;p> case 13: //按=鍵</p><p> { k=1;</p><p> if(fuhao==1) //如果符號鍵是+,執(zhí)行+運算</p><p> { write_com(0x80+0x4f); write_com(0x0
121、4); </p><p><b> c=a+b;</b></p><p> while(c!=0) </p><p> { write_dat(0x30+c%10);</p><p> c=c/10; }
122、</p><p> write_dat(0x3d);</p><p><b> fuhao=0;</b></p><p> a=0;b=0;flag=0; }</p><p> if(fuhao==2)</p><p> { write_com(0x80+0x4f);
123、 write_com(0x04); </p><p><b> if(a>=b)</b></p><p> { c=a-b;</p><p> while(c!=0)</p><p> { write_dat(0x30+c%10);</p>
溫馨提示
- 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. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 基于51單片機的電子萬年歷畢業(yè)論文設(shè)計
- 基于51單片機的電子萬年歷設(shè)計畢業(yè)論文
- 51單片機萬年歷畢業(yè)設(shè)計論文
- 基于51單片機的電子萬年歷設(shè)計-畢業(yè)論文設(shè)計
- 畢業(yè)論文——基于51單片機的電子萬年歷的設(shè)計
- 基于單片機萬年歷的設(shè)計畢業(yè)論文
- 基于單片機萬年歷的設(shè)計畢業(yè)論文
- 基于51單片機電子萬年歷畢業(yè)論文
- 基于51單片機的萬年歷畢業(yè)設(shè)計
- 基于51單片機的電子萬年歷畢業(yè)設(shè)計論文
- 基于51單片機的電子萬年歷設(shè)計
- 畢業(yè)設(shè)計---基于51單片機的萬年歷設(shè)計
- 畢業(yè)設(shè)計---基于51單片機的萬年歷設(shè)計
- 萬年歷畢業(yè)論文---基于at89s52單片機的電子萬年歷設(shè)計
- 基于單片機的電子萬年歷畢業(yè)論文
- 畢業(yè)論文(設(shè)計)基于單片機的電子萬年歷
- 基于51單片機的液晶萬年歷畢業(yè)設(shè)計
- 51基于單片機的電子萬年歷畢業(yè)設(shè)計
- 2017畢業(yè)論文-基于at89c51單片機萬年歷設(shè)計
- 單片機課程設(shè)計--基于51單片機的萬年歷
評論
0/150
提交評論