目 錄
摘 要……………………………………………………………………………2
引 言……………………………………………………………………………3
- 系統(tǒng)整體概述 ………………………………………………………4
- 硬件設(shè)計(jì)……………………………………………………………6
- 軟件設(shè)計(jì) ……………………………………………………………9
- 調(diào)試與分析…………………………………………………………13
- 制作感受 …………………………………………………………14
附錄……………………………………………………………………………15
摘 要近年來(lái)隨著科技的飛速發(fā)展,單片機(jī)的應(yīng)用正在不斷深入,同時(shí)帶動(dòng)傳統(tǒng)控制檢測(cè)技術(shù)日益更新。在實(shí)時(shí)檢測(cè)和自動(dòng)控制的單片機(jī)應(yīng)用系統(tǒng)中,單片機(jī)往往作為一個(gè)核心部件來(lái)使用,但僅單片機(jī)方面的知識(shí)是不夠的,還應(yīng)根據(jù)具體硬件結(jié)構(gòu)、軟硬件結(jié)合,來(lái)加以完善。
計(jì)算器在人們的日常生活中是比較常見(jiàn)的電子產(chǎn)品之一。可是它還在發(fā)展之中,以后必將出現(xiàn)功能更加強(qiáng)大的計(jì)算機(jī),基于這樣的理念,本次設(shè)計(jì)是用AT89C51單片機(jī)、LCD液晶顯示器、控制按鍵等為元件來(lái)設(shè)計(jì)的計(jì)算器。利用此設(shè)計(jì)熟悉單片機(jī)微控制器及C語(yǔ)言編程,對(duì)其片資源及各個(gè)I/O端口的功能和基本用途的了解。掌握Microsoft Visual C++ 6.0及Keil軟件應(yīng)用程序開(kāi)發(fā)環(huán)境,常用的LCD顯示器的使用方法和一般鍵盤(pán)的使用方法。
引言
當(dāng)今社會(huì),隨著人們物質(zhì)生活的不斷提高,電子產(chǎn)品已經(jīng)走進(jìn)了家家戶(hù)戶(hù),無(wú)論是生活或?qū)W習(xí),還是娛樂(lè)和消遣幾乎樣樣都離不開(kāi)電子產(chǎn)品,大型復(fù)雜的計(jì)算能力是人腦所不能勝任的,而且比較容易出錯(cuò)。計(jì)算器作為一種快速通用的計(jì)算工具方便了用戶(hù)的使用。計(jì)算器可謂是我們最親密的電子伙伴之一。計(jì)算器一般由運(yùn)算器、控制器、存儲(chǔ)器、鍵盤(pán)、顯示器、電源和一些可選外圍設(shè)備及電子配件通過(guò)人工或機(jī)器設(shè)備組成。鍵盤(pán)是計(jì)算器的輸入部件,一般采用接觸式或傳感式。為減小計(jì)算器的尺寸,一鍵常常有多種功能。顯示器是計(jì)算器的輸出部件,有發(fā)光二極管顯示器和液晶顯示器等。除顯示計(jì)算結(jié)果外,還常有溢出指示、錯(cuò)誤指示等。
人們利用計(jì)算器代替了許多復(fù)雜計(jì)算,包括加減乘除和其他運(yùn)算。尤其是小型計(jì)算器,它攜帶方便,在生活中用起來(lái)方便快捷,成為了財(cái)政、學(xué)習(xí)、生意上都青睞的必需品。它的需求廣泛,在計(jì)算器的發(fā)展上存在很大的空間和市場(chǎng)意義。單片機(jī)在我國(guó)的各行各業(yè)得到了廣泛使用,單片機(jī)的出現(xiàn)是計(jì)算機(jī)制造技術(shù)高速發(fā)展的產(chǎn)物,它是嵌入式控制系統(tǒng)的核心。如今,它已經(jīng)廣泛應(yīng)用到我們生活中的各個(gè)領(lǐng)域,用單片機(jī)可以很方便的實(shí)現(xiàn)計(jì)算器的設(shè)計(jì)。
眾所周知單片機(jī)是一種集成在電路芯片,是采用超大規(guī)模集成電路技術(shù)把具有數(shù)據(jù)處理能力的中央處理器CPU隨機(jī)存儲(chǔ)器RAM、只讀存儲(chǔ)器ROM、多種I/O口和中斷系統(tǒng)、定時(shí)器/計(jì)時(shí)器等功能集成到一塊硅片上構(gòu)成的一個(gè)小而完善的計(jì)算機(jī)系統(tǒng)。單片機(jī)由于其微小的體積和極低的成本,廣泛的應(yīng)用于家用電器、工業(yè)控制等領(lǐng)域中。在工業(yè)生產(chǎn)中。單片微型計(jì)算機(jī)是微型計(jì)算機(jī)的一個(gè)重要分支,也是頗具生命力的機(jī)種。單片微型計(jì)算機(jī)簡(jiǎn)稱(chēng)單片機(jī),特別適用于控制領(lǐng)域,故又稱(chēng)為微控制器。
第一章 系統(tǒng)整體概述
1.1 設(shè)計(jì)目的應(yīng)用《單片機(jī)應(yīng)用基礎(chǔ)》、《計(jì)算機(jī)應(yīng)用基礎(chǔ)》等所學(xué)相關(guān)知識(shí)及查閱資料,完成簡(jiǎn)易計(jì)算器的設(shè)計(jì),以達(dá)到理論與實(shí)踐更好的結(jié)合、進(jìn)一步提高綜合運(yùn)用所學(xué)知識(shí)和設(shè)計(jì)的能力的目的。
通過(guò)本次設(shè)計(jì)的訓(xùn)練,可以使我在基本思路和基本方法上對(duì)基于MCS-51單片機(jī)的嵌入式系統(tǒng)設(shè)計(jì)有一個(gè)比較感性的認(rèn)識(shí),并具備一定程度的設(shè)計(jì)能力。
主要完成如下方面的設(shè)計(jì)任務(wù):
1、簡(jiǎn)要闡述單片機(jī)技術(shù)發(fā)展的國(guó)內(nèi)外現(xiàn)狀及LED動(dòng)態(tài)顯示和矩陣鍵盤(pán)基本原理;
2、掌握MCS-51系列某種產(chǎn)品(例如8051)的最小電路及外圍擴(kuò)展電路的設(shè)計(jì)方法;
3、了解單片機(jī)數(shù)據(jù)轉(zhuǎn)換功能及工作過(guò)程;
4、完成主要功能模塊的硬件電路設(shè)計(jì)及必要的參數(shù)確定.
1.2 計(jì)算器設(shè)計(jì)總體思想根據(jù)功能和指示要求,本系統(tǒng)選用以51單片機(jī)為主控機(jī)。通過(guò)擴(kuò)展必要的外圍接口電路,實(shí)現(xiàn)對(duì)計(jì)算器的設(shè)計(jì)。
具體設(shè)計(jì)如下:
1、由于要設(shè)計(jì)的是簡(jiǎn)單的計(jì)算器,可以進(jìn)行四則運(yùn)算,為了得到教好的顯示效果,采用LCD顯示數(shù)據(jù)和結(jié)果。
2、另外鍵盤(pán)包括數(shù)字鍵(0-9)、符號(hào)鍵(+、-、*、/)、清除鍵和等號(hào)鍵,故只需要16個(gè)按鍵即可,設(shè)計(jì)中采用集成的計(jì)算機(jī)鍵盤(pán)。
3、執(zhí)行程序:開(kāi)機(jī)顯示零,等待鍵入數(shù)值,當(dāng)鍵入數(shù)字,通過(guò)LCD顯示出來(lái),當(dāng)鍵入+、-、*、/運(yùn)算符,計(jì)算器在內(nèi)部執(zhí)行數(shù)值轉(zhuǎn)換和存儲(chǔ),并等待再次鍵入數(shù)值后將顯示鍵入的數(shù)值,按等號(hào)就會(huì)在LCD上輸出運(yùn)算結(jié)果。
4、錯(cuò)誤提示:當(dāng)單片機(jī)執(zhí)行程序中有錯(cuò)誤時(shí),會(huì)在LCD上顯示相應(yīng)的提示,如:當(dāng)輸入的數(shù)值或計(jì)算器得到的結(jié)果大于計(jì)算器的顯示范圍時(shí),計(jì)算器會(huì)在LCD上提示溢出;當(dāng)除數(shù)為0時(shí),計(jì)算器會(huì)在LCD上提示錯(cuò)誤。
1.3系統(tǒng)的組成
計(jì)算器設(shè)計(jì)硬件電路采用三部分電路模塊構(gòu)成,第一部分是鍵盤(pán)模塊電路,采用4*4矩陣式鍵盤(pán)作為輸入電路;第二部分是LCD1602液晶顯示模塊;第三部分是以51單片機(jī)作為控制核心。軟件程序主要由三部分組成:主程序、按鍵掃描程序和LCD1602顯示程序。
1.001.jpg (659 Bytes, 下載次數(shù): 97)
下載附件
2017-5-14 03:26 上傳
圖片在51hei附件中
圖 系統(tǒng)組成及總體框圖
本系統(tǒng)就是充分利用了8051芯片的I/O引腳。系統(tǒng)以采用MCS-51系列單片機(jī)Intel8051為中心器件來(lái)設(shè)計(jì)計(jì)算器控制器,實(shí)現(xiàn)了能根據(jù)實(shí)際輸入值顯示并存儲(chǔ)的功能,計(jì)算程序則是參照教材。
本計(jì)算器是以MCS-51系列8051單片機(jī)為核心構(gòu)成的簡(jiǎn)易計(jì)算器系統(tǒng)。該系統(tǒng)通過(guò)單片機(jī)控制,實(shí)現(xiàn)對(duì)4*4鍵盤(pán)掃描進(jìn)行實(shí)時(shí)的按鍵檢測(cè),并把檢測(cè)數(shù)據(jù)存儲(chǔ)下來(lái)。整個(gè)計(jì)算器系統(tǒng)的工作過(guò)程為:首先存儲(chǔ)單元初始化,顯示初始值和鍵盤(pán)掃描,判斷按鍵位置,查表得出按鍵值,單片機(jī)則對(duì)數(shù)據(jù)進(jìn)行儲(chǔ)存與相應(yīng)處理轉(zhuǎn)換,之后送入LED顯示器動(dòng)態(tài)顯示。整個(gè)系統(tǒng)可分為三個(gè)主要功能模塊:功能模塊一,實(shí)時(shí)鍵盤(pán)掃描;功能模塊二,數(shù)據(jù)轉(zhuǎn)換成顯示器顯示;功能模塊三,顯示器動(dòng)態(tài)顯示。
第二章 硬件系統(tǒng)設(shè)計(jì)硬件系統(tǒng)是指構(gòu)成微機(jī)系統(tǒng)的實(shí)體和裝置,通常由運(yùn)算器、控制器、存儲(chǔ)器、輸入接口電路和輸入設(shè)備、輸出接口電路和輸出設(shè)備等組成。單片機(jī)實(shí)質(zhì)上是一個(gè)硬件的芯片,在實(shí)際應(yīng)用中,通常很難直接和被控對(duì)象進(jìn)行電氣連接,必須外加各種擴(kuò)展接口電路、外部設(shè)備、被控對(duì)象等硬件和軟件,才能構(gòu)成一個(gè)單片機(jī)應(yīng)用系統(tǒng)。本設(shè)計(jì)選用以AT89S51單片機(jī)為主控單元。顯示部分:采用LCD靜態(tài)顯示。按鍵部分,采用4*4鍵盤(pán)。 硬件電路原理圖如圖2.1所示:
1.009.jpg (34.38 KB, 下載次數(shù): 142)
下載附件
2017-5-14 03:26 上傳
圖2.1 硬件電路原理圖
2.1 鍵盤(pán)接口電路計(jì)算機(jī)輸入數(shù)字和其他功能按鍵時(shí)要用到很多按鍵,在這種情況下,編程會(huì)很簡(jiǎn)單,但是會(huì)占用大量的I/O口資源,因此在很多情況下都不采用這樣的方式,而是采用矩陣鍵盤(pán)的方式。矩陣鍵盤(pán)采用四條I/O線作為行線,四條I/O線作為列線組成鍵盤(pán),在行線和列線的每個(gè)交叉點(diǎn)上設(shè)置一個(gè)按鍵。這樣鍵盤(pán)上按鍵的數(shù)量就為4*4個(gè)。這樣行列式鍵盤(pán)結(jié)構(gòu)能有效的提高單片機(jī)系統(tǒng)中I/O口的利用率。
計(jì)算器的鍵盤(pán)布局如圖2.2所示:一般有16個(gè)鍵組成,在單片機(jī)中正好有一個(gè)P端口實(shí)現(xiàn)16個(gè)按鍵功能,這種形式在單片機(jī)系統(tǒng)中最常用。
1.010.jpg (20.95 KB, 下載次數(shù): 108)
下載附件
2017-5-14 03:26 上傳
圖2.2 矩陣鍵盤(pán)內(nèi)部電路
2.2 LCD顯示模塊本設(shè)計(jì)采用LCD液晶顯示器來(lái)顯示輸出數(shù)據(jù)。LCD的特性有:1、+5V電壓,對(duì)比可調(diào)度;2、內(nèi)含復(fù)位電路;3、提供各種控制命令,如:清屏、字符閃爍、光標(biāo)閃爍、顯示移位等多種功能;4、有80字節(jié)顯示數(shù)據(jù)存儲(chǔ)器DDRAM;5、內(nèi)建有160個(gè)5X7點(diǎn)陣的字型的字符發(fā)生器CGROM;6、8個(gè)可由用戶(hù)自定義的5X7的字符發(fā)生器CGRAM。
本設(shè)計(jì)通過(guò)D0-D7引腳向LCD寫(xiě)指令字或?qū)憯?shù)據(jù)以使LCD實(shí)現(xiàn)不同的功能或顯示相應(yīng)的數(shù)據(jù)。其接口電路如圖2.3所示。
1.011.jpg (9.73 KB, 下載次數(shù): 97)
下載附件
2017-5-14 03:26 上傳
圖2.3 LCD接口電路
LCD的引腳說(shuō)明如表2.1所示:
表2.1 LCD的引腳說(shuō)明
2.3 運(yùn)算模塊MCS-51單片機(jī)是在一塊芯片中集成了CPU、RAM、ROM、定時(shí)器/計(jì)數(shù)器和多功能I/O等計(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)不同的功能,尤其是特殊的一些功能,通過(guò)使用單片機(jī)編寫(xiě)的程序可以實(shí)現(xiàn)高智能、高效率以及高可靠性,因此采用單片機(jī)作為計(jì)算器的主要功能部件,可以很快的實(shí)現(xiàn)運(yùn)算功能。
運(yùn)算模塊由鍵盤(pán)和顯示屏組成。單片機(jī)通過(guò)按鍵來(lái)實(shí)現(xiàn)輸入數(shù)據(jù)和操作方式的控制,在運(yùn)算過(guò)程中,對(duì)所設(shè)的數(shù)據(jù)進(jìn)行四則運(yùn)算時(shí),要先確定選用的是哪一個(gè)運(yùn)算符,若是+或*,則要判斷結(jié)果是否會(huì)溢出,溢出則顯示錯(cuò)誤提示,沒(méi)有溢出則顯示運(yùn)算結(jié)果,若是/,則要判斷除數(shù)是否為零,為零時(shí)顯示錯(cuò)誤提示,不為零顯示運(yùn)算結(jié)果。
第三章 軟件設(shè)計(jì)
3.1 語(yǔ)言的特點(diǎn)及選擇本設(shè)計(jì)是硬件電路和軟件編程相結(jié)合的設(shè)計(jì)方案,選擇合適的編程語(yǔ)言是一個(gè)重要的環(huán)節(jié)。在單片機(jī)的應(yīng)用系統(tǒng)程序設(shè)計(jì)時(shí),常用的是匯編語(yǔ)言和C語(yǔ)言。機(jī)硬件,程序可讀性和可移植性比較差。而C語(yǔ)言雖然執(zhí)行效率沒(méi)有匯編語(yǔ)言高,但語(yǔ)言簡(jiǎn)潔,使用方便,靈活,運(yùn)算豐富,表達(dá)化類(lèi)型多樣化,數(shù)據(jù)結(jié)構(gòu)類(lèi)型豐富,具有結(jié)構(gòu)化的控制語(yǔ)句,程序設(shè)計(jì)自由度大,有很好的可重用性,可移植性等特點(diǎn)。
由于現(xiàn)在單片機(jī)的發(fā)展已經(jīng)達(dá)到了很高的水平,內(nèi)部的各種資源相當(dāng)?shù)呢S富,CPU的處理速度非常的快。用C語(yǔ)言來(lái)控制單片機(jī)無(wú)疑是一個(gè)理想的選擇。所以在本設(shè)計(jì)中采用C語(yǔ)言編寫(xiě)軟件程序。主程序的設(shè)計(jì)詳見(jiàn)附錄三。
3.2 鍵掃程序設(shè)計(jì)鍵掃程序的過(guò)程為:開(kāi)始時(shí),先判斷是否有鍵閉合,無(wú)鍵閉合時(shí),返回繼續(xù)判斷,有鍵閉合時(shí),先去抖動(dòng),然后確定是否有鍵按下,若無(wú)鍵按下,則返回繼續(xù)判斷是否有鍵閉合,若有鍵按下,則判斷鍵號(hào),然后釋放,若釋放按鍵完畢,則返回,若沒(méi)有釋放按鍵,則返回繼續(xù)釋放。其流程圖如圖3.1所示。
1.012.jpg (25.48 KB, 下載次數(shù): 113)
下載附件
2017-5-14 03:26 上傳
圖3.1 鍵掃程序流程圖
3.3 算術(shù)運(yùn)算程序設(shè)計(jì)算術(shù)運(yùn)算程序的過(guò)程為:先判斷輸入的運(yùn)算符是+、-、*、/ 中的哪一個(gè),若是+或-,則要判斷運(yùn)算結(jié)果是否溢出,溢出則顯示錯(cuò)誤信息,沒(méi)溢出就顯示運(yùn)算結(jié)果,若是/,則要先判斷除數(shù)是否為零,為零就顯示錯(cuò)誤信息,不為零則顯示運(yùn)算結(jié)果,若是-,則直接顯示運(yùn)算結(jié)果。其流程圖如圖3.2所示。
1.013.jpg (29.9 KB, 下載次數(shù): 108)
下載附件
2017-5-14 03:26 上傳
圖3.2 算術(shù)運(yùn)算程序設(shè)計(jì)流程圖
3.4 顯示程序設(shè)計(jì)顯示程序的過(guò)程為:顯示開(kāi)始時(shí),先進(jìn)行LCD的初始化,判斷是否顯示漢字或ACSII碼或圖形,若不顯示,則返回,若顯示的是漢字或ACSII碼,則進(jìn)行相應(yīng)功能的設(shè)置,然后送地址和數(shù)據(jù),再判斷是否顯示完,顯示完則返回,沒(méi)有顯示完則繼續(xù)送地址,若顯示的是圖形,則先進(jìn)行相應(yīng)功能的設(shè)置,再送行地址和列地址,然后送數(shù)據(jù),最后判斷是否顯示完,顯示完則返回,沒(méi)有顯示完則繼續(xù)送行地址和列地址。其流程圖如圖3.3所示。
1.014.jpg (39.54 KB, 下載次數(shù): 113)
下載附件
2017-5-14 03:26 上傳
圖3.3 顯示程序流程圖
第四章 調(diào)試與分析
4.1 硬件調(diào)試常見(jiàn)故障:
1、邏輯錯(cuò)誤:它是由設(shè)計(jì)錯(cuò)誤或加工過(guò)程中的工藝性錯(cuò)誤所造成的。這類(lèi)錯(cuò)誤包括錯(cuò)線、開(kāi)路、短路等。
2、元器件失效:有兩方面的原因:一是器件本身已損壞或性能不符合要求;二是組裝錯(cuò)誤造成元件失效,如電解電容、集成電路安裝方向錯(cuò)誤等。
3、可靠性差:因其可靠性差的原因很多,如金屬化孔、接插件接觸不良會(huì)造成系統(tǒng)時(shí)好時(shí)壞,經(jīng)不起振動(dòng);走線和布局不合理也會(huì)引起系統(tǒng)可靠性差。
4、電源故障:若樣機(jī)由電源故障,則加電后很容易造成器件損壞。電源故障包括電壓值不符合設(shè)計(jì)要求,電源引線和插座不對(duì),功率不足,負(fù)載能力差等。
調(diào)試方法:包括多級(jí)調(diào)試和聯(lián)機(jī)調(diào)試。在調(diào)試過(guò)程中要針對(duì)可能出現(xiàn)的故障認(rèn)真分析,直至檢查出原因并排除。
本次硬件調(diào)試過(guò)程中,對(duì)所出現(xiàn)的問(wèn)題進(jìn)行了認(rèn)真的分析和改正,最后能夠很好的達(dá)到設(shè)計(jì)要求的效果。
4.2 軟件調(diào)試軟件調(diào)試分為以下四個(gè)階段:1、 編寫(xiě)程序并查錯(cuò);2、在C語(yǔ)言的編譯系統(tǒng)中編譯源程序3、對(duì)程序進(jìn)行編譯連接,并及時(shí)發(fā)現(xiàn)程序中存在的錯(cuò)誤;4、改正錯(cuò)誤。
在本次調(diào)試中出現(xiàn)的問(wèn)題有:
1、在程序中有的函數(shù)名未定義;
2、在抄錄程序時(shí),少錄入一些字符,如:“;”、“{”、“-”等符號(hào),而出現(xiàn)錯(cuò)誤;
3、有一些函數(shù)名錄入時(shí)少寫(xiě)一個(gè)字母或順序顛倒;
4、沒(méi)有注意函數(shù)名的調(diào)用及定義;
5、芯片引腳定義出錯(cuò)而導(dǎo)致沒(méi)有實(shí)驗(yàn)現(xiàn)象。
在軟件調(diào)試過(guò)程中,對(duì)出現(xiàn)的錯(cuò)誤進(jìn)行了認(rèn)真的分析和修改,多次調(diào)試成功后,能夠很好的達(dá)到既定的設(shè)計(jì)效果。
第五章 制作感受通過(guò)這個(gè)作品的設(shè)計(jì),收獲頗多,當(dāng)我開(kāi)始準(zhǔn)備做單片機(jī)作品設(shè)計(jì)的時(shí)候,設(shè)計(jì)什么都是我十分困惑的,無(wú)意中室友找我借計(jì)算器去考試,靈感就來(lái)了,沒(méi)錯(cuò)就設(shè)計(jì)計(jì)算器了,于是便搜集各種關(guān)于計(jì)算器的相關(guān)資料。開(kāi)始感覺(jué)設(shè)計(jì)出來(lái)應(yīng)該會(huì)很難,不過(guò),經(jīng)過(guò)不斷地努力之后,了解計(jì)算器的工作原理,設(shè)計(jì)計(jì)算器的電路原理圖和實(shí)物圖,然后便到網(wǎng)上買(mǎi)需要的電子元器件了,經(jīng)過(guò)一些時(shí)日各種東西都已準(zhǔn)備齊全,說(shuō)干就干,按照原理圖一步步進(jìn)行焊接。做起來(lái)越來(lái)越來(lái)勁,感覺(jué)很有趣的樣子,都說(shuō)興趣是最好的老師,果然沒(méi)錯(cuò)。
當(dāng)我剛剛做完這個(gè)作品第一次進(jìn)行功能運(yùn)行的時(shí)候,沒(méi)有成功,當(dāng)時(shí)心里有些無(wú)奈,經(jīng)過(guò)幾天的布線焊接最終卻沒(méi)成功,有點(diǎn)點(diǎn)小失落。當(dāng)然不是每個(gè)人都能一次就能做成的,便進(jìn)行各種檢查調(diào)試,經(jīng)過(guò)幾番周折最后勉強(qiáng)能實(shí)現(xiàn)功能了,但是還有些不盡人意,不過(guò)當(dāng)時(shí)已有一種成功的喜悅感了。再經(jīng)過(guò)不斷地進(jìn)行修改完善,終于達(dá)到了我想要的效果,這時(shí)的我感覺(jué)自己棒棒噠,自己也能做出計(jì)算器了。這個(gè)過(guò)程中除了學(xué)到知識(shí)以外,還感受到了堅(jiān)持努力最終就會(huì)取得自己想要的成績(jī)。
附錄
附錄一:計(jì)算器proteus仿真圖
1.015.jpg (64.63 KB, 下載次數(shù): 144)
下載附件
2017-5-14 03:26 上傳
附錄二:元器件清單
1 | 10uf | 直插電解電容 | 1 |
2 | 30P | 直插瓷片電容 | 2 |
3 | 10K | 9腳排阻 | 1 |
4 | LCD1602 | LCD1602液晶顯示器 | 1 |
5 | POWER | DC電源插座 | 1 |
6 | 2.2k | 色環(huán)電阻 | 1 |
7 | 10K | 2 |
8 | SW-PB | 按鍵6X6X5MM | 17 |
9 | SWITCH | 自鎖開(kāi)關(guān) | 1 |
10 | STC89C51/52 | 51單片機(jī) | 1 |
11 | 12MHZ | 晶振 | 1 |
12 | 導(dǎo)線 | XXcm | 1 |
13 | 焊錫 | XXcm | 1 |
14 | USB轉(zhuǎn)DC3.5mm電源線 | 系統(tǒng)供電 | 1 |
15 | 9*15萬(wàn)用板 |
| 1 |
16 | 單片機(jī)插座 | 40腳IC座 | 1 |
17 | DC電源頭 | DC插頭 3.5-1.35MM | 1 |
18 | LCD1602插座 | 16P排母 | 1 |
19 | LCD1602引出腳 | 16P排針 | 1 |
附錄三:源程序
- /*
- 接盤(pán)按鍵說(shuō)明:
- --------------------------------------------------
- | 1 | 2 | 3 | + |
- - - - - - - - - - - - - -
- | 4 | 5 | 6 | - |
- - - - - - - - - - - - - -
- | 7 | 8 | 9 | * |
- - - - - - - - - - - - - -
- | C | 0 | = | / |
- --------------------------------------------------*/
- //操作簡(jiǎn)介
- // 按第一個(gè)數(shù),再按'+-*/',再按'='顯示出結(jié)果,然后按C清屏
- // 加最大9999+9999=19998
- // 減最大9999-0 =9999
- // 乘最大9999*9999=99980001
- // 除 1/9=0.1111 保留小數(shù)點(diǎn)后4位
- #include<reg51.h>
- #define uint unsigned int
- #define uchar unsigned char
- //--------LCD1602-------------------
- //P00-07==== D0-7
- sbit rs=P2^5; //指令or數(shù)據(jù)
- sbit wela=P2^6; //讀or寫(xiě)
- sbit lcden=P2^7; //使能信號(hào)
- //--------LCD1602-------------------
- //--------KEY-----------------------
- //P1口
- //--------KEY-----------------------
- uchar code table[]= " ";
-
- long int data_a,data_b; //第一個(gè)數(shù)和第二個(gè)數(shù)
- long int data_c; //計(jì)算結(jié)果
-
- uchar dispaly[10]; //顯示緩沖
-
- //************************************************************************/
- // 描述: 延時(shí)t us函數(shù)
- //************************************************************************/
- void LCD_Delay_us(unsigned int t)
- {
- while(t--); //t=0,退出
- }
- //************************************************************************/
- // 描述: 延時(shí)t ms函數(shù)
- //************************************************************************/
- void LCD_Delay_ms(unsigned int t)
- {
- unsigned int i,j;
- for(i=0;i<t;i++) //執(zhí)行t次循環(huán)
- for(j=0;j<113;j++) //執(zhí)行113次循環(huán)
- ;
- }
- //************************************************************************/
- // 描述: 1602液晶寫(xiě)指令
- //************************************************************************/
- void write_com(uchar com) //1602液晶寫(xiě)指令
- {
- rs=0; //寫(xiě)指令
- lcden=0; //使能1602
- P0=com; //寫(xiě)入指令com
- LCD_Delay_ms(1); //延時(shí)1ms
- lcden=1; //使能1602
- LCD_Delay_ms(2); //延時(shí)2ms
- lcden=0; //使能1602
- }
- //************************************************************************/
- // 描述:1602液晶寫(xiě)數(shù)據(jù)
- //************************************************************************/
- void write_date(uchar date) //1602液晶寫(xiě)數(shù)據(jù)
- {
- rs=1; //寫(xiě)數(shù)據(jù)
- lcden=0; //使能1602
- P0=date; //寫(xiě)入數(shù)據(jù)date
- LCD_Delay_ms(1); //延時(shí)1ms
- lcden=1; //使能1602
- LCD_Delay_ms(2); //延時(shí)2ms
- lcden=0; //使能1602
- }
- //************************************************************************/
- // 描述:指定x,y寫(xiě)入字符函數(shù)
- //************************************************************************/
- void W_lcd(unsigned char x,unsigned char y,unsigned char Data)
- {
- if (y == 0){write_com(0x80 + x);} //第一行
- else{write_com(0xc0 + x);} //第二行
- write_date( Data); //寫(xiě)入數(shù)據(jù)
- }
- //指定x,y寫(xiě)入字符串函數(shù)
- void LCD_Write_String(unsigned char x,unsigned char y,unsigned char *s)
- {
- if (y == 0){write_com(0x80 + x);} //第一行
- else{write_com(0xC0 + x);} //第二行
- while (*s) //
- {write_date( *s); s++;} //寫(xiě)入數(shù)據(jù)
- }
- //************************************************************************/
- // 描述:初始化液晶,及畫(huà)面初始化
- //************************************************************************/
- void init_lcd(void) //初始化液晶,及畫(huà)面初始化
- {
- wela=0; //寫(xiě)液晶
- lcden=0; //使能1602
- write_com(0x38); //8 位總線,雙行顯示,5X7 的點(diǎn)陣字符
- LCD_Delay_us(100); //延時(shí)100us
- write_com(0x0c); //開(kāi)顯示,無(wú)光標(biāo),光標(biāo)不閃爍
- write_com(0x06); //光標(biāo)右移動(dòng)
- write_com(0x01); //清屏
- write_com(0x80); //DDRAM 地址歸0
- }
- //************************************************************************/
- // 描述: 反轉(zhuǎn)法鍵盤(pán)掃描
- //************************************************************************/
- short keycheckdown() /* 反轉(zhuǎn)法鍵盤(pán)掃描 */
- {
-
- short temp1,temp2,temp,a=0xff;
- P1=0xf0; /* 輸入行值(或列值) */
- LCD_Delay_ms(20); /* 延時(shí) */
- temp1=P1; /* 讀列值(或行值) */
- P1=0xff;
- LCD_Delay_ms(20); /* 延時(shí) */
- P1=0x0f; /* 輸入列值(或行值) */
- LCD_Delay_ms(20); /* 延時(shí) */
- temp2=P1; /* 讀行值(或列值) */
- P1=0xff;
- temp=(temp1&0xf0)|(temp2&0xf); /* 將兩次讀入數(shù)據(jù)組合 */
- switch(temp) /* 通過(guò)讀入數(shù)據(jù)組合判斷按鍵位置 */
- {
-
-
- case 0x77 :a=0x0d;break;// 按鍵/
- case 0x7b :a=0x0e; break;// 按鍵=
- case 0x7d :a=0; break;// 按鍵0
- case 0x7e :a=0x0f; break;// 按鍵CE
-
- case 0xb7 :a=0x0c;break;// 按鍵*
- case 0xbb :a=0x9;break; // 按鍵9
- case 0xbd :a=0x8;break; // 按鍵8
- case 0xbe :a=0x7;break; // 按鍵7
-
- case 0xd7 :a=0x0b;break;// 按鍵-
- case 0xdb :a=0x6;break; // 按鍵6
- case 0xdd :a=0x5;break; // 按鍵5
- case 0xde :a=0x4;break; // 按鍵4
-
- case 0xe7 :a=0x0a; break;// 按鍵+
- case 0xeb :a=3;break; // 按鍵3
- case 0xed :a=2;break; // 按鍵2
- case 0xee :a=1;break; // 按鍵1
-
- default :a=0xff;
- }
- return a; /* 返回按鍵值 */
- }
- void display_a() //顯示數(shù)據(jù)a
- {
- dispaly[3]=data_a%10000/1000; //千
- dispaly[2]=data_a%1000/100; //百
- dispaly[1]=data_a%100/10; //十
- dispaly[0]=data_a%10; //個(gè)
-
- write_com(0x80+0); //顯示數(shù)據(jù)a
- if(data_a>999){ write_date('0'+dispaly[3]);} //顯示千位
- if(data_a>99){ write_date('0'+dispaly[2]);} //顯示百位
- if(data_a>9){ write_date('0'+dispaly[1]);} //顯示十位
- write_date('0'+dispaly[0]); //顯示個(gè)位
- }
-
- void display_b() //顯示數(shù)據(jù)b
- {
- write_com(0x80+7); //第一行
- dispaly[3]=data_b%10000/1000; //千
- dispaly[2]=data_b%1000/100; //百
- dispaly[1]=data_b%100/10; //十
- dispaly[0]=data_b%10; //個(gè)
-
- if(data_b>999){ write_date('0'+dispaly[3]); } //顯示千位
- if(data_b>99) { write_date('0'+dispaly[2]); } //顯示百位
- if(data_b>9) { write_date('0'+dispaly[1]); } //顯示十位
- write_date('0'+dispaly[0]); //顯示個(gè)位
- }
-
- //計(jì)算結(jié)果
- void display_c(x)
- {
-
- if(data_c<100000000&&data_c>-1)//溢出時(shí)顯示錯(cuò)誤
- {
-
- dispaly[8]=data_c%1000000000/100000000; //萬(wàn)萬(wàn)
- dispaly[7]=data_c%100000000/10000000; //千萬(wàn)
- dispaly[6]=data_c%10000000/1000000; //百萬(wàn)
- dispaly[5]=data_c%1000000/100000; //十萬(wàn)
- dispaly[4]=data_c%100000/10000; //萬(wàn)
- dispaly[3]=data_c%10000/1000; //千
- dispaly[2]=data_c%1000/100; //百
- dispaly[1]=data_c%100/10; //十
- dispaly[0]=data_c%10; //個(gè)
- write_com(0x80+6+0x40); //第一行
- if(x==4)
- {
- if(data_c>99999999) { write_date('0'+dispaly[8]);} //顯示萬(wàn)萬(wàn)
- if(data_c>9999999) { write_date('0'+dispaly[7]);} //千萬(wàn)
- if(data_c>999999) { write_date('0'+dispaly[6]);} //百萬(wàn)
- if(data_c>99999) { write_date('0'+dispaly[5]);} //十萬(wàn)
- write_date('0'+dispaly[4]); //萬(wàn)
- write_date('.');
- write_date('0'+dispaly[3]); //千
- write_date('0'+dispaly[2]); //百
- write_date('0'+dispaly[1]); //十
- write_date('0'+dispaly[0]); //個(gè)
- }
- else{
- if(data_c>99999999) { write_date('0'+dispaly[8]);} //顯示萬(wàn)萬(wàn)
- if(data_c>9999999) { write_date('0'+dispaly[7]);} //千萬(wàn)
- if(data_c>999999) { write_date('0'+dispaly[6]);} //百萬(wàn)
- if(data_c>99999) { write_date('0'+dispaly[5]);} //十萬(wàn)
- if(data_c>9999) { write_date('0'+dispaly[4]);} //萬(wàn)
- if(data_c>999) { write_date('0'+dispaly[3]);} //千
- if(data_c>99) { write_date('0'+dispaly[2]);} //百
- if(data_c>9) { write_date('0'+dispaly[1]);} //十
- write_date('0'+dispaly[0]); //個(gè)
- }
- }
- else //溢出時(shí)顯示錯(cuò)誤
- {
- write_com(0x80+11+0x40); //第一行
- write_date('E'); //顯示 E
- write_date('r'); //顯示R
- write_date('r'); //顯示R
- write_date('o'); //顯示O
- write_date('r'); //顯示E
- }
- }
-
- void eql(uchar x)//加減乘除運(yùn)算
- {
- switch(x) /*功能鍵選擇*/
- {
- case 1:data_c=data_a+data_b;break; //加 /* + S=1 */ /* 數(shù)值轉(zhuǎn)換函數(shù) */
- case 2:if(data_a>=data_b){data_c=data_a-data_b;} /* - S=2 *///減
- else{data_c=data_b-data_a;W_lcd(5,1,'-');} //負(fù)數(shù)符號(hào)
- break;
- case 3:data_c=(data_a*data_b);break; /* * S=3 *///乘
- case 4:if(data_b==0){LCD_Write_String(0,1,"Error !");}else{data_c=(data_a*10000)/data_b;}break; /* / S=4 *///除//溢出時(shí)顯示錯(cuò)誤
- case 0:break;
- }
-
- }
-
- void main()
- {
- uchar key=0xff; //鍵值初始化
- uchar n=0; //第1個(gè)數(shù)可以按1-4次
- uchar m=5; //第2個(gè)數(shù)可以按1-4次
- uchar x=0;
- data_a=0; //前一個(gè)數(shù)
- data_b=0; //后一個(gè)數(shù)
- data_c=0; //結(jié)果
- init_lcd(); //1602液晶初始化
- display_a();
- while(1)
- {
- key=keycheckdown(); /*動(dòng)態(tài)掃描鍵盤(pán),返回按鍵對(duì)應(yīng)值,賦給j key=0到f */
- if(0xff!=key) /*若返回值有效,進(jìn)入內(nèi)部處理程序*/
- {
- if(key<10)
- {
- if(n<4){data_a=data_a*10+key;m=5;display_a();}n++; //首先輸入第一個(gè)數(shù)
- if(m<4){data_b=data_b*10+key;n=5;display_b();}m++; //必須按了+-*/才能輸入第二個(gè)數(shù)
- }
- else
- { switch(key) /*功能鍵選擇*/
- {
- case 0xa:n=5;m=0;x=1;W_lcd(5,0,'+');break; //加 /* + S=1 */ /* 數(shù)值轉(zhuǎn)換函數(shù) */
- case 0xb:n=5;m=0;x=2;W_lcd(5,0,'-');break; /* - S=2 *///減
- case 0xc:n=5;m=0;x=3;W_lcd(5,0,'*');break; /* * S=3 *///乘
- case 0xd:n=5;m=0;x=4;W_lcd(5,0,'/');break; /* / S=4 *///除
- case 0xe:n=5;m=5;eql(x);W_lcd(12,0,'=');display_c(x);break;
- …………限于本文篇幅 余下代碼請(qǐng)從51黑下載附件…………
復(fù)制代碼
完整論文下載(word格式 可編輯):
單片機(jī)作品之計(jì)算器設(shè)計(jì)報(bào)告.doc
(622.26 KB, 下載次數(shù): 299)
2017-5-13 13:46 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5