電氣工程項(xiàng)目綜合設(shè)計(jì) 設(shè)計(jì)文檔
1.1課題簡(jiǎn)介 1.2設(shè)計(jì)目的 1.3設(shè)計(jì)任務(wù) 1.4 章節(jié)安排說(shuō)明 2.1 單片機(jī)發(fā)展現(xiàn)狀 2.2 計(jì)算器系統(tǒng)現(xiàn)狀 2.3 簡(jiǎn)易計(jì)算器系統(tǒng)簡(jiǎn)介 3.1 MCS-51系列單片機(jī)簡(jiǎn)介 3.2 其它器件簡(jiǎn)介 3.2.1數(shù)碼管顯示 3.2.2矩陣按鍵 4.1 計(jì)算器硬件電路設(shè)計(jì) 4.2計(jì)算器程序設(shè)計(jì) 4.2.1存儲(chǔ)單元分配 4.2.2主程序設(shè)計(jì) 4.2.3數(shù)碼管顯示數(shù)據(jù)轉(zhuǎn)換子程序 4.2.4數(shù)碼管動(dòng)態(tài)顯示子程序 4-3圖 系統(tǒng)總框圖: 4.4程序源代碼: 4.5硬件連線圖: 心得 參考文獻(xiàn) 附件:
1.1課題簡(jiǎn)介單片機(jī)由于其微小的體積和極低的成本,廣泛的應(yīng)用于家用電器、工業(yè)控制等領(lǐng)域中。在工業(yè)生產(chǎn)中。單片機(jī)微型計(jì)算機(jī)是微型計(jì)算機(jī)的一個(gè)重要分支,也是頗具生命力的機(jī)種。單片機(jī)微型計(jì)算機(jī)簡(jiǎn)稱單片機(jī),特別適用于控制領(lǐng)域,故又稱為微控制器。 本系統(tǒng)就是充分利用了8051芯片的I/O引腳。系統(tǒng)統(tǒng)采用MSC-51系列單片機(jī)Intel8051為中心器件來(lái)設(shè)計(jì)計(jì)算器控制器,實(shí)現(xiàn)了能根據(jù)實(shí)際輸入值顯示并存儲(chǔ),計(jì)算程序則是參照教材。至于位數(shù)和功能,如果有需要可以設(shè)計(jì)擴(kuò)充原系統(tǒng)來(lái)實(shí)現(xiàn) 。 1.2設(shè)計(jì)目的通過(guò)本次工程實(shí)踐,運(yùn)用《智能化測(cè)量控制儀表原理與設(shè)計(jì)》、《MCS-51系列單片微型計(jì)算機(jī)及其應(yīng)用》所學(xué)知識(shí)及查閱相關(guān)資料,完成簡(jiǎn)易計(jì)算器的設(shè)計(jì),達(dá)到理論知識(shí)與實(shí)踐更好結(jié)合、提高綜合運(yùn)用所學(xué)知識(shí)和設(shè)計(jì)能力的目的。 通過(guò)本次設(shè)計(jì)訓(xùn)練,可以使我們?cè)诨舅悸泛突痉椒ㄉ蠈?duì)基于MCS-51單片機(jī)的嵌入式系統(tǒng)設(shè)計(jì)有一個(gè)比較感性的認(rèn)識(shí),并具備一定程度的設(shè)計(jì)能力。 1.3設(shè)計(jì)任務(wù)在本次工程實(shí)踐中,主要完成如下方面的設(shè)計(jì)任務(wù): 1)簡(jiǎn)要綜述單片機(jī)技術(shù)發(fā)展的國(guó)內(nèi)外現(xiàn)狀及數(shù)碼管動(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ù)確定; 5)用protues軟件完成原理電路的繪制; 6)完成系統(tǒng)設(shè)計(jì)說(shuō)明書(shū)。 1.4 章節(jié)安排說(shuō)明整個(gè)設(shè)計(jì)總共分為四個(gè)章節(jié),第一章是前言部分,主要介紹了設(shè)計(jì)基于單片機(jī)簡(jiǎn)易計(jì)算器的意義、目的及主要內(nèi)容;第二章簡(jiǎn)要介紹了單片機(jī)發(fā)展的國(guó)內(nèi)外現(xiàn)狀及鍵盤(pán)掃描,數(shù)據(jù)轉(zhuǎn)換,和動(dòng)態(tài)顯示原理進(jìn)行了簡(jiǎn)要的說(shuō)明。第三章是器件簡(jiǎn)介,這一部分主要介紹了系統(tǒng)的所用主要器件的選擇。第四章是系統(tǒng)詳細(xì)設(shè)計(jì)階段,分為硬件設(shè)計(jì)和程序設(shè)計(jì)。按照程序設(shè)計(jì)的各部分實(shí)現(xiàn)的功能不同,將整個(gè)軟件系統(tǒng)分成了三個(gè)塊,并對(duì)每一個(gè)功能塊所采用的元器件進(jìn)行了詳細(xì)介紹。此外還編寫(xiě)了主要功能模塊的基本程序,詳盡闡述了各模塊的工作過(guò)程。還有總流程圖,源代碼,硬器件鋪線圖。
2.1 單片機(jī)發(fā)展現(xiàn)狀單片機(jī)的發(fā)展趨勢(shì):低功耗CMOS化;微型單片化;主流與多品種共存;單片機(jī)從8位、16位到32位,數(shù)不勝數(shù),應(yīng)有盡有,有與主流C51系列兼容的,也有不兼容的,但它們各具特色,互成互補(bǔ),為單片機(jī)的應(yīng)用提供廣闊的天地。
縱觀單片機(jī)的發(fā)展過(guò)程,可以預(yù)示單片機(jī)的發(fā)展趨勢(shì),大致有: 1)低功耗CMOS化
MCS-51系列的8051推出時(shí)的功耗達(dá)630mW,而現(xiàn)在的單片機(jī)普遍都在100mW左右,隨著對(duì)單片機(jī)功耗要求越來(lái)越低,現(xiàn)在的各個(gè)單片機(jī)制造商基本都采用了CMOS(互補(bǔ)金屬氧化物半導(dǎo)體工藝)。象80C51就采用了HMOS(即高密度金屬氧化物半導(dǎo)體工藝)和CHMOS(互補(bǔ)高密度金屬氧化物半導(dǎo)體工藝)。CMOS雖然功耗較低,但由于其物理特征決定其工作速度不夠高,而CHMOS則具備了高速和低功耗的特點(diǎn),這些特征,更適合于在要求低功耗象電池供電的應(yīng)用場(chǎng)合。所以這種工藝將是今后一段時(shí)期單片機(jī)發(fā)展的主要途徑。 2)微型單片化
現(xiàn)在常規(guī)的單片機(jī)普遍都是將中央處理器(CPU)、隨機(jī)存取數(shù)據(jù)存儲(chǔ)(RAM)、只讀程序存儲(chǔ)器(ROM)、并行和串行通信接口,中斷系統(tǒng)、定時(shí)電路、時(shí)鐘電路集成在一塊單一的芯片上,增強(qiáng)型的單片機(jī)集成了如A/D轉(zhuǎn)換器、PMW(脈寬調(diào)制電路)、WDT(看門(mén)狗)、有些單片機(jī)將LCD(液晶)驅(qū)動(dòng)電路都集成在單一的芯片上,這樣單片機(jī)包含的單元電路就更多,功能就越強(qiáng)大。甚至單片機(jī)廠商還可以根據(jù)用戶的要求量身定做,制造出具有自己特色的單片機(jī)芯片。
此外,現(xiàn)在的產(chǎn)品普遍要求體積小、重量輕,這就要求單片機(jī)除了功能強(qiáng)和功耗低外,還要求其體積要小,F(xiàn)在的許多單片機(jī)都具有多種封裝形式,其中SMD(表面封裝)越來(lái)越受歡迎,使得由單片機(jī)構(gòu)成的系統(tǒng)正朝微型化方向發(fā)展。 3)主流與多品種共存
現(xiàn)在雖然單片機(jī)的品種繁多,各具特色,但仍以80C51為核心的單片機(jī)占主流,兼容其結(jié)構(gòu)和指令系統(tǒng)的有PHILIPS公司的產(chǎn)品 2.2 計(jì)算器系統(tǒng)現(xiàn)狀計(jì)算器一般由運(yùn)算器、控制器、存儲(chǔ)器、鍵盤(pán)、顯示器、電源和一些可選外圍設(shè)備及電子配件通過(guò)人工或機(jī)器設(shè)備組成。低檔計(jì)算器的運(yùn)算器、控制器由數(shù)字邏輯電路實(shí)現(xiàn)簡(jiǎn)單的串行運(yùn)算,其隨機(jī)存儲(chǔ)器只有一、二個(gè)單元,供累加存儲(chǔ)用。高檔計(jì)算器由微處理器和只讀存儲(chǔ)器實(shí)現(xiàn)各種復(fù)雜的運(yùn)算程序,有較多的隨機(jī)存儲(chǔ)單元以存放輸入程序和數(shù)據(jù)。鍵盤(pán)是計(jì)算器的輸入部件,一般采用接觸式或傳感式。為減小計(jì)算器的尺寸,一鍵常常有多種功能。顯示器是計(jì)算器的輸出部件,有發(fā)光二極管顯示器或液晶顯示器等。除顯示計(jì)算結(jié)果外,還常有溢出指示、錯(cuò)誤指示等。計(jì)算器電源采用交流轉(zhuǎn)換器或電池,電池可用交流轉(zhuǎn)換器或太陽(yáng)能轉(zhuǎn)換器再充電。為節(jié)省電能,計(jì)算器都采用CMOS工藝制作的大規(guī)模集成電路(見(jiàn)互補(bǔ)金屬-氧化物-半導(dǎo)體集成電路),并在內(nèi)部裝有定時(shí)不操作自動(dòng)斷電電路。計(jì)算器可選用的外圍設(shè)備有微型打印機(jī)、盒式磁帶機(jī)和磁卡機(jī)等。 2.3 簡(jiǎn)易計(jì)算器系統(tǒng)簡(jiǎn)介本計(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)換,之后送入數(shù)碼管動(dòng)態(tài)顯示。整個(gè)系統(tǒng)可分為三個(gè)主要功能模塊:功能模塊一,實(shí)時(shí)鍵盤(pán)掃描;功能模塊二,數(shù)據(jù)轉(zhuǎn)換為了數(shù)碼管顯示;功能模塊三,數(shù)碼管動(dòng)態(tài)顯示。 3.1 MCS-51系列單片機(jī)簡(jiǎn)介8051是MCS-51系列單片機(jī)的典型產(chǎn)品,以這一代表性的機(jī)型進(jìn)行系統(tǒng)的講解。
8051單片機(jī)包含中央處理器、程序存儲(chǔ)器(ROM)、數(shù)據(jù)存儲(chǔ)器(RAM)、定時(shí)/計(jì)數(shù)器、并行接口、串行接口和中斷系統(tǒng)等幾大單元及數(shù)據(jù)總線、地址總線和控制總線等三大總線,現(xiàn)在我們分別加以說(shuō)明: ·中央處理器: 中央處理器(CPU)是整個(gè)單片機(jī)的核心部件,是8位數(shù)據(jù)寬度的處理器,能處理8位二進(jìn)制數(shù)據(jù)或代碼,CPU負(fù)責(zé)控制、指揮和調(diào)度整個(gè)單元系統(tǒng)協(xié)調(diào)的工作,完成運(yùn)算和控制輸入輸出功能等操作。 ·數(shù)據(jù)存儲(chǔ)器(RAM) 8051內(nèi)部有128個(gè)8位用戶數(shù)據(jù)存儲(chǔ)單元和128個(gè)專用寄存器單元,它們是統(tǒng)一編址的,專用寄存器只能用于存放控制指令數(shù)據(jù),用戶只能訪問(wèn),而不能用于存放用戶數(shù)據(jù),所以,用戶能使用的RAM只有128個(gè),可存放讀寫(xiě)的數(shù)據(jù),運(yùn)算的中間結(jié)果或用戶定義的字型表。 圖3-1 8051內(nèi)部結(jié)構(gòu)圖 ·程序存儲(chǔ)器(ROM): 8051共有4096個(gè)8位掩膜ROM,用于存放用戶程序,原始數(shù)據(jù)或表格。 ·定時(shí)/計(jì)數(shù)器(ROM): 8051有兩個(gè)16位的可編程定時(shí)/計(jì)數(shù)器,以實(shí)現(xiàn)定時(shí)或計(jì)數(shù)產(chǎn)生中斷用于控制程序轉(zhuǎn)向。 ·并行輸入輸出(I/O)口: 8051共有4組8位I/O口(P0、 P1、P2或P3),用于對(duì)外部數(shù)據(jù)的傳輸。 ·全雙工串行口: 8051內(nèi)置一個(gè)全雙工串行通信口,用于與其它設(shè)備間的串行數(shù)據(jù)傳送,該串行口既可以用作異步通信收發(fā)器,也可以當(dāng)同步移位器使用。 ·中斷系統(tǒng): 8051具備較完善的中斷功能,有兩個(gè)外中斷、兩個(gè)定時(shí)/計(jì)數(shù)器中斷和一個(gè)串行中斷,可滿足不同的控制要求,并具有2級(jí)的優(yōu)先級(jí)別選擇。 ·時(shí)鐘電路: 8051內(nèi)置最高頻率達(dá)12MHz的時(shí)鐘電路,用于產(chǎn)生整個(gè)單片機(jī)運(yùn)行的脈沖時(shí)序,但8051單片機(jī)需外置振蕩電容。 單片機(jī)的結(jié)構(gòu)有兩種類型,一種是程序存儲(chǔ)器和數(shù)據(jù)存儲(chǔ)器分開(kāi)的形式,即哈佛(Harvard)結(jié)構(gòu),另一種是采用通用計(jì)算機(jī)廣泛使用的程序存儲(chǔ)器與數(shù)據(jù)存儲(chǔ)器合二為一的結(jié)構(gòu),即普林斯頓(Princeton)結(jié)構(gòu)。INTEL的MCS-51系列單片機(jī)采用的是哈佛結(jié)構(gòu)的形式,而后續(xù)產(chǎn)品16位的MCS-96系列單片機(jī)則采用普林斯頓結(jié)構(gòu)。 下圖是MCS-51系列單片機(jī)的內(nèi)部結(jié)構(gòu)示意圖3-2。
圖3-2 MCS-51結(jié)構(gòu)圖 MCS-51的引腳說(shuō)明: MCS-51系列單片機(jī)中的8031、8051及8751均采用40Pin封裝的雙列直接DIP結(jié)構(gòu),右圖是它們的引腳配置,40個(gè)引腳中,正電源和地線兩根,外置石英振蕩器的時(shí)鐘線兩根,4組8位共32個(gè)I/O口,中斷口線與P3口線復(fù)用,F(xiàn)在我們對(duì)這些引腳的功能加以說(shuō)明: MCS-51的引腳說(shuō)明: MCS-51系列單片機(jī)中的8031、8051及8751均采用40Pin封裝的雙列直接DIP結(jié)構(gòu),右圖是它們的引腳配置,40個(gè)引腳中,正電源和地線兩根,外置石英振蕩器的時(shí)鐘線兩根,4組8位共32個(gè)I/O口,中斷口線與P3口線復(fù)用。現(xiàn)在我們對(duì)這些引腳的功能加以說(shuō)明:如圖3-3 圖3-3雙列直插式封裝引腳圖 Pin9:RESET/Vpd復(fù)位信號(hào)復(fù)用腳,當(dāng)8051通電,時(shí)鐘電路開(kāi)始工作,在RESET引腳上出現(xiàn)24個(gè)時(shí)鐘周期以上的高電平,系統(tǒng)即初始復(fù)位。初始化后,程序計(jì)數(shù)器PC指向0000H,P0-P3輸出口全部為高電平,堆棧指針寫(xiě)入07H,其它專用寄存器被清“0”。RESET由高電平下降為低電平后,系統(tǒng)即從0000H地址開(kāi)始執(zhí)行程序。然而,初始復(fù)位不改變RAM(包括工作寄存器R0-R7)的狀態(tài),8051的初始態(tài)。 8051的復(fù)位方式可以是自動(dòng)復(fù)位,也可以是手動(dòng)復(fù)位。此外,RESET/Vpd還是一復(fù)用腳,Vcc掉電其間,此腳可接上備用電源,以保證單片機(jī)內(nèi)部RAM的數(shù)據(jù)不丟失。見(jiàn)下圖3-4為兩種復(fù)位方式和兩種時(shí)鐘方式:
·Pin30:ALE/
當(dāng)訪問(wèn)外部程序器時(shí),ALE(地址鎖存)的輸出用于鎖存地址的低位字節(jié)。而訪問(wèn)內(nèi)部程序存儲(chǔ)器時(shí),ALE端將有一個(gè)1/6時(shí)鐘頻率的正脈沖信號(hào),這個(gè)信號(hào)可以用于識(shí)別單片機(jī)是否工作,也可以當(dāng)作一個(gè)時(shí)鐘向外輸出。更有一個(gè)特點(diǎn),當(dāng)訪問(wèn)外部程序存儲(chǔ)器,ALE會(huì)跳過(guò)一個(gè)脈沖。 如果單片機(jī)是EPROM,在編程其間,將用于輸入編程脈沖。 ·Pin29:
當(dāng)訪問(wèn)外部程序存儲(chǔ)器時(shí),此腳輸出負(fù)脈沖選通信號(hào),PC的16位地址數(shù)據(jù)將出現(xiàn)在P0和P2口上,外部程序存儲(chǔ)器則把指令數(shù)據(jù)放到P0口上,由CPU讀入并執(zhí)行。 ·Pin31:EA/Vpp程序存儲(chǔ)器的內(nèi)外部選通線,8051和8751單片機(jī),內(nèi)置有4kB的程序存儲(chǔ)器,當(dāng)EA為高電平并且程序地址小于4kB時(shí),讀取內(nèi)部程序存儲(chǔ)器指令數(shù)據(jù),而超過(guò)4kB地址則讀取外部指令數(shù)據(jù)。如EA為低電平,則不管地址大小,一律讀取外部程序存儲(chǔ)器指令。顯然,對(duì)內(nèi)部無(wú)程序存儲(chǔ)器的8031,EA端必須接地。 在編程時(shí),EA/Vpp腳還需加上21V的編程電壓。 3.2 其它器件簡(jiǎn)介3.2.1數(shù)碼管顯示在本任務(wù)中用4位數(shù)碼管顯示當(dāng)前數(shù)值的千,百,十,個(gè),由于數(shù)碼管個(gè)數(shù)多,如采用靜態(tài)顯示方式,則占用單片機(jī)的I/O口線太多,如果用定時(shí)器/計(jì)數(shù)器的串行移位寄存器工作方式及外接串入并出移位寄存器74LS164的方式,則電路復(fù)雜。所以,在數(shù)碼管個(gè)數(shù)較多時(shí),常采用動(dòng)態(tài)顯示方式。 4位數(shù)碼管的相同段并聯(lián)在一起,由一個(gè)8位I/O(P1口)輸出字形碼控制顯示某一字形,每個(gè)數(shù)碼管的公共端由另外一個(gè)I/O口(P0口)輸出的字位碼控制,即數(shù)碼管顯示的字形是由單片機(jī)I/O口輸出的字形碼確定,而哪個(gè)數(shù)碼管點(diǎn)亮是由單片機(jī)I/O口輸出的字位碼確定的。4個(gè)數(shù)碼管分時(shí)輪流循環(huán)點(diǎn)亮,在同一時(shí)刻只有1個(gè)數(shù)碼管點(diǎn)亮,但由于數(shù)碼管具有余輝特性及人眼具有視覺(jué)暫留特性,所以適當(dāng)?shù)剡x取循環(huán)掃描頻率,看上去所有數(shù)碼管是同時(shí)點(diǎn)亮的,察覺(jué)不出閃爍現(xiàn)象。動(dòng)態(tài)顯示方式所接數(shù)碼管不能太多,否則會(huì)因每個(gè)數(shù)碼管所分配的實(shí)際導(dǎo)通時(shí)間太少,使得數(shù)碼管的亮度不足。在本任務(wù)中,為了簡(jiǎn)便,字形碼和字位碼都沒(méi)由加驅(qū)動(dòng)電路,在實(shí)際應(yīng)用中應(yīng)加驅(qū)動(dòng)電路。數(shù)碼管有共陰極和共陽(yáng)極兩種,對(duì)于共陽(yáng)數(shù)碼管,字形驅(qū)動(dòng)輸出0有效,字位驅(qū)動(dòng)輸出1有效;而對(duì)于共陰數(shù)碼管則相反,即:字形驅(qū)動(dòng)輸出1有效,字位驅(qū)動(dòng)輸出0有效。 3.2.2矩陣按鍵鍵盤(pán)是單片機(jī)系統(tǒng)中最常用的人機(jī)對(duì)話輸入設(shè)備,用戶通過(guò)鍵盤(pán)向單片機(jī)輸入數(shù)據(jù)或指令。鍵盤(pán)控制程序需完成的任務(wù)有:監(jiān)測(cè)是否有鍵按下,有鍵按下時(shí),在無(wú)硬件去抖的動(dòng)電路時(shí),應(yīng)用軟件延時(shí)方法消除按鍵抖動(dòng)影響;當(dāng)有多個(gè)鍵同時(shí)按下時(shí),只處理一個(gè)按鍵,不管一次按鍵持續(xù)多長(zhǎng)時(shí)間,僅執(zhí)行一次按鍵功能程序。 矩陣按鍵掃描程序是一種節(jié)省IO口的方法,按鍵數(shù)目越多節(jié)省IO口就越可觀,思路:先判斷某一列(行)是否有按鍵按下,再判斷該行(列)是那一只鍵按下。但是,在程序的寫(xiě)法上,采用了最簡(jiǎn)單的方法,使得程序效率最高。本程序中,如果檢測(cè)到某鍵按下了,就不再檢測(cè)其它的按鍵,這完全能滿足絕大多數(shù)需要,又能節(jié)省大量的CPU時(shí)間。 本鍵盤(pán)掃描程序的優(yōu)點(diǎn)在于:不用專門(mén)的按鍵延時(shí)程序,提高了CPU效率,也不用中斷來(lái)掃描鍵盤(pán),節(jié)省了硬件資源。另外,本鍵盤(pán)掃描程序,每次掃描占用CPU時(shí)最短,不論有鍵按下或者無(wú)鍵按下都可以在很短的時(shí)間完成一次掃描。 本鍵盤(pán)掃描子程序名叫key,每次要掃描時(shí)用lcall key調(diào)用即可.
4.1 計(jì)算器硬件電路設(shè)計(jì)8051單片機(jī)一片,4*4鍵盤(pán)一個(gè),4位共陽(yáng)極的七段數(shù)碼管一個(gè),連線和電阻和開(kāi)關(guān)若干。8051單片機(jī)的P2口作鍵盤(pán)口,其中P2.4-P2.7為鍵盤(pán)掃描輸出線,P2.0-P2.3為鍵盤(pán)掃描輸入線。鍵盤(pán)由4*4共16個(gè)按鍵組成,10個(gè)數(shù)字鍵(由0-9組成)5個(gè)運(yùn)算符號(hào)(加減乘除等于)組成,1個(gè)清除鍵(作用相當(dāng)于整體復(fù)位)。4個(gè)數(shù)碼管用于顯示當(dāng)前數(shù)值的千,百,十,個(gè),采用動(dòng)態(tài)顯示方式,P1口接4個(gè)數(shù)碼管的七段,P0口分別接4個(gè)數(shù)碼管的公共端,P1口輸出數(shù)碼管的字形碼,P0口輸出數(shù)碼管的字位碼。 4.2計(jì)算器程序設(shè)計(jì)4.2.1存儲(chǔ)單元分配30H單元:數(shù)值個(gè)位顯示單元;31H單元:數(shù)值十位顯示單元;32H單元:數(shù)值百位顯示單元;33H單元:數(shù)值千位顯示單元;23H單元:第一操作數(shù)存儲(chǔ)單元;24H單元:第二操作數(shù)存儲(chǔ)單元;25H單元:鍵值暫存單元;27H單元:清除鍵狀態(tài);34H-37H單元:結(jié)果數(shù)據(jù)轉(zhuǎn)換暫存單元;38H-39H單元:結(jié)果高低8位暫存單元;R5單元:操作數(shù)計(jì)數(shù)單元;R4單元:操作數(shù)數(shù)值位數(shù)計(jì)數(shù)單元;R3單元:運(yùn)算符號(hào)存儲(chǔ)單元。 4.2.2主程序設(shè)計(jì)主程序進(jìn)行程序中用到的一些存儲(chǔ)單元的初始化,數(shù)值顯示和4*4鍵盤(pán)掃描。首先,進(jìn)行存儲(chǔ)單元初始化,給數(shù)碼管顯示單元30H-33H賦予“0000”字形數(shù)據(jù),將數(shù)值計(jì)數(shù)單元,存儲(chǔ)單元,23H-25H,34H-37H,38H,39H,3AH,3BH,3CH,賦予初值零。之后,調(diào)用鍵盤(pán)掃描子程序,和數(shù)碼管顯示數(shù)據(jù)轉(zhuǎn)換程序,數(shù)碼管動(dòng)態(tài)顯示子程序。主程序不斷進(jìn)行鍵盤(pán)掃描,數(shù)碼管顯示數(shù)據(jù)轉(zhuǎn)換子程序和動(dòng)態(tài)顯示子程序。 4.2.3數(shù)碼管顯示數(shù)據(jù)轉(zhuǎn)換子程序由于數(shù)值單元存放的是二進(jìn)制數(shù),而用戶熟悉的是十進(jìn)制數(shù),所以應(yīng)將數(shù)值單元中的二進(jìn)制轉(zhuǎn)換為十進(jìn)制數(shù),即BCD碼。要通過(guò)數(shù)碼管顯示出當(dāng)前數(shù)值,還必須將BCD碼進(jìn)一步轉(zhuǎn)換為七段碼,轉(zhuǎn)換的最終結(jié)果數(shù)據(jù)存放于顯示緩沖區(qū)30H-33H單元中,其中30H單元存放數(shù)值的個(gè)位七段碼,31H單元存放數(shù)值的十位七段碼,32H單元存放數(shù)值的百位七段碼,33H單元存放數(shù)值的千位七段碼。 4.2.4數(shù)碼管動(dòng)態(tài)顯示子程序本任務(wù)由P1口輸出字形碼,P0口輸出字位碼。先將存放于30H單元的數(shù)值個(gè)位七段碼由P1口輸出,同時(shí)P0口輸出使數(shù)值個(gè)位顯示數(shù)碼管點(diǎn)亮的字位碼。由于采用的是共陽(yáng)數(shù)碼管,所以只有該位數(shù)碼管對(duì)應(yīng)的P0.0為1,其他位P0.1-P0.3位0,點(diǎn)亮延時(shí)10MS。然后P1口輸出數(shù)值十位七段碼,P0.1位1,數(shù)值十位數(shù)碼管點(diǎn)亮,延時(shí)10MS。接著P1口輸出數(shù)值百位七段碼,P0.2為1,數(shù)值百位數(shù)碼管點(diǎn)亮,延時(shí)10MS。最后P1口輸出數(shù)值千位七段碼,P0.3為1,數(shù)值千位數(shù)碼管點(diǎn)亮,延時(shí)10MS。 4-3圖 系統(tǒng)總框圖: 4.4程序源代碼: 圖4-4 程序輸入導(dǎo)出hex文件
4.5硬件連線圖:
心得設(shè)計(jì)是培養(yǎng)學(xué)生綜合運(yùn)用所學(xué)知識(shí),發(fā)現(xiàn),提出,分析和解決實(shí)際問(wèn)題,鍛煉實(shí)踐能力的重要環(huán)節(jié),是對(duì)學(xué)生實(shí)際工作能力的具體訓(xùn)練和考察過(guò)程.隨著科學(xué)技術(shù)發(fā)展的日新日異,單片機(jī)已經(jīng)成為當(dāng)今計(jì)算機(jī)應(yīng)用中空前活躍的領(lǐng)域, 在生活中可以說(shuō)得是無(wú)處不在。因此作為二十一世紀(jì)的大學(xué)來(lái)說(shuō)掌握單片機(jī)的開(kāi)發(fā)技術(shù)是十分重要的。 回顧起此次單片機(jī)設(shè)計(jì),我仍感慨頗多,的確,從選題到定稿,從理論到實(shí)踐,可以說(shuō)得是苦多于甜,但是可以學(xué)到很多很多的的東西。通過(guò)這次設(shè)計(jì)使我懂得了理論與實(shí)際相結(jié)合是很重要的,只有理論知識(shí)是遠(yuǎn)遠(yuǎn)不夠的,只有把所學(xué)的理論知識(shí)與實(shí)踐相結(jié)合起來(lái),從理論中得出結(jié)論,才能真正為社會(huì)服務(wù),從而提高自己的實(shí)際動(dòng)手能力和獨(dú)立思考的能力。通過(guò)這次設(shè)計(jì)使我得到了一次用專業(yè)知識(shí)、專業(yè)技能分析和解決問(wèn)題全面系統(tǒng)的鍛煉。使我們?cè)趩纹瑱C(jī)的基本原理、單片機(jī)應(yīng)用系統(tǒng)開(kāi)發(fā)過(guò)程,以及在常用編程設(shè)計(jì)思路技巧的掌握方面都能向前邁了一大步,為日后成為合格的應(yīng)用型人才打下良好的基礎(chǔ)。 參考文獻(xiàn)[1] 徐愛(ài)鈞 .智能化測(cè)量控制儀表原理與設(shè)計(jì)(第二版).北京航天航空大學(xué)出版社,2004.9 [2] 孫育才等.MCS-51系列單片微型計(jì)算機(jī)及其應(yīng)用(第4版).東南大學(xué)出版社,2004,3 [3] 李萍 等.智能儀器實(shí)驗(yàn)指導(dǎo)書(shū).大連交通大學(xué),2007.9 [4]王明亮等. 廣播.電視調(diào)頻發(fā)送技術(shù),上、下冊(cè). 北京: 中國(guó)廣播電視出版社,1993 [5]梁延貴. 遙控電路可控硅觸發(fā)電路語(yǔ)音電路分冊(cè) 北京: 科學(xué)技術(shù)文獻(xiàn)出版社,2002 [6] 李華. MCS-51系列單片機(jī)實(shí)用接口技術(shù). 北京: 航天航空大學(xué)出版社,1999 [7] 邱關(guān)源.電路.高等教育出版社.1989.第三版. [8] 焦李成.電流模式信號(hào)處理的進(jìn)展與展望.電子學(xué)報(bào).1992.20(7):87-92 [9] 張肅文,陸兆文. 高頻電子電路.高等教育出版社.1993.第三版. [10] 康光華,陳大欽. 電子技術(shù)基礎(chǔ)(模擬部分).高等教育出版社.1999.6.第四版. [11] 陳汝全. 電子技術(shù)常用器件手冊(cè).北京:機(jī)械工業(yè)出版社,1994 [12] 魯兵,楊楚民. 基于單片機(jī)系統(tǒng)的顯示接口.機(jī)械與電子出版社,1992 評(píng)閱人: 年 月 日
- #include //頭文件
- #define uint unsigned int //
- #define uchar unsigned char
-
- sbit lcden=P2^3; //定義引腳
- sbit rs=P2^4;
- sbit rw=P2^0;
- sbit busy=P0^7;
-
- char i,j,temp,num,num_1;
- long a,b,c; //a,第一個(gè)數(shù) b,第二個(gè)數(shù) c,得數(shù)
- float a_c,b_c;
- uchar flag,fuhao;//flag表示是否有符號(hào)鍵按下,fuhao表征按下的是哪個(gè)符號(hào)
-
- uchar code table[]={
- 7,8,9,0,
- 4,5,6,0,
- 1,2,3,0,
- 0,0,0,0};
- uchar code table1[]={
- 7,8,9,0x2f-0x30,
- 4,5,6,0x2a-0x30,
- 1,2,3,0x2d-0x30,
- 0x01-0x30,0,0x3d-0x30,0x2b-0x30};
-
- void delay(uchar z) // 延遲函數(shù)
- {
- uchar y;
- for(z;z>0;z--)
- for(y=0;y<110;y++);
- }
-
- void check() // 判斷忙或空閑
- {
- do{
- P0=0xFF;
- rs=0; //指令
- rw=1; //讀
- lcden=0; //禁止讀寫(xiě)
- delay(1); //等待,液晶顯示器處理數(shù)據(jù)
- lcden=1; //允許讀寫(xiě)
- }while(busy==1); //判斷是否為空閑,1為忙,0為空閑
- }
- void write_com(uchar com) // 寫(xiě)指令函數(shù)
- {
- P0=com; //com指令付給P0口
- rs=0;
- rw=0;
- lcden=0;
- check();
- lcden=1;
- }
-
- void write_date(uchar date) // 寫(xiě)數(shù)據(jù)函數(shù)
- {
- P0=date;
- rs=1;
- rw=0;
- lcden=0;
- check();
- lcden=1;
- }
-
- void init() //初始化
- {
- num=-1;
- lcden=1; //使能信號(hào)為高電平
- write_com(0x38); //8位,2行
- write_com(0x0c); //顯示開(kāi),光標(biāo)關(guān),不閃爍*/
- write_com(0x06); //增量方式不移位 顯竟獗暌貧 柚?
- write_com(0x80); //檢測(cè)忙信號(hào)
- write_com(0x01); //顯示開(kāi),光標(biāo)關(guān),不閃爍
- num_1=0;
- i=0;
- j=0;
- a=0; //第一個(gè)參與運(yùn)算的數(shù)
- b=0; //第二個(gè)參與運(yùn)算的數(shù)
- c=0;
- flag=0; //flag表示是否有符號(hào)鍵按下,
- fuhao=0; // fuhao表征按下的是哪個(gè)符號(hào)
- }
- void keyscan() // 鍵盤(pán)掃描程序
- {
-
- P3=0xfe;
- if(P3!=0xfe)
- {
- delay(20); 延遲20ms
- if(P3!=0xfe)
- {
- temp=P3&0xf0;
- switch(temp)
- {
- case 0xe0:num=0;
- break;
- case 0xd0:num=1;
- break;
- case 0xb0:num=2;
- break;
- case 0x70:num=3;
- break;
- }
- }
- while(P3!=0xfe);
- if(num==0||num==1||num==2)//如果按下的是'7','8'或'9
- {
- if(j!=0)
- {
- write_com(0x01);
- j=0;
- }
- if(flag==0)//沒(méi)有按過(guò)符號(hào)鍵
- {
- a=a*10+table[num];
- }
- else//如果按過(guò)符號(hào)鍵
- {
- b=b*10+table[num];
- }
- }
- else//如果按下的是'/'
- {
- flag=1;
- fuhao=4;//4表示除號(hào)已按
- }
- i=table1[num];
- write_date(0x30+i);
- }
-
- P3=0xfd;
- if(P3!=0xfd)
- {
- delay(5);
- if(P3!=0xfd)
- {
- temp=P3&0xf0;
- switch(temp)
- {
- case 0xe0:num=4;
- break;
-
- case 0xd0:num=5;
- break;
-
- case 0xb0:num=6;
- break;
-
- case 0x70:num=7;
- break;
- }
- }
- while(P3!=0xfd);
- if(num==4||num==5||num==6&&num!=7)//如果按下的是'4','5'或'6'
- {
- if(j!=0)
- {
- write_com(0x01);
- j=0;
- }
- if(flag==0)//沒(méi)有按過(guò)符號(hào)鍵
- {
- a=a*10+table[num];
- }
- else//如果按過(guò)符號(hào)鍵
- {
- b=b*10+table[num];
- }
- }
- else//如果按下的是'/'
- {
- flag=1;
- fuhao=3;//3表示乘號(hào)已按
- }
- i=table1[num];
- write_date(0x30+i);
- }
-
- P3=0xfb;
- if(P3!=0xfb)
- {
- delay(5);
- if(P3!=0xfb)
- {
- temp=P3&0xf0;
- switch(temp)
- {
- case 0xe0:num=8;
- break;
-
- case 0xd0:num=9;
- break;
-
- case 0xb0:num=10;
- break;
-
- case 0x70:num=11;
- break;
- }
- }
- while(P3!=0xfb);
- if(num==8||num==9||num==10)//如果按下的是'1','2'或'3'
- {
- if(j!=0)
- {
- write_com(0x01);
- j=0;
- }
- if(flag==0)//沒(méi)有按過(guò)符號(hào)鍵
- {
- a=a*10+table[num];
- }
- else//如果按過(guò)符號(hào)鍵
- {
- b=b*10+table[num];
- }
- }
- else if(num==11)//如果按下的是'-'
- {
- flag=1;
- fuhao=2;//2表示減號(hào)已按
- }
- i=table1[num];
- write_date(0x30+i);
- }
-
- P3=0xf7;
- if(P3!=0xf7)
- {
- delay(5);
- if(P3!=0xf7)
- {
- temp=P3&0xf0;
- switch(temp)
- {
- case 0xe0:num=12;
- break;
-
- case 0xd0:num=13;
- break;
-
- case 0xb0:num=14;
- break;
-
- case 0x70:num=15;
- break;
- }
- }
- while(P3!=0xf7);
- switch(num)
- {
- case 12:{write_com(0x01);a=0;b=0;flag=0;fuhao=0;}//按下的是"清零"
- break;
- case 13:{ //按下的是"0"
- if(flag==0)//沒(méi)有按過(guò)符號(hào)鍵
- {
- a=a*10;
- write_date(0x30);
- P1=0;
- }
- else if(flag==1)//如果按過(guò)符號(hào)鍵
- {
- b=b*10;
- write_date(0x30);
- }
- }
- break;
- case 14:{j=1;
- if(fuhao==1){write_com(0x80+0x4f);//按下等于鍵,光標(biāo)前進(jìn)至第二行最后一個(gè)顯示處
- write_com(0x04); //設(shè)置從后住前寫(xiě)數(shù)據(jù),每寫(xiě)完一個(gè)數(shù)據(jù),光標(biāo)后退一格
- c=a+b;
- while(c!=0)
- {
- write_date(0x30+c%10);
- c=c/10;
- }
- write_date(0x3d); //再寫(xiě)"="
- a=0;b=0;flag=0;fuhao=0;
- }
- else if(fuhao==2){write_com(0x80+0x4f);//光標(biāo)前進(jìn)至第二行最后一個(gè)顯示處
- write_com(0x04); //設(shè)置從后住前寫(xiě)數(shù)據(jù),每寫(xiě)完一個(gè)數(shù)據(jù),光標(biāo)后退一格(這個(gè)照理說(shuō)順序不對(duì),可顯示和上段一樣)
- if(a-b>0)
- c=a-b;
- else
- c=b-a;
- while(c!=0)
- {
- write_date(0x30+c%10);
- c=c/10;
- }
- if(a-b<0)
- write_date(0x2d);
- write_date(0x3d); //再寫(xiě)"="
- a=0;b=0;flag=0;fuhao=0;
- }
- else if(fuhao==3){write_com(0x80+0x4f);
- write_com(0x04);
- c=a*b;
- while(c!=0)
- {
- write_date(0x30+c%10);
- c=c/10;
- }
- write_date(0x3d);
- a=0;b=0;flag=0;fuhao=0;
- }
- else if(fuhao==4){write_com(0x80+0x4f);
- write_com(0x04);
- i=0;
- c=(long)(((float)a/b)*1000);
- while(c!=0)
- {
- write_date(0x30+c%10);
- c=c/10;
- i++;
- if(i==3)
- write_date(0x2e);
- }
- if(a/b<=0)
- write_date(0x30);
- write_date(0x3d);
- a=0;b=0;flag=0;fuhao=0;
- }
- }
- break;
- case 15:{write_date(0x30+table1[num]);flag=1;fuhao=1;}
- break;
- }
- }
- }
-
- main()
- {
- init();
- while(1)
- {
- keyscan();
- }
- }
-
復(fù)制代碼
|