找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 30836|回復(fù): 14
收起左側(cè)

基于51單片機(jī)計(jì)算器設(shè)計(jì)文檔

  [復(fù)制鏈接]
ID:3721 發(fā)表于 2016-6-12 23:46 | 顯示全部樓層 |閱讀模式
電氣工程項(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é)果或用戶定義的字型表。            
1.001.jpg
圖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。
1.002.jpg

圖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
1.003.jpg                                              
圖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í)鐘方式:
1.004.jpg 1.005.jpg

·Pin30:ALE/ 1.006.jpg 當(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: 1.007.jpg 當(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。
1.008.jpg
                                  4-3系統(tǒng)總框圖:
4.4程序源代碼
1.009.jpg
                                            圖4-4 程序輸入導(dǎo)出hex文件


4.5硬件連線圖
1.010.jpg
心得
設(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)閱人:
   年   月   日


  1. #include   //頭文件
  2. #define uint unsigned int //
  3. #define uchar unsigned char

  4. sbit lcden=P2^3; //定義引腳
  5. sbit rs=P2^4;
  6. sbit rw=P2^0;
  7. sbit busy=P0^7;

  8. char i,j,temp,num,num_1;
  9. long a,b,c;     //a,第一個(gè)數(shù) b,第二個(gè)數(shù) c,得數(shù)
  10. float a_c,b_c;
  11. uchar flag,fuhao;//flag表示是否有符號(hào)鍵按下,fuhao表征按下的是哪個(gè)符號(hào)

  12. uchar code table[]={
  13. 7,8,9,0,
  14. 4,5,6,0,
  15. 1,2,3,0,
  16. 0,0,0,0};
  17. uchar code table1[]={
  18. 7,8,9,0x2f-0x30,
  19. 4,5,6,0x2a-0x30,
  20. 1,2,3,0x2d-0x30,
  21. 0x01-0x30,0,0x3d-0x30,0x2b-0x30};

  22. void delay(uchar z) // 延遲函數(shù)
  23. {
  24. uchar y;
  25. for(z;z>0;z--)
  26.    for(y=0;y<110;y++);
  27. }

  28. void check() // 判斷忙或空閑
  29. {
  30. do{
  31.     P0=0xFF;
  32.     rs=0;     //指令
  33.     rw=1;     //讀
  34.     lcden=0;     //禁止讀寫(xiě)
  35.     delay(1); //等待,液晶顯示器處理數(shù)據(jù)
  36.     lcden=1;     //允許讀寫(xiě)
  37.     }while(busy==1); //判斷是否為空閑,1為忙,0為空閑
  38. }
  39. void write_com(uchar com) // 寫(xiě)指令函數(shù)
  40. {
  41. P0=com;    //com指令付給P0口
  42. rs=0;
  43. rw=0;
  44. lcden=0;
  45. check();
  46. lcden=1;
  47. }

  48. void write_date(uchar date) // 寫(xiě)數(shù)據(jù)函數(shù)
  49. {
  50.     P0=date;
  51. rs=1;
  52. rw=0;
  53. lcden=0;
  54. check();
  55. lcden=1;
  56. }

  57. void init() //初始化
  58. {
  59.     num=-1;
  60. lcden=1; //使能信號(hào)為高電平
  61. write_com(0x38); //8位,2行
  62. write_com(0x0c); //顯示開(kāi),光標(biāo)關(guān),不閃爍*/
  63. write_com(0x06); //增量方式不移位 顯竟獗暌貧 柚?
  64. write_com(0x80); //檢測(cè)忙信號(hào)
  65. write_com(0x01); //顯示開(kāi),光標(biāo)關(guān),不閃爍
  66. num_1=0;
  67. i=0;
  68. j=0;
  69. a=0;     //第一個(gè)參與運(yùn)算的數(shù)
  70. b=0;     //第二個(gè)參與運(yùn)算的數(shù)
  71. c=0;
  72. flag=0; //flag表示是否有符號(hào)鍵按下,
  73. fuhao=0; // fuhao表征按下的是哪個(gè)符號(hào)
  74. }
  75. void keyscan() // 鍵盤(pán)掃描程序
  76. {

  77. P3=0xfe;
  78. if(P3!=0xfe)
  79. {
  80.    delay(20); 延遲20ms
  81.    if(P3!=0xfe)
  82.    {
  83.     temp=P3&0xf0;
  84.     switch(temp)
  85.     {
  86.      case 0xe0:num=0;
  87.        break;
  88.      case 0xd0:num=1;
  89.        break;
  90.      case 0xb0:num=2;
  91.        break;
  92.      case 0x70:num=3;
  93.        break;
  94.     }
  95.    }
  96.    while(P3!=0xfe);
  97.    if(num==0||num==1||num==2)//如果按下的是'7','8'或'9
  98.    {
  99.        if(j!=0)
  100.         {
  101.           write_com(0x01);
  102.           j=0;
  103.          }
  104.        if(flag==0)//沒(méi)有按過(guò)符號(hào)鍵
  105.     {
  106.      a=a*10+table[num];
  107.     }
  108.     else//如果按過(guò)符號(hào)鍵
  109.     {
  110.      b=b*10+table[num];
  111.     }
  112.    }
  113.    else//如果按下的是'/'
  114.    {
  115.     flag=1;
  116.     fuhao=4;//4表示除號(hào)已按
  117.    }
  118.    i=table1[num];
  119.    write_date(0x30+i);
  120. }

  121. P3=0xfd;
  122. if(P3!=0xfd)
  123. {
  124.    delay(5);
  125.    if(P3!=0xfd)
  126.    {
  127.     temp=P3&0xf0;
  128.     switch(temp)
  129.     {
  130.      case 0xe0:num=4;
  131.          break;
  132.       
  133.      case 0xd0:num=5;
  134.          break;
  135.       
  136.      case 0xb0:num=6;
  137.          break;
  138.       
  139.      case 0x70:num=7;
  140.          break;
  141.     }
  142.    }
  143.    while(P3!=0xfd);
  144.    if(num==4||num==5||num==6&&num!=7)//如果按下的是'4','5'或'6'
  145.    {
  146.     if(j!=0)
  147.         {
  148.           write_com(0x01);
  149.           j=0;
  150.          }
  151.        if(flag==0)//沒(méi)有按過(guò)符號(hào)鍵
  152.     {
  153.      a=a*10+table[num];
  154.     }
  155.     else//如果按過(guò)符號(hào)鍵
  156.     {
  157.      b=b*10+table[num];
  158.     }
  159.    }
  160.    else//如果按下的是'/'
  161.    {
  162.     flag=1;
  163.     fuhao=3;//3表示乘號(hào)已按
  164.    }
  165.    i=table1[num];
  166.    write_date(0x30+i);
  167. }

  168. P3=0xfb;
  169. if(P3!=0xfb)
  170. {
  171.    delay(5);
  172.    if(P3!=0xfb)
  173.    {
  174.     temp=P3&0xf0;
  175.     switch(temp)
  176.     {
  177.      case 0xe0:num=8;
  178.          break;
  179.       
  180.      case 0xd0:num=9;
  181.          break;
  182.       
  183.      case 0xb0:num=10;
  184.          break;
  185.       
  186.      case 0x70:num=11;
  187.          break;
  188.     }
  189.    }
  190.    while(P3!=0xfb);
  191.    if(num==8||num==9||num==10)//如果按下的是'1','2'或'3'
  192.    {
  193.     if(j!=0)
  194.         {
  195.           write_com(0x01);
  196.           j=0;
  197.          }
  198.       if(flag==0)//沒(méi)有按過(guò)符號(hào)鍵
  199.     {
  200.      a=a*10+table[num];
  201.     }
  202.     else//如果按過(guò)符號(hào)鍵
  203.     {
  204.      b=b*10+table[num];
  205.     }
  206.    }
  207.    else if(num==11)//如果按下的是'-'
  208.    {
  209.     flag=1;
  210.     fuhao=2;//2表示減號(hào)已按
  211.    }
  212.    i=table1[num];
  213.    write_date(0x30+i);
  214. }

  215. P3=0xf7;
  216. if(P3!=0xf7)
  217. {
  218.    delay(5);
  219.    if(P3!=0xf7)
  220.    {
  221.     temp=P3&0xf0;
  222.     switch(temp)
  223.     {
  224.      case 0xe0:num=12;
  225.          break;
  226.       
  227.      case 0xd0:num=13;
  228.          break;
  229.       
  230.      case 0xb0:num=14;
  231.          break;
  232.       
  233.      case 0x70:num=15;
  234.          break;
  235.     }
  236.    }
  237.    while(P3!=0xf7);
  238.    switch(num)
  239.    {
  240.     case 12:{write_com(0x01);a=0;b=0;flag=0;fuhao=0;}//按下的是"清零"
  241.      break;
  242.     case 13:{                //按下的是"0"
  243.        if(flag==0)//沒(méi)有按過(guò)符號(hào)鍵
  244.        {
  245.         a=a*10;
  246.         write_date(0x30);
  247.         P1=0;
  248.        }
  249.        else if(flag==1)//如果按過(guò)符號(hào)鍵
  250.        {
  251.         b=b*10;
  252.         write_date(0x30);
  253.         }
  254.       }
  255.      break;
  256.     case 14:{j=1;
  257.            if(fuhao==1){write_com(0x80+0x4f);//按下等于鍵,光標(biāo)前進(jìn)至第二行最后一個(gè)顯示處
  258.            write_com(0x04);     //設(shè)置從后住前寫(xiě)數(shù)據(jù),每寫(xiě)完一個(gè)數(shù)據(jù),光標(biāo)后退一格
  259.            c=a+b;
  260.            while(c!=0)
  261.            {
  262.              write_date(0x30+c%10);
  263.              c=c/10;
  264.            }
  265.            write_date(0x3d);     //再寫(xiě)"="
  266.            a=0;b=0;flag=0;fuhao=0;
  267.            }
  268.       else if(fuhao==2){write_com(0x80+0x4f);//光標(biāo)前進(jìn)至第二行最后一個(gè)顯示處
  269.             write_com(0x04);     //設(shè)置從后住前寫(xiě)數(shù)據(jù),每寫(xiě)完一個(gè)數(shù)據(jù),光標(biāo)后退一格(這個(gè)照理說(shuō)順序不對(duì),可顯示和上段一樣)
  270.            if(a-b>0)
  271.              c=a-b;
  272.            else
  273.              c=b-a;
  274.            while(c!=0)
  275.            {
  276.              write_date(0x30+c%10);
  277.              c=c/10;
  278.            }
  279.            if(a-b<0)
  280.              write_date(0x2d);
  281.            write_date(0x3d);     //再寫(xiě)"="           
  282.            a=0;b=0;flag=0;fuhao=0;
  283.           }
  284.       else if(fuhao==3){write_com(0x80+0x4f);
  285.             write_com(0x04);
  286.              c=a*b;
  287.              while(c!=0)
  288.              {
  289.              write_date(0x30+c%10);
  290.              c=c/10;
  291.              }
  292.              write_date(0x3d);     
  293.           a=0;b=0;flag=0;fuhao=0;
  294.              }
  295.       else if(fuhao==4){write_com(0x80+0x4f);
  296.             write_com(0x04);
  297.             i=0;
  298.             c=(long)(((float)a/b)*1000);
  299.             while(c!=0)
  300.              {
  301.                write_date(0x30+c%10);
  302.                c=c/10;
  303.            i++;
  304.            if(i==3)
  305.                write_date(0x2e);
  306.              }
  307.             if(a/b<=0)
  308.               write_date(0x30);
  309.             write_date(0x3d);                              
  310.             a=0;b=0;flag=0;fuhao=0;
  311.                     }
  312.       }
  313.      break;
  314.      case 15:{write_date(0x30+table1[num]);flag=1;fuhao=1;}
  315.      break;
  316.    }
  317. }
  318. }

  319. main()
  320. {
  321. init();
  322. while(1)
  323. {
  324.    keyscan();
  325. }
  326. }
復(fù)制代碼

word格式下載: 基于51單片機(jī)計(jì)算器設(shè)計(jì).docx (191.92 KB, 下載次數(shù): 117)

相關(guān)帖子

回復(fù)

使用道具 舉報(bào)

ID:126449 發(fā)表于 2016-6-13 00:48 來(lái)自觸屏版 | 顯示全部樓層
好棒,頂一個(gè)
回復(fù)

使用道具 舉報(bào)

ID:126696 發(fā)表于 2016-6-14 16:20 來(lái)自觸屏版 | 顯示全部樓層
真是大好人啊 論文都給了
回復(fù)

使用道具 舉報(bào)

ID:128087 發(fā)表于 2016-6-25 15:25 來(lái)自觸屏版 | 顯示全部樓層
感謝樓主 !!
回復(fù)

使用道具 舉報(bào)

ID:145691 發(fā)表于 2016-11-2 13:59 | 顯示全部樓層
能不能進(jìn)行負(fù)數(shù)計(jì)算
回復(fù)

使用道具 舉報(bào)

ID:145691 發(fā)表于 2016-11-2 14:27 | 顯示全部樓層
程序?yàn)樯稌?huì)出錯(cuò)呢
回復(fù)

