版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、<p> 存檔編號 </p><p><b> 畢 業(yè) 設 計</b></p><p> 題目 簡易計算器的制作 </p><p> 學 院 信息工程學院 </p><p> 專 業(yè) 通信
2、工程 </p><p> 姓 名 XX </p><p> 學 號 2XXXX </p><p> 指導教師 XX </p><p> 完成時間 2014.5.14 </p>&l
3、t;p><b> 目 錄</b></p><p><b> 摘 要1</b></p><p> Abstract2</p><p><b> 第一章緒論3</b></p><p> 1.1 開發(fā)背景3</p><p> 1
4、.2 設計目的4</p><p> 第二章方案論證與設計5</p><p> 2.1設計指標5</p><p> 2.2方案論證與設計5</p><p> 第三章硬件模塊介紹8</p><p> 3.1主控及運算模塊8</p><p> 3.2顯示模塊13
5、</p><p> 3.3輸入模塊16</p><p> 第四章軟件設計18</p><p> 4.1主程序的設計18</p><p> 4.2鍵盤掃描的程序設計19</p><p> 4.3顯示模塊程序設計21</p><p> 4.4運算模塊程序設計23&
6、lt;/p><p> 第五章仿真及調試24</p><p><b> 結束語25</b></p><p><b> 致 謝26</b></p><p><b> 參考文獻27</b></p><p> 附錄一:硬件實物圖28</
7、p><p> 附錄二:系統(tǒng)程序29</p><p> 附錄三:任務書40</p><p> 附錄四:開題報告42</p><p> 附錄五:外文原文與外文譯文47</p><p> 基于AT89C51單片機的簡易計算器的設計</p><p><b> 摘 要</b
8、></p><p> 計算器在人們的日常生活中是較為常見的電子產品之一。初期的計算器僅僅能實現簡單的加減乘除運算,而現在人們所廣泛使用的科學計算器功能已不再停留于此,除了加減乘除運算外,它還能進行乘方,開方,指數,對數,三角函數,反三角函數等的存儲和運算。而且計算器的種類和模式也在逐漸多樣化,如使用太陽能電池的計算器,使用ASIC制作的計算器,使用純軟件設計的計算器和被集成到手機、平板電腦等電子產品中的計
9、算器??梢哉f計算器還正在發(fā)展之中而且還將有很大的發(fā)展空間,未來必將出現功能更加強大的計算器?;谶@樣的理念,本設計以AT89C51單片機為核心,以軟硬件結合的方式設計了一個簡易計算器。該計算器以4*4矩陣鍵盤為輸入方式,可以進行4位帶符號數的加減乘除運算,并在LCD1602液晶顯示器上顯示操作過程。該論文詳細介紹了整個系統(tǒng)的硬件組成結構、工作原理和軟件設計思想與流程。</p><p> 關鍵詞: 計算器 AT
10、89C51 LCD1602 矩陣鍵盤</p><p> Simple calculator designed based on AT89C51</p><p><b> Abstract</b></p><p> The calculator in People's Daily life is one of the most
11、common electronic products. Early computing calculator can only implement simple addition, subtraction, multiplication, and division, but now the scientific calculator which widely used by people’s functions are no longe
12、r stay, operation besides addition, subtraction, multiplication, and division, it can also power, prescribe, index, logarithmic, trigonometric function, inverse trigonometric function such as storage and computation. And
13、 th</p><p> key words: calculator AT89C51 LCD1602 matrix keyboard</p><p><b> 緒論</b></p><p><b> 1.1 開發(fā)背景</b></p><p> 計算器是日常生活中比較常見的電子產品之
14、一,它已在數十年間遍布千家萬戶。計算器(calculator ;counter)一般是指“電子計算器”,該名詞由日文傳入中國。它是能進行數學運算的手持機器,擁有集成電路芯片,但結構簡單,比現代電腦結構簡單得多,可以說是第一代的電子計算機(電腦),且功能也較弱,但較為方便與廉價,可廣泛運用于商業(yè)交易中,是必備的辦公用品之一。除顯示計算結果外,還常有溢出指示、錯誤指示等。對于計算器的百年歷史,1946年2月15日,在美國賓夕法尼亞大學,世界
15、上第一臺電子計算器ENIAC正式投入了運行。在隆重的揭幕儀式上,ENIAC表演了它的“絕招”:在1秒鐘內進行5000次加法運算;在1秒鐘內進行500次乘法運算。這比當時最快的電器計算器的運算速度要快1000多倍。全場起立歡呼,歡呼科學技術進入了一個新的歷史發(fā)展時期。 </p><p> 電子計算器不僅是一種工具,它與其它的工具都不相同:電子計算器是人腦的一個側面的延伸。因為電子計算器不僅具有非凡的計算
16、能力,速度之快令人望塵莫及,而且還能夠仿真人的某些思維功能,按照一定的規(guī)則進行邏輯判和邏輯推理,代替人的部分腦力勞動。1976年,數學家憑借電子計算器去證明四色定理,“依靠機器完成了人沒有能夠完成的事情”,轟動了整個國際數學界。 </p><p> 隨著社會的發(fā)展和科學技術的進步,電子產品變得越來越先進,功能變得越來越強大,集成化程度也變得越來越高,其更新速度令人吃驚。對于計算器人們也在不斷地對它進行
17、改進,然而技術的進步是無止境的,如何讓計算器技術更加的成熟,充分利用現有的軟件和硬件條件,制作出更加好用的計算器,讓我們更方便的使用它,讓它更好的為我們的生活服務,始終是當今電子領域的重要研究課題。而另一方面,近年來,單片機以其體積小、價格廉、面向控制等諸多優(yōu)點,在各種工業(yè)控制、儀器儀表、產品、設備的自動化、智能化方面獲得了極為廣泛的應用。與此同時,單片機系統(tǒng)的可靠性成為人們越來越關注的重要課題。影響系統(tǒng)可靠性的因素是多方面的,如構成系
18、統(tǒng)的各種元器件本身的可靠性、系統(tǒng)本身各部分之間的相互耦合因素等。其中抗干擾性能是系統(tǒng)可靠性的重要指標。</p><p> 本設計采用AT89C51芯片和LCD1602液晶顯示器,實現了利用單片機來設計一個簡易計算器的目的。該計算器允許對四位輸入數據進行帶符號加減乘除運算,用C語言編寫程序驅動整個系統(tǒng)的運行,便于移植和升級。如果所要設計的對象是更為復雜的計算器系統(tǒng),其實際原理和實現方法與本設計基本相同。本設計關鍵
19、在于必須非常熟悉單片機的原理與結構,并能熟練的運用51C語言來編寫程序,同時還要對整個系統(tǒng)的設計流程有很好的把握,從而將單片機和其他模塊完整的銜接。</p><p> 在現今的日常生活中,計算器毫無疑問是人們的最重要工具之一,它的身影遍布在社會的各個角落,例如商店,學校等等。所以設計一款簡單但卻極其實用的計算器具有很大的實際意義,而本文中利用單片機和LCD1602液晶結合設計的計算器充分利用了以上所講的單片機的
20、諸多優(yōu)點,具有很好的實用價值。</p><p><b> 1.2 設計目的</b></p><p> 本設計旨在進一步掌握單片機理論知識,理解嵌入式單片機系統(tǒng)的硬軟件設計,加強對實際應用系統(tǒng)設計的能力。通過本設計的學習,使我掌握單片機程序設計和微機接口應用的基本方法,并能綜合運用本科階段所學軟、硬件知識分析實際問題,提高解決畢業(yè)設計實際問題的能力,為單片機應用和
21、開發(fā)打下良好的基礎。</p><p><b> 方案論證與設計</b></p><p><b> 設計指標</b></p><p> 本次設計的簡易計算器的基本性能如下:</p><p> 能夠進行4位整數的加減乘除運算(除法的結果中可以有小數)。</p><p>
22、 能夠將計算結果輸出到LCD1602液晶顯示屏中以便于觀察。</p><p> 能夠實現清除數據的功能。</p><p> 能夠進行錯誤提示(比如當輸入數據除數為0時會在LCD1602上顯示error)。</p><p><b> 方案論證與設計</b></p><p> 根據功能和以上對設計指標的描述,本系統(tǒng)采
23、用AT89C51單片機為控制芯片,LCD1602為顯示芯片,輔以其他電路所需基本器件,完成對簡易計算器的設計。具體的設計考慮如下:</p><p> 由于本次所要設計的是一個簡易計算器, 要求能夠進行4位整數的加減乘除運算,功能較為簡單,所編寫程序不會太長,故使用AT89C51單片機即可滿足需求。</p><p> 由于LCD1602液晶顯示器相比于8段數碼管而言,擁有更大的顯示量,更
24、好的顯示效果,更全面的顯示字符類型,因此這里選用LCD1602液晶顯示器作為顯示模塊。</p><p> 根據計算器的功能要求,鍵盤包括數字鍵(0-9)、符號鍵(+、—、*、÷)、清除鍵(CE)和等號鍵,故需要16個按鍵(4*4鍵盤)。</p><p> 系統(tǒng)模塊圖如圖2.1所示:</p><p> 圖2.1 系統(tǒng)模塊圖</p>&l
25、t;p> 為了更好的實現系統(tǒng)的功能,硬件電路的設計應該遵循以下原則:</p><p><b> 1、優(yōu)化硬件電路</b></p><p> 采用軟件設計與硬件設計相結合的方法;盡管采用軟件來實現硬件系統(tǒng)的功能時,也許響應時間會比單純使用硬件時長,而且還要占用微處理器(MCU)的時間;但是,用軟件實現硬件的功能可以簡化硬件結構,提高電路的可靠性。所以,在設計
26、本系統(tǒng)得時候,在滿足可靠性和實時性的前提下,盡可能的通過軟件來實現硬件功能。</p><p> 2、可靠性及抗干擾設計</p><p> 根據可靠性設計理論,系統(tǒng)所用芯片數量越少,系統(tǒng)的平均無故障時間越長。而且,所用芯片數量越少,地址和數據總線在電路板上受干擾的可能性也就越小。因此,系統(tǒng)的設計思想是在滿足功能的情況下力爭使用較少數量的芯片。</p><p>&l
27、t;b> 3、靈活的功能擴展</b></p><p> 功能擴展是否靈活是衡量一個系統(tǒng)優(yōu)劣的重要指標。一次設計往往不能完全考慮到系統(tǒng)的各個方面,系統(tǒng)需要不斷完善以及進行功能升級。進行功能擴展時,應該在原有設計的基礎上,通過修改軟件程序和少量硬件完成。對于本系統(tǒng)而言,就是要求在系統(tǒng)硬件不變的情況下,能夠通過修改軟件程序,完成功能的升級和擴展。</p><p> 而在軟
28、件方面根據設計需要我們可以采用自上而下的程序設計方法,這種方法先從主程序開始設計,之后再編制各從屬程序和子程序,層層細化逐步求精,最后完成一個復雜程序的設計。這種設計方法比較符合人們的日常思維,但是缺點是一級的程序錯誤將會對整個程序產生影響。計算器的程序流程圖如圖2.2所示:</p><p> 圖2.2 程序流程圖</p><p><b> 硬件模塊介紹</b>
29、</p><p> 主控及運算模塊 </p><p> AT89C51單片機是將微處理器(CPU),數據存儲器(RAM)、程序存儲器(4KB Flash ROM)、并行I/O 口、串行口、定時器/計數器、中斷系統(tǒng)及特殊功能寄存器(SFR)這些一臺計算機所需要的基本功能部件集成在了一塊芯片上,它靠程序運行,并可以修改程序以通過不同的程序實現不同的功能,尤其是特殊的獨特的一些功能,通
30、過單片機及其程序可以實現高智能,高效率,以及高可靠性!所以設計采用單片機作為該計算器的主控及運算模塊,可以很好的實現控制和運算功能。</p><p> AT89C51單片機引腳圖如圖3.1,其實際外觀圖如圖3.2:</p><p> 圖3.1 AT89C51單片機引腳圖</p><p> 圖3.2 AT89C51單片機實際外觀圖</p>&
31、lt;p><b> 其各引腳功能如下:</b></p><p><b> 電源引腳</b></p><p> Vcc: 正電源腳,接+5V電源。</p><p><b> GND: 接地端。</b></p><p><b> 外接晶體引腳</b&
32、gt;</p><p> 外接晶體引腳圖如圖3.3所示:</p><p> 圖3.3 外接晶體管引腳</p><p> XTAL1:片內振蕩器反相放大器和時鐘發(fā)生器電路的輸入端。使用片內振蕩器時,該引腳連接外部石英晶體和微調電容。</p><p><b> XTAL2:</b></p><p
33、> 片內振蕩器反相放大器和時鐘發(fā)生器電路的輸出端,當使用片內振蕩器時,該引腳連接外部石英晶體和微調電容。當采用外部時鐘源時,引腳XTAL1接收外部時鐘振蕩器的信號,XTAL2懸空。</p><p> 內部方式時,時鐘發(fā)生器對振蕩脈沖二分頻,比如晶振為12MHz,時鐘頻率就為6MHz。晶振的頻率可以在1MHz-24MHz內選擇,而電容則取30PF左右。</p><p> 型號同樣
34、是AT89C51的芯片,在其后面還會有頻率編號,有12,16,20,24MHz可選,在購買和選用時需注意。比如AT89C51 24PC就是最高振蕩頻率24MHz,40P封裝的普通商用芯片。</p><p><b> 控制引腳</b></p><p><b> RST</b></p><p> 復位信號輸入端,高電平有
35、效。當單片機運行時,在此引腳加上持續(xù)時間大于2個機器周期(24個時鐘振蕩周期)的高電平時,就可以對單片機完成復位操作且只要這個腳保持高電平,51芯片便循環(huán)復位。在單片機復位后P0-P3口均置1,引腳表現為高電平,程序計數器和特殊功能寄存器SFR全部清零。當RST腳電平由高變低時,單片機開始從ROM的0000H處開始運行程序。</p><p> 在單片機正常工作時,此引腳應為<=0.5V的低電平。</
36、p><p> 比較常用的復位電路如圖3.4所示。</p><p> 圖3.4 復位電路圖</p><p> 復位操作并不會對內部RAM有影響。當AT89C51通電后,時鐘電路開始工作,在RST引腳上出現24個時鐘周期以上的高電平,系統(tǒng)便初始復位,也就是說單片機開始重新執(zhí)行程序代碼。AT89C51的復位方式可以是自動復位,也同樣可以是手動復位,如圖3.5所示。<
37、;/p><p><b> 圖3.5 復位方式</b></p><p><b> EA/Vpp</b></p><p> EA為外部程序存儲器訪問控制端。</p><p> 當EA引腳為高電平時,單片機讀片內程序存儲器,但在PC值超過0FFFH時,將自動轉向訪問外部程序存儲器中的程序。</p
38、><p> 當EA引腳為低電平時,對程序存儲器的讀操作只限定在外部程序存儲器,地址為0000H~FFFFH,片內的4KBFlash程序存儲器不起作用。</p><p> Vpp為該引腳的第二功能,為編程電壓輸入端。對于89C51,在片內Flash固化編程時,加在Vpp引腳的編程電壓為+5V或+12V。在編程校驗時,該引腳接Vcc。</p><p><b>
39、 ALE/PROG</b></p><p> ALE為低8位地址鎖存允許信號。在系統(tǒng)擴展時ALE的負跳沿將P0口發(fā)出的低8位地址鎖存在外接的地址鎖存器中,然后P0口再作為數據端口,以實現P0口的低8位地址和數據的分時傳送。</p><p> PROG為該引腳的第二功能,在對片內Flash存儲器編程時,該引腳作為編程脈沖輸入端。</p><p>&l
40、t;b> PSEN</b></p><p> 片外程序存儲器的讀選通信號。在單片機讀外部程序存儲器時,此引腳輸出脈沖的負跳沿作為讀外部程序存儲器的選通信號。此引腳接外部程序存儲器的OE端;在訪問外部RAM時,PSEN信號無效。</p><p><b> I/O引腳</b></p><p> P0口:8位,漏極開路的雙向
41、I/O口。</p><p> 當89C51擴展外部存儲器及I/O接口芯片時,P0口作為地址總線(低8位)及數據總線的分時復用端口。</p><p> P0口也可作為通用的I/O口使用,但需加上拉電阻,這時為準雙向口。當作為普通的I/O口輸入時,應先向端口的輸出鎖存器寫入1。P0口可驅動8個LS型的TTL負載。</p><p> P1口:8位,準雙向I/O口,具
42、有內部上拉電阻。</p><p> P1口是專為用戶使用的準雙向I/O口,當作為普通的I/O口輸入時,應先向端口的輸出鎖存器寫入1,P1口可驅動4個LS型TTL負載。</p><p> P2口:8位,準雙向I/O口,具有內部上拉電阻。</p><p> 當89C51擴展外部存儲器及I/O口時,P2口可輸出高8位地址。</p><p>
43、 P2口也可作為普通的I/O口使用。當作為普通的I/O口輸入時,應先向端口的輸出鎖存器寫入1。P2口可驅動4個LS型TTL負載。</p><p> P3口:8位,準雙向I/O口,具有內部上拉電阻。</p><p> P3口可作為通用I/O口使用,當作為通用的I/O口輸入時應先向端口的輸出鎖存器寫入1。P2口可驅動4個LS型TTL負載。</p><p> P3口
44、還可提供第二功能。其第二功能定義如下表:</p><p> 表3.1 P3口第二功能定義</p><p><b> 顯示模塊</b></p><p> 在本設計中使用LCD1602液晶顯示器作為顯示模塊。其實際外觀如圖3.6所示:</p><p> 圖3.6 LCD1602實際外觀圖</p>
45、<p> LCD1602模塊內部自帶字符發(fā)生存儲器(CGROM),字符有:阿拉伯數字、英文字母的大小寫、常用的符號、和日文假名等,每一個字符都有一個固定的代碼,比如大寫的英文字母“A”的代碼是(41H),顯示時模塊把代碼41H發(fā)給液晶模塊,我們就能在液晶上看到字母“A”。</p><p> 1602液晶模塊內部的控制器共有11條控制指令,豐富的指令可以完成液晶的時序控制、工作方式式設置和數據顯示等。
46、</p><p> 采用的LCD1602液晶模塊是標準16針插座,接口電路如圖3.7所示: </p><p> 圖3.7 LCD1602接口接口電路</p><p> LCD1602的引腳功能和指令分別如表3.1和表3.2所示:</p><p> 表3.2 LCD1602引腳功能</p><p> 表
47、3.3 LCD1602 指令表</p><p><b> LCD的特點:</b></p><p><b> 1、低壓微功耗;</b></p><p><b> 2、平板型結構;</b></p><p> 3、被動顯示型(無眩光,不刺激人眼,不會引起眼睛疲勞);<
48、;/p><p> 4、顯示信息量大(因為像素可以做得很小);</p><p> 5、易于彩色化(在色譜上可以非常準確的復現);</p><p> 6、無電磁輻射(對人體安全,利于信息保密);</p><p> 7、長壽命(這種器件幾乎沒有什么劣化問題,因此壽命極長,但是液晶背光壽命有限,不過背光部分可以更換)。</p>&l
49、t;p><b> 輸入模塊</b></p><p> 計算器輸入數字和其他功能按鍵要用到很多按鍵,假如采用獨立按鍵的方式,這種情況下,編程會比較簡單,但卻會占用大量的I/O 口資源,所以在很多情況下都不采用這種方式。為此,我們引入矩陣鍵盤,即采用四條I/O 線作為行線,四條I/O 線作為列線組成鍵盤,在行線和列線的每一個交叉點上設置一個按鍵。這樣鍵盤上按鍵的個數就為4×4
50、個。這種行列式的鍵盤結構能夠有效地提高單片機系統(tǒng)中I/O 口的利用率。</p><p> 矩陣鍵盤的按鍵設在行列線交點上,鍵盤的行線或列線接上正電。 假如鍵盤的行線接上正電,則無按鍵按下時,行線處于高電平狀態(tài);當有按鍵按下時,行線電平狀態(tài)將由與此行線相連的列線決定。列線的電平如果為低,則行線電平為低;列線電平如果為高,則行線的電平也為高,這一點是識別行列式鍵盤按鍵是否按下的關鍵所在。由于行列式鍵盤中行列線為多鍵
51、共用,各按鍵均影響該鍵所在行和列的電平,因此各按鍵彼此將相互發(fā)生影響,所以必須將行、列線信號配合起來并做適當的處理,才能確定閉合鍵的位置。</p><p> 本設計中所用到的鍵盤電路如圖3.8所示:</p><p><b> 圖3.8 鍵盤電路</b></p><p> 綜合以上模塊的設計介紹,可以確定系統(tǒng)硬件的設計。其設計圖如圖3.9所
52、示:</p><p> 圖3.9 系統(tǒng)硬件原理圖</p><p><b> 軟件設計</b></p><p> 簡易計算器的程序主要包括以下功能模塊: </p><p><b> 按鍵掃描模塊。 </b></p><p> 2、基于LCD液晶顯示屏的顯示模塊。&l
53、t;/p><p><b> 3、運算模塊。 </b></p><p><b> 主模塊。 </b></p><p><b> 主程序的設計</b></p><p> 主程序通過調用函數實現對整個程序的控制,包括對LCD1602液晶的初始化,對輸入按鍵判斷,進行加減乘除運算,
54、輸出計算結果等。</p><p> 其程序流程圖如圖4.1所示:</p><p> 圖4.1 主程序流程圖</p><p><b> 鍵盤掃描的程序設計</b></p><p> 按鍵的識別分為掃描法和線反轉法兩種。掃描法要逐列掃描查詢,當被按下的鍵處于最后一列時,則要經過多次掃描才能最后獲得此按鍵所處的行
55、列值。而線反轉法則很簡練,無論被按鍵是處于第一列或最后一列,均只需經過兩步便能獲得此按鍵所在的行列值。由于線反轉法更加簡單實用,故本設計采用線反轉法來完成鍵盤掃描程序的設計。線反轉法的兩個具體操作步驟如下:</p><p> 讓行線編程為輸入線,列線編程為輸出線,并使輸出線輸出為全低電平,則行線中電平由高變低的所在行為按鍵所在行。</p><p> 再把行線編程為輸出線,列線編程為輸入
56、線,并使輸出線輸出為全低電平,則行線中電平由高變低的所在列為按鍵所在列。</p><p> 在鍵盤掃描程序中當數字鍵按下則將相應的數字送入緩存區(qū),當功能鍵按下則執(zhí)行相應的程序。</p><p> 另外,鍵盤的工作方式有三種,分別是編程掃描,定時掃描和中斷掃描。其中,編程掃描只有當單片機空閑時,才調用鍵盤掃描子程序,反復掃描鍵盤,等待用戶從鍵盤上輸入命令或數據,來響應鍵盤的輸入請求。定時
57、掃描即每隔一定的時間對鍵盤掃描一次。中斷掃描只有在鍵盤有鍵按下時,才執(zhí)行鍵盤掃描程序并執(zhí)行該按鍵功能程序,如果無鍵按下,單片機將不理睬鍵盤,這種方式可進一步提高單片機掃描鍵盤的工作效率。</p><p> 由于本設計中單片機除了鍵盤掃描、計算和LCD顯示控制外并無其它工作,所以用簡單的編程掃描方式更為合適。</p><p> 其流程圖如圖4.2所示:</p><p&
58、gt;<b> N</b></p><p><b> Y</b></p><p> 圖4.2 按鍵掃描程序流程圖</p><p> 鍵盤掃描程序的主體如下:</p><p> short temp1,temp2,temp,a=0xff;</p><p> P1=
59、0xf0;/* 輸入行值(或列值) */</p><p> LCD_Delay_ms(20);/* 延時 */</p><p> temp1=P1;/* 讀列值(或行值) */</p><p><b> P1=0xff;</b></p><p> LCD_Delay_ms(20);
60、/* 延時程序 */</p><p> P1=0x0f;/* 輸入列值(或行值) */</p><p> LCD_Delay_ms(20);/* 延時 */</p><p> temp2=P1;/* 讀行值(或列值) */</p><p><b> P1=0xff;</b>
61、;</p><p> temp=(temp1&0xf0)|(temp2&0xf);/* 將兩次讀入數據組合 */</p><p><b> 顯示模塊程序設計</b></p><p> 顯示模塊程序需要首先要對顯示模塊進行初始化,然后向LCD1602液晶寫入指令,最后向LCD1602液晶寫入數據。因此其需要三個函數來完成該
62、程序的設計,三個函數分別如下:</p><p> LCD1602液晶初始化函數;</p><p><b> 寫入指令函數;</b></p><p><b> 寫入數據函數;</b></p><p> 指定顯示器坐標寫入字符(字符串)函數。</p><p> 其中LC
63、D1602液晶初始化函數包括設置顯示類型、光標、清屏、開顯示、顯示位置的首地址和初始顯示數據等等。其程序主體如下:</p><p> wela=0; //寫液晶</p><p> lcden=0; //使能1602</p><p> write_com(0x38);
64、 //8 位總線,雙行顯示,5X7 的點陣字符</p><p> LCD_Delay_us(100); //延時100us</p><p> write_com(0x0c); //開顯示,無光標,光標不閃爍</p><p> write_com(0x06); //光標右移動</
65、p><p> write_com(0x01); //清屏</p><p> write_com(0x80); //DDRAM 地址歸0</p><p> 顯示模塊程序流程圖如圖4.3所示:</p><p> 圖4.3 顯示模塊程序流程圖</p><p><b&
66、gt; 運算模塊程序設計</b></p><p> 運算模塊的功能是利用單片機計算輸入數據運算的結果,這個功能運用C語言中的加減乘除運算符即可實現。特別要注意的是在運算除法時除數不能為零,即除數為零時程序要報錯(在LCD1602液晶顯示器上顯示error!)。</p><p><b> 其程序主體如下:</b></p><p>
67、; switch(x)/*功能鍵選擇*/</p><p><b> { </b></p><p> case 1:data_c=data_a+data_b;break; //加 /* + S=1 */ /* 數值轉換函數 */</p><p> case 2:if(data_a>=data_b)
68、{data_c=data_a-data_b;} /* - S=2 *///減</p><p> else{data_c=data_b-data_a;W_lcd(5,1,'-');} //負數符號</p><p> break; </p><p> case 3:data_c=(data_a*data_b);break; /* * S
69、=3 *///乘</p><p> case4:if(data_b==0){LCD_Write_String(0,1,"Error !");}else{data_c=(data_a*10000)/data_b;}break; /* / S=4 *///除//溢出時顯示錯誤</p><p> case 0:break;</p><p>&
70、lt;b> } </b></p><p><b> 仿真及調試</b></p><p> 在本設計中使用keil C軟件對程序進行編譯,然后再將其編譯連接后所生成的執(zhí)行文件放入已搭建好的proteus仿真圖中的AT89C51單片機上進行仿真。其仿真圖如圖5.1所示:</p><p> 圖5.1 簡易計算器仿真圖&
71、lt;/p><p> 首先輸入第一個數據,然后再輸入功能鍵(+,-,*,/)和另一個數據,最后按等號鍵就可以看到LCD顯示屏的第二行顯示出相應的結果。如上圖中輸入“222/5=”,就在第二行顯示出結果“44.4000”,從這個結果可以看出,當計算結果為小數時,計算器能夠顯示小數,小數位為四位。另外,在計算除法時,如果輸入除數為0,可以看到LCD的第二行顯示出“Error 0.0000”的字樣。</p>
72、<p><b> 結束語</b></p><p> 在硬件的制作過程中我走了好多的彎路,主要是在系統(tǒng)還沒有設計很有把握就開始動手制作了。后來發(fā)現與設計的要求還有偏差,反復的改過了幾次,浪費了大量的時間和體力。感受到設計人員要有耐心,要認真的從要求開始研究。軟件的編寫過程中費了很大的力氣,因為軟件的編寫要求很高,要很細心,一不小心就會調用錯誤,很深刻的體會到作為軟件編程人員是絕
73、不能粗心大意的。一個程序的完成的速度和質量高低與細心與否有著很大聯系。編程時,我充分使用了結構化的思想。這樣因為語句較少,程序調試比較方便,功能模塊可以逐一的調試,充分體現了結構化編程的優(yōu)勢。當每個模塊都完成時,將其功能加到一起就完成了整體的設計。</p><p><b> 致 謝</b></p><p> 本次畢業(yè)設計得到導師張帆老師的熱心指導,在這里對張帆老
74、師表示最衷心的感謝。張帆老師平易近人,對學生的設計進度和學習很關心。在畢業(yè)設計的前期,首先給我們介紹了不少有用的資料和書籍;在硬件設計等方面給予悉心的指導;在調試的過程中張帆老師給每個出現的問題給予及時的指導。在寫畢業(yè)設計論文的階段,張帆老師讓我們提前給他評審,不論內容字體,還是格式上的問題都一一指出。待人平和、工作認真、治學嚴謹他的給我留下很深刻的印象。更重要的是,他善于與學生溝通,不僅在畢業(yè)設計上給我及時的指導,更為我大學最后階段的
75、學習提出了許多寶貴的意見。這一切都在潛移默化地影響著我,為我以后進入工作崗位樹立了良好的榜樣。</p><p> 最后向所有幫助和關心過我的人表示衷心感謝!</p><p><b> 參考文獻</b></p><p> [1] 張毅剛 彭喜元. 單片機原理與應用設計[M]. 北京:電子工業(yè)出版社</p><p>
76、 [2] 張義和 王敏男 許宏昌等. 例說51單片機(第3版)[M]. 北京:人民郵電出版 </p><p> [3] 恰汗·合孜爾. C語言程序設計(第三版)[M]. 北京:中國鐵道出版社,2010年第三版</p><p> [4] 陳雷. C51單片機應用實訓[M]. 北京:中國電力出版社,2011年第一版</p><p> [5] 張欣 孫宏
77、昌 尹霞. 單片機原理與C51程序設計基礎教程[M]. 北京:清華大學出版社,2010年第一版</p><p> [6] 王巧芝 鄭鋒 劉瑞國等. 51單片機開發(fā)應用從入門到精通[M]. 北京:中國鐵道出版社</p><p> [7] 張靖武 周靈杉.單片機系統(tǒng)的PROTEUS設計與仿真[M].北京:北京電子工業(yè)出版社</p><p> [8] 靳達 求是科技
78、.單片機應用系統(tǒng)開發(fā)實例導航[M].:人民郵電出版社,2006</p><p> [9] 劉守義. 單片機應用技術[M].:西安電子科技大學出版社,2001</p><p> [10] 林志琦.基于PROTEUS的單片機可視化軟硬件仿真[M].北京:北京航空航天大學出版社,2006</p><p> [11] 胡漢才.單片機原理及接口技術.清華大學出版社,19
79、96</p><p> [12] 徐江海.單片機實用教程[M].北京:機械工業(yè)出版社,2007.</p><p> [13] 肖洪兵. 跟我學用單片機. 北京:北京航空航天大學出版社,2002.8</p><p> [14] 夏繼強. 單片機實驗與實踐教程. 北京:北京航空航天大學出版社, 2001</p><p> [15] 譚浩強
80、. C語言程序設計[M].北京:清華大學出版社,2000.</p><p> [16] 劉?;? C語言程序設計與實訓教程[M].北京:科學出版社,2004.</p><p> [17] 張磊. C語言程序設計[M].北京:高等教育出版社,2005.</p><p> [18] 嚴桂蘭. C語言程序設計[M].廈門:廈門大學出版社,2006</p>
81、<p> 附錄一:硬件實物圖(圖6.1和圖6.2):</p><p><b> 圖6.1 正面圖</b></p><p><b> 圖6.2 背面圖</b></p><p><b> 附錄二:系統(tǒng)程序</b></p><p> #include<
82、;reg51.h></p><p> #define uint unsigned int</p><p> #define uchar unsigned char</p><p> sbit rs=P2^7; //指令or數據</p><p> sbit wela=P2^6; //讀or寫</p&g
83、t;<p> sbit lcden=P2^5; //使能信號</p><p> uchar code table[]= " ";</p><p> long int data_a,data_b; //第一個數和第二個數</p><p> long int data_c;//計算結果
84、</p><p> uchar dispaly[10]; //顯示緩沖</p><p> //************************************************************************/</p><p> // 延時t us函數</p><p> //*******
85、*****************************************************************/</p><p> void LCD_Delay_us(unsigned int t)</p><p><b> {</b></p><p> while(t--); //t=0,退出&l
86、t;/p><p><b> }</b></p><p> //************************************************************************/</p><p> // 延時t ms函數</p><p> //**********************
87、**************************************************/</p><p> void LCD_Delay_ms(unsigned int t)</p><p><b> {</b></p><p> unsigned int i,j;</p><p> for(i=0
88、;i<t;i++) //執(zhí)行t次循環(huán)</p><p> for(j=0;j<113;j++) //執(zhí)行113次循環(huán)</p><p><b> ;</b></p><p><b> }</b></p><p> //*******************
89、*****************************************************/</p><p> // 1602液晶寫指令</p><p> //************************************************************************/</p><p> void write
90、_com(uchar com) //1602液晶寫指令</p><p><b> {</b></p><p> rs=0; //寫指令</p><p> lcden=0; //使能1602 </p><p> P0=com;
91、 //寫入指令com</p><p> LCD_Delay_ms(1); //延時1ms</p><p> lcden=1; //使能1602</p><p> LCD_Delay_ms(2); //延時2ms </p>&
92、lt;p> lcden=0; //使能1602</p><p><b> }</b></p><p> //************************************************************************/</p><p> // 1602液晶寫數據
93、</p><p> //************************************************************************/</p><p> void write_date(uchar date) //1602液晶寫數據</p><p><b> {</b></p><p
94、> rs=1; //寫數據</p><p> lcden=0; //使能1602 </p><p> P0=date; //寫入數據date</p><p> LCD_Delay_ms(1); //延時1
95、ms</p><p> lcden=1; //使能1602</p><p> LCD_Delay_ms(2); //延時2ms</p><p> lcden=0; //使能1602</p><p><b> }</b>
96、;</p><p> //************************************************************************/</p><p> // 指定x,y寫入字符函數</p><p> //***********************************************************
97、*************/</p><p> void W_lcd(unsigned char x,unsigned char y,unsigned char Data) </p><p><b> { </b></p><p> if (y == 0){write_com(0x80 + x);} //第一行 </p
98、><p> else{write_com(0xc0 + x);} //第二行</p><p> write_date( Data); //寫入數據</p><p><b> }</b></p><p> //指定x,y寫入字符串函數</p><p
99、> void LCD_Write_String(unsigned char x,unsigned char y,unsigned char *s) </p><p><b> { </b></p><p> if (y == 0){write_com(0x80 + x);} //第一行</p><p> else{wr
100、ite_com(0xC0 + x);} //第二行</p><p> while (*s) //</p><p> {write_date( *s); s++;} //寫入數據</p><p><b> }</b></p><p>
101、 //************************************************************************/</p><p> // 初始化液晶,及畫面初始化 </p><p> //************************************************************************/</p&
102、gt;<p> void init_lcd(void) //初始化液晶,及畫面初始化</p><p><b> {</b></p><p> wela=0; //寫液晶</p><p> lcden=0; //使能160
103、2</p><p> write_com(0x38); //8 位總線,雙行顯示,5X7 的點陣字符</p><p> LCD_Delay_us(100); //延時100us</p><p> write_com(0x0c); //開顯示,無光標,光標不閃爍</p><p
104、> write_com(0x06); //光標右移動</p><p> write_com(0x01); //清屏</p><p> write_com(0x80); //DDRAM 地址歸0</p><p><b> }</b></p><
105、;p> //************************************************************************/</p><p> // 反轉法鍵盤掃描 </p><p> //************************************************************************/<
106、/p><p> short keycheckdown()/* 反轉法鍵盤掃描 */</p><p><b> {</b></p><p> short temp1,temp2,temp,a=0xff;</p><p> P1=0xf0;/* 輸入行值(或列值) */</p><
107、p> LCD_Delay_ms(20);/* 延時 */</p><p> temp1=P1;/* 讀列值(或行值) */</p><p><b> P1=0xff;</b></p><p> LCD_Delay_ms(20);/* 延時 */</p><p> P1=0x0f
108、;/* 輸入列值(或行值) */</p><p> LCD_Delay_ms(20);/* 延時 */</p><p> temp2=P1;/* 讀行值(或列值) */</p><p><b> P1=0xff;</b></p><p> temp=(temp1&0xf0
109、)|(temp2&0xf);/* 將兩次讀入數據組合 */</p><p> switch(temp)/* 通過讀入數據組合判斷按鍵位置 */</p><p><b> {</b></p><p> case 0x77 :a=0x0d;break;// 按鍵/ </p><p> cas
110、e 0x7b :a=0x0e; break;// 按鍵=</p><p> case 0x7d :a=0; break;// 按鍵0</p><p> case 0x7e :a=0x0f; break;// 按鍵CE</p><p> case 0xb7 :a=0x0c;break;// 按鍵*</p><p> case
111、0xbb :a=0x9;break; // 按鍵9</p><p> case 0xbd :a=0x8;break; // 按鍵8 </p><p> case 0xbe :a=0x7;break; // 按鍵7</p><p> case 0xd7 :a=0x0b;break;// 按鍵-</p><p> case 0xd
112、b :a=0x6;break; // 按鍵6</p><p> case 0xdd :a=0x5;break; // 按鍵5</p><p> case 0xde :a=0x4;break; // 按鍵4</p><p> case 0xe7 :a=0x0a; break;// 按鍵+</p><p> case 0xeb :a
113、=3;break;// 按鍵3</p><p> case 0xed :a=2;break;// 按鍵2</p><p> case 0xee :a=1;break;// 按鍵1</p><p> default :a=0xff;</p><p><b> }</b></p><p
114、> return a;/* 返回按鍵值 */</p><p><b> }</b></p><p> void display_a() //顯示數據a</p><p><b> {</b></p><p> dispaly[3]=data_a%10000/1000;
115、 //千</p><p> dispaly[2]=data_a%1000/100; //百</p><p> dispaly[1]=data_a%100/10; //十</p><p> dispaly[0]=data_a%10; //個 </p><p> write_com(0x80+
116、0); //顯示數據a</p><p> if(data_a>999){write_date('0'+dispaly[3]);} //顯示千位</p><p> if(data_a>99){write_date('0'+dispaly[2]);} //顯示百位</p><p&g
117、t; if(data_a>9){write_date('0'+dispaly[1]);} //顯示十位</p><p> write_date('0'+dispaly[0]); //顯示個位</p><p><b> }</b></p><p> void display_b()
118、 //顯示數據b</p><p><b> {</b></p><p> write_com(0x80+7); //第一行</p><p> dispaly[3]=data_b%10000/1000; //千</p><p> dispaly[2]=data_b%1000/100; //百<
119、/p><p> dispaly[1]=data_b%100/10; //十</p><p> dispaly[0]=data_b%10; //個 </p><p> if(data_b>999){write_date('0'+dispaly[3]); } //顯示千位 </p>
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 簡易計算器畢業(yè)論文
- 簡易計算器畢業(yè)論文.doc
- 單片機的簡易計算器設計-畢業(yè)論文
- 計算器畢業(yè)設計---簡易計算器的設計
- 畢業(yè)論文---計算器模擬系統(tǒng)的設計與制作
- 畢業(yè)論文--基于51單片機簡易計算器的設計
- 基于51單片機的簡易計算器設計畢業(yè)論文
- 畢業(yè)論文 基于51單片機簡易計算器的設計
- 基于at89s52的簡易計算器設計畢業(yè)論文
- 簡易計算器畢業(yè)設計
- 簡易計算器的設計畢業(yè)設計
- 基于51單片機的簡易計算器畢業(yè)論文
- vbnet簡易計算器制作與實現
- 計算器畢業(yè)論文_——基于單片機的計算器設計
- 基于單片機的簡易計算器論文畢業(yè)設計
- plc簡易計算器設計
- 簡易計算器
- 計算器畢業(yè)論文-- 基于單片機的電子計算器設計
- 科學計算器設計-本科畢業(yè)論文
- 畢業(yè)論文——基于at89c51單片機的簡易計算器的設計
評論
0/150
提交評論