版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、<p><b> 課 程 設(shè) 計(jì)</b></p><p> 學(xué) 號(hào): </p><p><b> 摘要</b></p><p> 單片機(jī)的出現(xiàn)是計(jì)算機(jī)制造技術(shù)高速發(fā)展的產(chǎn)物,它是嵌入式控制系統(tǒng)的核心,如今,它已廣泛的應(yīng)用到我們生活的各個(gè)領(lǐng)域,電子、科技、通信、汽車(chē)、工業(yè)等。</p><
2、;p> 本設(shè)計(jì)是基于51系列單片機(jī)來(lái)進(jìn)行的數(shù)字計(jì)算器系統(tǒng)設(shè)計(jì),可以完成計(jì)算器的鍵盤(pán)輸入,進(jìn)行加、減、乘、除六位數(shù)范圍內(nèi)的基本四則運(yùn)算,并在LCD上顯示相應(yīng)的結(jié)果。設(shè)計(jì)電路采用AT89C51單片機(jī)為主要控制電路,利用4*4矩陣鍵盤(pán)作為計(jì)算器的輸入。顯示采用字符LCD靜態(tài)顯示。軟件方面使用C語(yǔ)言編程,并用PROTUES仿真,驗(yàn)證了設(shè)計(jì)的合理性。</p><p> 關(guān)鍵字:計(jì)算器51單片機(jī) 矩陣鍵盤(pán)
3、 1602液晶顯示器 PROTUES仿真</p><p><b> 目錄</b></p><p><b> 摘要I</b></p><p><b> 第一章 緒論1</b></p><p> 1.1 計(jì)算器的背景1</p><p>
4、1.2 計(jì)算器設(shè)計(jì)概況1</p><p> 第二章 方案設(shè)計(jì)2</p><p> 2.1 設(shè)計(jì)任務(wù)2</p><p> 2.2 方案設(shè)計(jì)2</p><p> 第三章 硬件模塊介紹3</p><p> 3.1 運(yùn)算模塊3</p><p> 3.2 單片機(jī)概況5</p
5、><p> 第四章 整體設(shè)計(jì)方案7</p><p> 4.1 復(fù)位電路7</p><p> 4.2 時(shí)鐘電路7</p><p> 4.3 輸入模塊8</p><p> 4.4 顯示模塊9</p><p> 第五章 程序設(shè)計(jì)16</p><p>
6、 5.1輸入程序流程圖設(shè)計(jì)16</p><p> 5.2 LCD顯示程序設(shè)計(jì)16</p><p> 5.3 主程序的設(shè)計(jì)17</p><p><b> 小結(jié)19</b></p><p><b> 【參考文獻(xiàn)】20</b></p><p><b>
7、 程序附錄:23</b></p><p><b> 第一章 緒論</b></p><p> 1.1 計(jì)算器的背景 </p><p> 隨著社會(huì)的發(fā)展,科學(xué)的進(jìn)步,人們的生活水平在逐步的提高,尤其是微電子技術(shù)的發(fā)展,猶如雨后春筍般的變化。電子產(chǎn)品的更新速度快就不足驚奇了, 單片機(jī)的應(yīng)用已經(jīng)越來(lái)越貼近生活,用單片機(jī)來(lái)實(shí)現(xiàn)一些
8、電子設(shè)計(jì)也變得容易起來(lái)。 </p><p> 近年來(lái),單片機(jī)以其體積小、價(jià)格廉、面向控制等獨(dú)特優(yōu)點(diǎn),在各種工業(yè)控制、儀器儀表、設(shè)備、產(chǎn)品的自動(dòng)化、智能化方面獲得了廣泛的應(yīng)用。與此同時(shí),單片機(jī)應(yīng)用系統(tǒng)的可靠性成為人們?cè)絹?lái)越關(guān)注的重要課題。影響可靠性的因素是多方面的,如構(gòu)成系統(tǒng)的元器件本身的可靠性、系統(tǒng)本身各部分之間的相互耦合因素等。其中系統(tǒng)的抗干擾性能是系統(tǒng)可靠性的重要指標(biāo)。 </p><p&
9、gt; 1.2 計(jì)算器設(shè)計(jì)概況 </p><p> 本設(shè)計(jì)采用STC89C51芯片,實(shí)現(xiàn)了利用單片機(jī)進(jìn)行了一個(gè)簡(jiǎn)單計(jì)算器設(shè)計(jì)。允許對(duì)用矩陣鍵盤(pán)輸入數(shù)據(jù)進(jìn)行加減乘除運(yùn)算及LCD 顯示。如果設(shè)計(jì)對(duì)象是更為復(fù)雜的計(jì)算器系統(tǒng),其實(shí)際原理與方法與本設(shè)計(jì)基本相同。另外,實(shí)例所設(shè)計(jì)的計(jì)算器是用1602液晶顯示器顯示的,當(dāng)然也可以用其他的器件顯示,如LED 數(shù)碼管顯示屏。在此基礎(chǔ)上,還可以編寫(xiě)更加完善的程序來(lái)實(shí)現(xiàn)更多的計(jì)算功
10、能。設(shè)計(jì)的關(guān)鍵所在,是熟悉單片機(jī)的原理與結(jié)構(gòu),同時(shí)還要對(duì)整個(gè)設(shè)計(jì)流程有很好的把握,將單片機(jī)和其他模塊完整的銜接。</p><p><b> 第二章 方案設(shè)計(jì)</b></p><p><b> 2.1 設(shè)計(jì)任務(wù) </b></p><p> (1)系統(tǒng)通過(guò)4×4的矩陣鍵盤(pán)輸入數(shù)字及運(yùn)算符;</p>
11、<p> ?。?)系統(tǒng)通過(guò)1602液晶顯示器顯示輸入和運(yùn)算結(jié)果;</p><p> (3)可以完成正負(fù)10000以?xún)?nèi)的加減乘除運(yùn)算,如果超出范圍,</p><p> 則在液晶顯示器上顯示Out of range!!!!;</p><p> ?。?)進(jìn)行除法運(yùn)算時(shí),除數(shù)為零時(shí)顯示ERROR!!!。</p><p><b&g
12、t; 2.2 方案設(shè)計(jì) </b></p><p> 根據(jù)設(shè)計(jì)要求,本系統(tǒng)選用STC89C51單片機(jī)為主控機(jī)。 </p><p> 利用單片機(jī)STC89C51設(shè)計(jì)的計(jì)算器具體考慮如下: </p><p> (1)使用單片機(jī)的P0口和P2.0、P2.1、P2.2控制1602液晶顯示器 </p><p> ?。?)使用P1口作為
13、計(jì)算器矩陣鍵盤(pán)的接口 </p><p> ?。?)使用c語(yǔ)言編程實(shí)現(xiàn)所需要的功能 </p><p><b> 系統(tǒng)模塊圖:</b></p><p> 圖2-1 系統(tǒng)模塊圖</p><p> 根據(jù)需要我們可以采用自上而下的程序設(shè)計(jì)方法,此方法先從主程序開(kāi)始設(shè)計(jì),然后再編制各從屬程序和子程序,層層細(xì)化逐步求精,最終完成
14、一個(gè)復(fù)雜程序的設(shè)計(jì)。這種方法比較符合人們的日常思維,缺點(diǎn)是一級(jí)的程序錯(cuò)誤會(huì)對(duì)整個(gè)程序產(chǎn)生影響。但是,這種方法設(shè)計(jì)程序出現(xiàn)錯(cuò)誤能很方便的指導(dǎo)錯(cuò)誤出現(xiàn)在哪個(gè)函數(shù)或者子函數(shù),檢查起來(lái)很方便。</p><p> 第三章 硬件模塊介紹</p><p><b> 3.1 運(yùn)算模塊 </b></p><p> MCS-51 單片機(jī)是在一塊芯片中集成了C
15、PU、RAM、ROM、定時(shí)器/計(jì)數(shù)器和多功能I/O等一臺(tái)計(jì)算機(jī)所需要的基本功能部件。如果按功能劃分,它由如下功能部件組成,即微處理器(CPU)、數(shù)據(jù)存儲(chǔ)器(RAM)、程序存儲(chǔ)器(ROM/EPROM)、并行I/O 口、串行口、定時(shí)器/計(jì)數(shù)器、中斷系統(tǒng)及特殊功能寄存器(SFR)。單片機(jī)是靠程序運(yùn)行的,并且可以修改。通過(guò)不同的程序?qū)崿F(xiàn)不同的功能,尤其是特殊的獨(dú)特的一些功能,通過(guò)使用單片機(jī)編寫(xiě)的程序可以實(shí)現(xiàn)高智能,高效率以及高可靠性。因此我們采
16、用單片機(jī)作為計(jì)算器的核心功能部件,可以進(jìn)行很快地實(shí)現(xiàn)運(yùn)算功能,如圖3-1所示:</p><p> 圖3-1 STC89C51單片機(jī)芯片</p><p> 3.2 單片機(jī)概況 </p><p> 3.2.1單片機(jī)(STC89C51)引腳功能 </p><p> 51系列單片機(jī)8031、8051及89C51/89S51均采用40Pin封裝
17、的雙列直接DIP結(jié)構(gòu)。上圖是它們的引腳配置:40個(gè)引腳中,正電源和地線(xiàn)兩根,外置石英振蕩器的時(shí)鐘線(xiàn)兩根,4組8位共32個(gè)I/O口,中斷口線(xiàn)與P3口線(xiàn)復(fù)用,如圖3-1所示。</p><p> 3.2.2單片機(jī)(STC89C51)引腳功能</p><p> 3.2.2.1 電源引腳</p><p> 3.2.2.2 外接晶振引腳</p><p&
18、gt; XTAL1(19腳)是片內(nèi)振蕩器的反相放大器輸入端,XTAL2(18腳)則是輸出端。如果晶振為12MHz,時(shí)鐘周期就為1/12us。我們使用的STC89C51系列單片機(jī)的時(shí)鐘范圍約在1MHz~24MHz。</p><p> 3.2.2.3 復(fù)位引腳</p><p> RST(9腳)為復(fù)位信號(hào)輸入端。通常只要保證該引腳持續(xù)2個(gè)機(jī)器周期的高電平就會(huì)使單片機(jī)復(fù)位。復(fù)位后P0-P3口
19、均置1引腳表現(xiàn)為高電平,程序計(jì)數(shù)器和特殊功能寄存器SFR全部清零。</p><p> 3.2.2.4 輸入輸出(I/O)引腳</p><p> P0口(32-39腳):當(dāng)向外部存儲(chǔ)器讀/寫(xiě)數(shù)據(jù)時(shí),P0口和P2口配合完成低8位地址的傳送后,P0口再傳送8位數(shù)據(jù)。 </p><p> P1口(1-8腳):只具有普通I/O功能。 </p><p&
20、gt; P2口(21-28腳):當(dāng)向外部存儲(chǔ)器讀/寫(xiě)數(shù)據(jù)時(shí),P2口用于傳送高8位地址。 </p><p> P3口(10-17腳):P3口除了完成I/O功能這一本職工作,還有許多非常重要的兼職任務(wù),具體請(qǐng)看下表3-1:</p><p> 表3-1 P3口復(fù)用表</p><p> 3.2.2.5 其它的控制或復(fù)用引腳</p><p>
21、 (1) ALE/PROG(30腳) 地址鎖存信號(hào)輸出端/EPROG編程脈沖輸入端。當(dāng)訪(fǎng)問(wèn)外部存儲(chǔ)器時(shí),用于將P0口的地址鎖存在外部鎖存其中。 </p><p> (2) PSEN (29腳):片外ROM選通信號(hào)。 </p><p> (3) EA/VPP(31腳):內(nèi)/ 外部ROM選擇端。</p><p> 第四章 整體設(shè)計(jì)方案</p><
22、;p><b> 4.1 復(fù)位電路 </b></p><p> RST為復(fù)位信號(hào)輸入端。只要保證該引腳持續(xù)2個(gè)機(jī)器周期的高電平就會(huì)使單片機(jī)復(fù)位。 </p><p> 復(fù)位電路如下圖,10K的電阻跟10uF的電容形成一個(gè)RC電路,上電后在復(fù)位端形成一個(gè)高電平,保持時(shí)間超過(guò)2個(gè)機(jī)器周期,單片機(jī)實(shí)現(xiàn)上電復(fù)位。當(dāng)手動(dòng)按下按鍵式,在復(fù)位端也會(huì)超過(guò)2個(gè)周期的高電平,單片
23、機(jī)實(shí)現(xiàn)手動(dòng)復(fù)位!</p><p><b> 圖4-1 復(fù)位電路</b></p><p> 4.2 時(shí)鐘電路 </p><p> 設(shè)計(jì)所用的晶振頻率是12MHz </p><p> 晶振兩端分別接上單片機(jī)的晶振接口,并上兩個(gè)電容是為了提高時(shí)鐘信號(hào)的穩(wěn)定性。常用的為30pf的瓷片電容。電路如下圖所示:</p&
24、gt;<p><b> 圖4-2 時(shí)鐘電路</b></p><p> 4.3 輸入模塊</p><p> 鍵盤(pán)是單片機(jī)常用輸入設(shè)備,在按鍵數(shù)量較多時(shí),為了節(jié)省I/O口等單片機(jī)資源,一般采取掃描的方式來(lái)識(shí)別到底是哪一個(gè)鍵被按下。即通過(guò)確定被按下的鍵處在哪一行哪一列來(lái)確定該鍵的位置,獲取鍵值以啟動(dòng)相應(yīng)的功能程序。</p><p&
25、gt; 4*4矩陣鍵盤(pán)的結(jié)構(gòu)如圖4-3。在本例中,矩陣鍵盤(pán)的四列依次接到單片機(jī)的P1.0~P1.3,四行依次接到單片機(jī)的P1.4~P1.7;同時(shí),將列線(xiàn)上拉,通過(guò)10K電阻接電源。</p><p><b> 圖4-3 矩陣鍵盤(pán)</b></p><p> 查找哪個(gè)按鍵被按下的方法為:一個(gè)一個(gè)地查找。先第一行輸出0,檢查列線(xiàn)是否非全高;否則第二行輸出0,檢查列線(xiàn)是否
26、非全高;否則第三行輸出0,檢查列線(xiàn)是否非全高;如果某行輸出0時(shí),查到列線(xiàn)非全高,則該行有按鍵按下;根據(jù)第幾行線(xiàn)輸出0與第幾列線(xiàn)讀入為0,即可判斷在具體什么位置的按鍵按下。</p><p><b> 4.4 顯示模塊 </b></p><p> 4.4.1 1602液晶顯示器 </p><p> 液晶具體積小、功耗低、顯示操作簡(jiǎn)單等優(yōu)點(diǎn),但
27、致命缺點(diǎn)是溫度范圍很窄。本系統(tǒng)使用的是1602液晶顯示器(LCD)。1602液晶為5V電壓驅(qū)動(dòng),帶背光,可顯示兩行,每行16個(gè)字符,不能顯示漢字,內(nèi)置含128個(gè)字符的ASCII字符集字庫(kù)。</p><p> 圖4-4 1602字符型液晶顯示器實(shí)物</p><p> 4.4.2 芯片簡(jiǎn)介 </p><p> 4.4.2.1 接口信號(hào)說(shuō)明(表4-1如下)</
28、p><p> 表4-1 LCD引腳介紹</p><p> 4.4.2.2 主要技術(shù)參數(shù)(表4-2如下)</p><p> 表4-2 主要技術(shù)參數(shù)</p><p> 圖4-5 1602LCD尺寸圖</p><p> 4.4.2.3 1602LCD的指令說(shuō)明及時(shí)序</p><p> 1602
29、液晶模塊內(nèi)部的控制器共有11條控制指令,如表4-3所示:</p><p> 表4-3 控制命令表</p><p> 1602液晶模塊的讀寫(xiě)操作、屏幕和光標(biāo)的操作都是通過(guò)指令編程來(lái)實(shí)現(xiàn)的。(說(shuō)明:1為高電平、0為低電平)</p><p> 指令1:清顯示,指令碼01H,光標(biāo)復(fù)位到地址00H位置。</p><p> 指令2:光標(biāo)復(fù)位,光標(biāo)
30、返回到地址00H。</p><p> 指令3:光標(biāo)和顯示模式設(shè)置 I/D:光標(biāo)移動(dòng)方向,高電平右移,低電平左移 S:屏幕上所有文字是否左移或者右移。高電平表示有效,低電平則無(wú)效。</p><p> 指令4:顯示開(kāi)關(guān)控制。 D:控制整體顯示的開(kāi)與關(guān),高電平表示開(kāi)顯示,低電平表示關(guān)顯示 C:控制光標(biāo)的開(kāi)與關(guān),高電平表示有光標(biāo),低電平表示無(wú)光標(biāo) B:控制光標(biāo)是否閃爍,高電平閃爍,低電平不閃爍
31、。</p><p> 指令5:光標(biāo)或顯示移位 S/C:高電平時(shí)移動(dòng)顯示的文字,低電平時(shí)移動(dòng)光標(biāo)。</p><p> 指令6:功能設(shè)置命令 DL:高電平時(shí)為4位總線(xiàn),低電平時(shí)為8位總線(xiàn) N:低電平時(shí)為單行顯示,高電平時(shí)雙行顯示 F: 低電平時(shí)顯示5x7的點(diǎn)陣字符,高電平時(shí)顯示5x10的點(diǎn)陣字符。</p><p> 指令7:字符發(fā)生器RAM地址設(shè)置。</p&
32、gt;<p> 指令8:DDRAM地址設(shè)置。</p><p> 指令9:讀忙信號(hào)和光標(biāo)地址 BF:為忙標(biāo)志位,高電平表示忙,此時(shí)模塊不能接收命令或者數(shù)據(jù),如果為低電平表示不忙。</p><p><b> 指令10:寫(xiě)數(shù)據(jù)。</b></p><p><b> 指令11:讀數(shù)據(jù)。</b></p>
33、;<p> 與HD44780相兼容的芯片時(shí)序表如下:</p><p> 表4-4基本操作時(shí)序表</p><p> 讀寫(xiě)操作時(shí)序如圖4-6和4-7所示:</p><p> 圖4-6 讀操作時(shí)序</p><p> 圖4-7 寫(xiě)操作時(shí)序</p><p> 4.4.2.4 1602LCD的RAM地址映
34、射及標(biāo)準(zhǔn)字庫(kù)表</p><p> 液晶顯示模塊是一個(gè)慢顯示器件,所以在執(zhí)行每條指令之前一定要確認(rèn)模塊的忙標(biāo)志為低電平,表示不忙,否則此指令失效。要顯示字符時(shí)要先輸入顯示字符地址,也就是告訴模塊在哪里顯示字符,圖4-8是1602的內(nèi)部顯示地址。</p><p> 圖4-8 1602LCD內(nèi)部顯示地址</p><p> 例如第二行第一個(gè)字符的地址是40H,那么是否
35、直接寫(xiě)入40H就可以將光標(biāo)定位在第二行第一個(gè)字符的位置呢?這樣不行,因?yàn)閷?xiě)入顯示地址時(shí)要求最高位D7恒定為高電平1所以實(shí)際寫(xiě)入的數(shù)據(jù)應(yīng)該是01000000B(40H)+10000000B(80H)=11000000B(C0H)。</p><p> 在對(duì)液晶模塊的初始化中要先設(shè)置其顯示模式,在液晶模塊顯示字符時(shí)光標(biāo)是自動(dòng)右移的,無(wú)需人工干預(yù)。每次輸入指令前都要判斷液晶模塊是否處于忙的狀態(tài)。</p>
36、<p> 1602液晶模塊內(nèi)部的字符發(fā)生存儲(chǔ)器(CGROM)已經(jīng)存儲(chǔ)了160個(gè)不同的點(diǎn)陣字符圖形,如圖4-9所示,這些字符有:阿拉伯?dāng)?shù)字、英文字母的大小寫(xiě)、常用的符號(hào)、和日文假名等,每一個(gè)字符都有一個(gè)固定的代碼,比如大寫(xiě)的英文字母“A”的代碼是01000001B(41H),顯示時(shí)模塊把地址41H中的點(diǎn)陣字符圖形顯示出來(lái),我們就能看到字母“A”。</p><p> 圖4-9 1602液晶顯示器字庫(kù)&l
37、t;/p><p> 單片機(jī)系統(tǒng)與液晶接口如下圖所示:</p><p> 圖4-10 液晶顯示器接口</p><p><b> 第五章 程序設(shè)計(jì)</b></p><p> 5.1輸入程序流程圖設(shè)計(jì) </p><p> 為了實(shí)現(xiàn)鍵盤(pán)的數(shù)據(jù)輸入功能和命令處理功能,每個(gè)鍵都有其處理子程序,為此每個(gè)
38、鍵都對(duì)應(yīng)一個(gè)碼——鍵碼。為了得到被按鍵的鍵碼,現(xiàn)使用行掃描法識(shí)別按鍵。列掃描信號(hào)進(jìn)行讀入行的信號(hào)判斷該列是否有列的輸出——是則進(jìn)行按照行列計(jì)算鍵盤(pán)的值,查表取得鍵碼并返回——若否則進(jìn)行再次掃描。其程序框圖(圖5-1)如下:</p><p> 圖5-1 鍵盤(pán)輸入程序流程圖</p><p> 5.2 LCD顯示程序設(shè)計(jì) </p><p> 根據(jù)LCD1602的工作
39、原理,考慮到本設(shè)計(jì)只需要顯示計(jì)算式和計(jì)算結(jié)果,程序中采用了三個(gè)子程序就完成了LCD1602的顯示功能。這三個(gè)子程序分別是:忙狀態(tài)檢測(cè)程序、寫(xiě)命令程序和寫(xiě)數(shù)據(jù)程序,通過(guò)調(diào)用三個(gè)子程序就可以實(shí)現(xiàn)LCD1602的工作模式設(shè)置以及數(shù)據(jù)的顯示</p><p> 5.3 主程序的設(shè)計(jì)</p><p> 首先初始化參數(shù),送LCD顯示“0”。然后掃描鍵盤(pán)看是否有鍵輸入,若有,讀取鍵碼。判斷鍵碼是數(shù)字鍵
40、、清零鍵還是功能鍵(“+”“-”“*”“/”“=” ),是數(shù)值鍵則送LCD顯示并保存數(shù)值,是清零鍵則做清零處理,是功能鍵則又判斷是“=”還是運(yùn)算鍵,若是“=”則計(jì)算最后結(jié)果并送LED顯示,若是運(yùn)算鍵則保存相應(yīng)運(yùn)算鍵定義的數(shù)值,以便后續(xù)計(jì)算。</p><p> 圖5-2 主程序流程圖</p><p><b> 小結(jié)</b></p><p>
41、 課程設(shè)計(jì)是培養(yǎng)我們綜合運(yùn)用所學(xué)知識(shí),發(fā)現(xiàn)、提出、分析和解決實(shí)際問(wèn)題,鍛煉實(shí)踐能力的重要環(huán)節(jié),是對(duì)我們實(shí)際工作能力的具體訓(xùn)練和考察過(guò)程。隨著科學(xué)技術(shù)發(fā)展的日新日異,單片機(jī)已經(jīng)成為當(dāng)今計(jì)算機(jī)應(yīng)用中空前活躍的領(lǐng)域, 在生活中可以說(shuō)得是無(wú)處不在。因此作為計(jì)算機(jī)專(zhuān)業(yè)的學(xué)生來(lái)說(shuō)掌握單片機(jī)的開(kāi)發(fā)技術(shù)是十分重要的。</p><p> 本次課程設(shè)計(jì)我選定的題目是簡(jiǎn)易計(jì)算器的設(shè)計(jì),看似簡(jiǎn)單的設(shè)計(jì),在實(shí)際設(shè)計(jì)過(guò)程中還是不那么簡(jiǎn)單的
42、,雖然本次設(shè)計(jì)還存在一定的不足之處:1、不能進(jìn)行負(fù)數(shù)的運(yùn)算;2、不能進(jìn)行連續(xù)運(yùn)算;3、雖然能進(jìn)行連續(xù)輸入運(yùn)算符的更新覆蓋,但是任然會(huì)顯示所有輸入;4、必須手動(dòng)清屏。但是本下設(shè)計(jì)的過(guò)程中,我學(xué)到了很多。首先,是對(duì)單片機(jī)為核心的硬件電路有了一定的了解和熟悉,其次,本次設(shè)計(jì)采用了C語(yǔ)言編程,使我對(duì)結(jié)構(gòu)化程序設(shè)計(jì)有了新的認(rèn)識(shí),最后,本次設(shè)計(jì)使用了PROTEUS仿真,使我對(duì)單片機(jī)仿真有了一定的了解,為我以后的單片機(jī)設(shè)計(jì)莫定了基礎(chǔ)。</p&g
43、t;<p><b> 【參考文獻(xiàn)】</b></p><p> [1]《例說(shuō)51單片機(jī)(C語(yǔ)言版)》張義和、王敏男等 人民郵電出版社</p><p> [2]《單片機(jī)原理與接口技術(shù)》(第3版)李朝青編著 北京航空航天大學(xué)出版社</p><p> [3]《單片機(jī)原理與應(yīng)用實(shí)例仿真》(第2版)李泉溪主編 北京航空航天大學(xué)出
44、版社</p><p> [4]《電工學(xué)電子技術(shù)》(第6版)秦曾煌主編 高等教育出版社</p><p> [5]《51單片機(jī)C語(yǔ)言教程——入門(mén)、提高、開(kāi)發(fā)、拓展全攻略》(2009年12月)郭天祥主編 電子工業(yè)出版 </p><p><b> 程序附錄:</b></p><p> #include <RE
45、GX52.H></p><p><b> //定義引腳</b></p><p> #define DATA_BUS P0//LCD數(shù)據(jù)總線(xiàn) </p><p> #define RS P2_0//LCD的三條控制總線(xiàn)</p><p> #define RW P2_1 </p><p>
46、 #define E P2_2</p><p> #define key P1//按鍵使用的引腳</p><p><b> //定義數(shù)據(jù)類(lèi)型</b></p><p> #define uchar unsigned char//無(wú)符號(hào)字符型</p><p> #define uint unsigned int/
47、/無(wú)符號(hào)整型</p><p><b> //申明函數(shù)</b></p><p> void check_busy(void);//LCD讀忙碌函數(shù)</p><p> void write_command(uchar com);//LCD寫(xiě)命令函數(shù)</p><p> void write_data(uchar dat
48、e);//LCD寫(xiě)數(shù)據(jù)函數(shù)</p><p> void LCD_init(void);//LCD初始化函數(shù)</p><p> void display(uchar*);//LCD顯示字符串函數(shù)</p><p> void delay(uint);//延時(shí)函數(shù)(ms)</p><p> char Check_Key(void);//按鍵
49、掃描函數(shù)</p><p> void start(void);//LCD開(kāi)始工作顯示函數(shù)</p><p> void shuru();//主循環(huán)函數(shù)</p><p> void init();//初始化參數(shù)</p><p> signed long calculate(signed long,signed long,uchar);//
50、計(jì)算子函數(shù)</p><p> signed long get_Num(signed long,uchar);//獲得輸入字符的數(shù)據(jù)大小</p><p><b> //申明變量</b></p><p> uchar val,flag1='0',flag2='0',flag3='0';//申明標(biāo)
51、識(shí)符</p><p> signed long firstNum,lastNum,result;//申明中間計(jì)算數(shù)</p><p> uchar error[]="ERROR!!!";//錯(cuò)誤時(shí)顯示字符串</p><p> uchar over[]="Out of range!!!!";//超出范圍顯示字符串</p
52、><p> uchar start1[]="design for";//啟動(dòng)時(shí)顯示字符串</p><p> uchar start2[]="children under 3";//啟動(dòng)時(shí)顯示字符串</p><p><b> //主函數(shù)</b></p><p> void mai
53、n(void)</p><p><b> {</b></p><p> key=0;//初始化鍵盤(pán)掃描口</p><p><b> start();</b></p><p> LCD_init();</p><p><b> while(1)</b&
54、gt;</p><p><b> {</b></p><p><b> shuru();</b></p><p><b> }</b></p><p><b> }</b></p><p><b> //循環(huán)主函
55、數(shù) </b></p><p> void shuru()</p><p><b> {</b></p><p> Check_Key();//鍵盤(pán)掃描</p><p> if(flag1=='1')//讀到鍵flag1置1</p><p><b>
56、{</b></p><p> val=Check_Key();//獲得鍵值</p><p> write_data(val);//顯示獲得鍵值</p><p> if(val<='9'&&val>='0')//獲得0-9之間的數(shù)</p><p><b>
57、 {</b></p><p> if(flag2=='0')//獲得第一個(gè)數(shù)</p><p><b> {</b></p><p> firstNum=get_Num(firstNum,val);//計(jì)算第一個(gè)數(shù)大小</p><p> if(firstNum>10000||fi
58、rstNum<-10000)//判斷第一個(gè)數(shù)是否超出范圍</p><p><b> {</b></p><p> LCD_init();//LCD初始化</p><p> display(over);//顯示超出范圍字符串</p><p><b> return;</b></p&
59、gt;<p><b> }</b></p><p><b> }</b></p><p> if(flag2=='1')//獲得第二個(gè)數(shù)</p><p><b> {</b></p><p> lastNum=get_Num(las
60、tNum,val);//獲得第二個(gè)數(shù)的大小</p><p> if(lastNum>10000||lastNum<-10000)//判斷第二個(gè)數(shù)是否超出范圍</p><p><b> {</b></p><p> LCD_init();//LCD初始化</p><p> display(over);/
61、/顯示超出范圍字符串</p><p><b> return;</b></p><p><b> }</b></p><p><b> }</b></p><p><b> }</b></p><p> if(val
62、>'9'||val<'0')//獲得非數(shù)字字符</p><p><b> {</b></p><p> flag2='1';//flag2置1,表示下次輸入的為第二個(gè)數(shù)</p><p> switch(val)//判斷輸入的計(jì)算符號(hào),并記錄方便之后計(jì)算</p>&l
63、t;p><b> {</b></p><p> case '+':flag3='1';break;//flag3標(biāo)志運(yùn)算符</p><p> case '-':flag3='2';break;</p><p> case '*':flag3='
64、3';break;</p><p> case '/':flag3='4';break;</p><p> default:break;</p><p><b> }</b></p><p><b> }</b></p><p&g
65、t; if(val=='c')//輸入清零</p><p><b> {</b></p><p> LCD_init();//LCD初始化</p><p> init();//初始化參數(shù)</p><p><b> }</b></p><p> if
66、(val=='=')//輸入等號(hào)</p><p><b> {</b></p><p> result=calculate(firstNum,lastNum,flag3);//調(diào)用計(jì)算函數(shù)計(jì)算結(jié)果</p><p> firstNum=result;//將結(jié)果賦給firstNum</p><p>
67、write_command(0xc0);//修改LCD顯示位置(左下角開(kāi)始),顯示方式(從右到左顯示)</p><p> write_command(0x04);</p><p> write_command(0xcf);</p><p> if(result<0)//負(fù)數(shù)顯示</p><p><b> {</b
68、></p><p> result=-result;//取反得到正數(shù)</p><p> while(result!=0)//從低位到高位顯示</p><p><b> {</b></p><p><b> int a=0;</b></p><p> a=res
69、ult%10;</p><p> write_data(a+'0');</p><p> result=result/10;</p><p><b> }</b></p><p> write_data('-');//顯示負(fù)號(hào)</p><p><b&g
70、t; }</b></p><p> else if(result>0)//正數(shù)顯示</p><p><b> {</b></p><p> while(result!=0)//從低位到高位顯示</p><p><b> {</b></p><p>
71、<b> int a=0;</b></p><p> a=result%10;</p><p> write_data(a+'0');</p><p> result=result/10;</p><p><b> }</b></p><p><
72、;b> }</b></p><p><b> else//顯示零</b></p><p> write_data('0');</p><p> write_command(0x0c);//修改LCD顯示方式(從左到右顯示),顯示位置(右上角開(kāi)始)</p><p> write_
73、command(0x06);</p><p> write_command(0x80); </p><p> init();//初始化參數(shù)</p><p><b> }</b></p><p> flag1='0';//為下次讀鍵做準(zhǔn)備</p><p><b>
74、; }</b></p><p><b> }</b></p><p><b> //初始化參數(shù)</b></p><p> void init()</p><p><b> {</b></p><p> flag1='0
75、39;;//標(biāo)志是否讀到鍵</p><p> flag2='0';//標(biāo)志讀到的是第幾個(gè)運(yùn)算數(shù)</p><p> flag3='0';//標(biāo)志讀到的是哪一個(gè)運(yùn)算符</p><p> val='0';//存儲(chǔ)讀道的鍵值</p><p> firstNum=0;//輸入的第一個(gè)運(yùn)算數(shù)<
76、/p><p> lastNum=0;//輸入的第一個(gè)運(yùn)算數(shù)</p><p> result=0;//運(yùn)算的結(jié)果</p><p><b> }</b></p><p><b> //計(jì)算子函數(shù)</b></p><p> signed long calculate(sig
77、ned long firstNum,signed long lastNum,uchar flag3)</p><p><b> {</b></p><p> signed long a=0;</p><p> switch(flag3)</p><p><b> {</b></p&g
78、t;<p> case '1':a=firstNum+lastNum;break;//加法運(yùn)算</p><p> case '2':a=firstNum-lastNum;break;//減法運(yùn)算</p><p> case '3':a=firstNum*lastNum;break;//乘法運(yùn)算</p><
79、;p><b> case '4':</b></p><p> if(lastNum==0)//除數(shù)為零錯(cuò)誤</p><p><b> {</b></p><p> LCD_init();</p><p> display(error);</p><
80、p><b> return 0;</b></p><p><b> }</b></p><p><b> else</b></p><p> a=firstNum/lastNum;//除法運(yùn)算</p><p><b> break;</b>
81、</p><p> default:a=firstNum;break;//為等號(hào)時(shí)直接輸出第一個(gè)數(shù)</p><p><b> }</b></p><p> return a;//返回計(jì)算結(jié)果</p><p><b> }</b></p><p> //用于顯示一個(gè)
82、字符串</p><p> void display(uchar aa[])</p><p><b> {</b></p><p><b> int i=0;</b></p><p> while(aa[i]!='\0')</p><p><b&g
83、t; {</b></p><p> if(i==16)//長(zhǎng)度超過(guò)16時(shí)換行</p><p> write_command(0xc0); </p><p> write_data(aa[i++]);</p><p><b> }</b></p><p><b>
84、; }</b></p><p> //延時(shí)程序(約j毫秒)</p><p> void delay(uint j)</p><p><b> { </b></p><p> uchar i = 60;</p><p> for(; j>0; j--)</p>
85、;<p><b> { </b></p><p> while(--i);</p><p><b> i = 59;</b></p><p> while(--i);</p><p><b> i = 60;</b></p><p&g
86、t;<b> }</b></p><p><b> }</b></p><p> //檢驗(yàn)LCD是否忙碌</p><p> void check_busy(void)</p><p><b> { </b></p><p><b>
87、 do</b></p><p><b> { </b></p><p> DATA_BUS = 0xff;</p><p><b> E = 0;</b></p><p><b> RS = 0; </b></p><p><b
88、> RW = 1;</b></p><p><b> E = 1;</b></p><p><b> delay(5);</b></p><p> } while(DATA_BUS & 0x80);</p><p><b> E = 0;</b&g
89、t;</p><p><b> }</b></p><p> //向LCD寫(xiě)入一個(gè)命令</p><p> void write_command(uchar com)</p><p><b> { </b></p><p> check_busy();</p&
90、gt;<p><b> E = 0;</b></p><p><b> RS = 0;</b></p><p><b> RW = 0;</b></p><p> DATA_BUS = com;</p><p><b> E = 1;</
91、b></p><p><b> delay(5);</b></p><p><b> E = 0;</b></p><p><b> delay(1);</b></p><p><b> }</b></p><p>
92、 //向LCD寫(xiě)入一個(gè)數(shù)據(jù)</p><p> void write_data(uchar date)</p><p><b> { </b></p><p> check_busy();</p><p><b> E = 0;</b></p><p><b>
93、; RS = 1;</b></p><p><b> RW = 0;</b></p><p> DATA_BUS = date;</p><p><b> E = 1;</b></p><p><b> delay(5);</b></p>&
94、lt;p><b> E = 0;</b></p><p> delay(1); </p><p><b> }</b></p><p><b> //初始化LCD</b></p><p> void LCD_init(void)</p><
95、;p><b> { </b></p><p> write_command(0x38);//16x2顯示</p><p> write_command(0x0f);//開(kāi)顯示,開(kāi)光標(biāo),開(kāi)顯示 </p><p> write_command(0x06);//地址指針自加一,光標(biāo)自加一</p><p> wr
96、ite_command(0x01);//清屏</p><p> write_command(0xcf);//設(shè)置光標(biāo)位置右下角</p><p> write_data('0');//顯示數(shù)字0</p><p> write_command(0x80);//設(shè)置光標(biāo)位置左上角</p><p><b> dela
97、y(1);</b></p><p><b> }</b></p><p><b> //鍵盤(pán)掃描</b></p><p> char Check_Key(void)</p><p><b> {</b></p><p> char
98、key_Map[]={'+','-','*','/','=','3','6','9','0','2','5','8','c','1','4','7'};</p><
99、p> unsigned char row,col,tmp1,tmp2,key_val;</p><p> tmp1 = 0x10;//tmp1用來(lái)設(shè)置P1口的輸出,取反后使P1.4~P1.7中有一個(gè)為0</p><p> for(row=0;row<4;row++)// 行檢測(cè)</p><p><b> {</b></
100、p><p> key = 0x0f;//先將p1.4~P1.7置高</p><p> key =~tmp1;//使P1.4~p1.7中有一個(gè)為0</p><p> tmp1*=2;//tmp1左移一位</p><p> if ((key & 0x0f) < 0x0f)//檢測(cè)P1.0~P1.3中是否有一位為0,只要有,則說(shuō)明
101、此行有鍵按下,進(jìn)入列檢測(cè)</p><p><b> { </b></p><p> tmp2 = 0x01;//tmp2用于檢測(cè)出哪一列為0</p><p> for(col =0;col<4;col++)//列檢測(cè)</p><p><b> { </b></p>&
102、lt;p> if((key & tmp2)==0x00)//該列如果為低電平則可以判定為該列</p><p><b> { </b></p><p> key_val =key_Map[row*4+col];//獲取鍵值,識(shí)別按鍵;key_Map為按鍵的定義表</p><p> flag1='1';//標(biāo)志
103、獲得了一個(gè)字符</p><p> while((key & 0x0f) < 0x0f);</p><p> delay(750);</p><p> if((key & 0x0f) < 0x0f);</p><p> return key_val;//退出循環(huán)</p><p><
104、;b> }</b></p><p> tmp2*=2;//tmp2左移一位</p><p><b> }</b></p><p><b> }</b></p><p><b> }</b></p><p> return k
105、ey_val;//返回獲得鍵值</p><p><b> }</b></p><p> //獲得輸入字符的數(shù)據(jù)大小 </p><p> signed long get_Num(signed long Num,uchar val)</p><p><b> {</b></p>&
106、lt;p><b> long a;</b></p><p> a=Num*10+(val-'0');</p><p> return a;</p><p><b> }</b></p><p> //LCD開(kāi)始工作顯示函數(shù)</p><p>
107、 void start()</p><p><b> {</b></p><p> write_command(0x38);//16x2顯示</p><p> write_command(0x0f);//開(kāi)顯示,開(kāi)光標(biāo),開(kāi)顯示 </p><p> write_command(0x06);//地址指針自加一,光標(biāo)自
108、加一</p><p> write_command(0x01);//清屏</p><p> write_command(0x80+0x03);//調(diào)整第一行字符顯示位置</p><p> display(start1);//顯示第一行字符</p><p> write_command(0xc0);//調(diào)整第二行字符顯示</p&g
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫(kù)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 單片機(jī)課程設(shè)計(jì)-- 單片機(jī)原理及應(yīng)用
- 單片機(jī)原理及應(yīng)用課程設(shè)計(jì)
- 單片機(jī)原理及應(yīng)用課程設(shè)計(jì)
- 單片機(jī)手機(jī)鍵盤(pán)-單片機(jī)原理及應(yīng)用課程設(shè)計(jì)
- 單片機(jī)原理及應(yīng)用課程設(shè)計(jì)--基于單片機(jī)的電子時(shí)鐘設(shè)計(jì)
- 單片機(jī)課程設(shè)計(jì)--單片機(jī)串行通訊
- 單片機(jī)課程設(shè)計(jì)---單片機(jī)數(shù)字時(shí)鐘
- 《單片機(jī)原理及應(yīng)用》課程設(shè)計(jì)—單片機(jī)電子琴設(shè)計(jì)
- 單片機(jī)課程設(shè)計(jì)--單片機(jī)io口的應(yīng)用
- 單片機(jī)原理及系統(tǒng)課程設(shè)計(jì)--基于單片機(jī)的電子鬧鐘設(shè)計(jì)
- 單片機(jī)秒表單片機(jī)課程設(shè)計(jì)
- 單片機(jī)原理及系統(tǒng)課程設(shè)計(jì)
- 單片機(jī)原理及系統(tǒng)課程設(shè)計(jì)
- 單片機(jī)課程設(shè)計(jì)-單片機(jī)課程設(shè)計(jì)---電子時(shí)鐘
- lcd單片機(jī)原理課程設(shè)計(jì)
- 單片機(jī)原理及應(yīng)用課程設(shè)計(jì)(溫度測(cè)量)
- 單片機(jī)課程設(shè)計(jì)--單片機(jī)控制步進(jìn)電機(jī)
- 單片機(jī)課程設(shè)計(jì)-單片機(jī)控制步進(jìn)電機(jī)
- 單片機(jī)課程設(shè)計(jì)---單片機(jī)籃球計(jì)分器
- 單片機(jī)課程設(shè)計(jì)報(bào)告---單片機(jī)數(shù)字時(shí)鐘
評(píng)論
0/150
提交評(píng)論