使用道具 舉報(bào)

ID:200060 發(fā)表于 2017-6-7 22:22 | 顯示全部樓層
為什么我的電路圖出不來(lái)
回復(fù)

使用道具 舉報(bào)

ID:219259 發(fā)表于 2017-7-12 23:02 | 顯示全部樓層
led不顯示怎么辦啊
回復(fù)

使用道具 舉報(bào)

ID:219418 發(fā)表于 2017-7-13 22:28 | 顯示全部樓層
棒棒棒,頂頂頂
回復(fù)

使用道具 舉報(bào)

ID:244546 發(fā)表于 2017-11-1 11:24 | 顯示全部樓層
仿真用的數(shù)碼管 怎么看源碼用的液晶
回復(fù)

使用道具 舉報(bào)

ID:247636 發(fā)表于 2017-11-10 09:24 來(lái)自觸屏版 | 顯示全部樓層
謝謝樓主分享
回復(fù)

使用道具 舉報(bào)

ID:361498 發(fā)表于 2018-6-29 10:26 | 顯示全部樓層
為什么顯示不出來(lái)
回復(fù)

使用道具 舉報(bào)

ID:777318 發(fā)表于 2020-6-12 16:10 | 顯示全部樓層
明天你好LJN 發(fā)表于 2017-6-7 22:22
**** 作者被禁止或刪除 內(nèi)容自動(dòng)屏蔽 ****

我的P0也是灰色的
回復(fù)

使用道具 舉報(bào)

ID:777318 發(fā)表于 2020-6-12 16:49 | 顯示全部樓層
這個(gè)P0是懸空的啊,怎么亮起來(lái)的啊?
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表