版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、摘要本設(shè)計(jì)是一個實(shí)現(xiàn)加、減、乘、除的計(jì)算器,它的硬件主要由四部分組成,一個at89c51單片機(jī)芯片,一個八位共陽極的數(shù)碼管,一個4*4的鍵盤,一個排阻(10k)做p0口的上拉電阻(接線圖在附錄2),它可以實(shí)現(xiàn)結(jié)果低于65535的加、減、乘、除運(yùn)算。顯示部分:采用動態(tài)顯示,由八位共陽極數(shù)碼管通過p0口,p2口與單片機(jī)相連,數(shù)碼管的a,b,c,d,e,f,g,dp分別依次與單片機(jī)的p0.0p0.7相連,p0口做為單片機(jī)的字碼控制端,數(shù)碼管的1,2,3,4,5,6,7,8各引腳分別與單片機(jī)的p2.0p2.7相連,p2口作為數(shù)碼管的位控制端。按鍵部分:采用4*4鍵盤。采用軟件識別鍵值并執(zhí)行相應(yīng)的操作,
2、鍵盤的第0行到第3行依次與單片機(jī)的p3.4p3.7管腳相連,鍵盤的第0列到第3列依次與單片機(jī)的p1.0p1.3管腳相連,程序運(yùn)行時依次掃描各行,查詢是否有鍵按下,如果有則進(jìn)入鍵盤識別處理程序,實(shí)現(xiàn)相應(yīng)的運(yùn)算,然后通過數(shù)碼管輸出結(jié)果,如果沒有按鍵就調(diào)用顯示程序顯示一個0,等待按鍵按下,在進(jìn)入按鍵掃描程序。 執(zhí)行過程:開機(jī)即顯示0,等待鍵入數(shù)值,當(dāng)鍵入數(shù)字,將通過數(shù)碼管顯示出來,在鍵入、-、*、/運(yùn)算符,計(jì)算器在內(nèi)部執(zhí)行數(shù)值轉(zhuǎn)換和存儲,并等待再次鍵入數(shù)值,當(dāng)在鍵入數(shù)值后將顯示鍵入的數(shù)值,按等號就會在數(shù)碼管上輸出運(yùn)算結(jié)果。注:結(jié)果不能超出65535。(具體操作見后面仿真圖)目錄1 概述 1.1mcs
3、-51單片機(jī)在自動化儀表中的作用31.2掌握單片機(jī)仿真軟件proteus的使用方法31.3設(shè)計(jì)方法31.4基本功能42 系統(tǒng)總體方案及硬件設(shè)計(jì) 2.1計(jì)算器總體思想52.2硬件的選擇與連接63 軟件設(shè)計(jì) 3.1顯示程序設(shè)計(jì)7 3.2鍵盤識別程序設(shè)計(jì)8 3.3運(yùn)算程序設(shè)計(jì)10 3.4風(fēng)鳴器程序設(shè)計(jì)104 proteus軟件仿真 125課程設(shè)計(jì)體會 16參考文獻(xiàn) 18附1:源程序代碼 19附2:計(jì)算器模擬系統(tǒng)電路圖 311 概述1.1mcs-51單片機(jī)在自動化儀表中的作用單片機(jī)體積小,功耗小,價格低,用途靈活,無處不在,屬專用計(jì)算機(jī)。是一種特殊器件,需經(jīng)過專門學(xué)習(xí)方能掌握應(yīng)用,應(yīng)用中要設(shè)計(jì)專用的硬
4、件和軟件。近年來,單片機(jī)以其體積小、價格廉、面向控制等獨(dú)特優(yōu)點(diǎn),在各種工業(yè)控制、儀器儀表、設(shè)備、產(chǎn)品的自動化、智能化方面獲得了廣泛的應(yīng)用。與此同時,單片機(jī)應(yīng)用系統(tǒng)的可靠性成為人們越來越關(guān)注的重要課題。影響可靠性的因素是多方面的,如構(gòu)成系統(tǒng)的元器件本身的可靠性、系統(tǒng)本身各部分之間的相互耦合因素等。其中系統(tǒng)的抗干擾性能是系統(tǒng)可靠性的重要指標(biāo)。1.2 掌握單片機(jī)仿真軟件proteus的使用方法 proteus 軟件具有強(qiáng)大的多窗口、多文件的編輯器、微控制器的集成開發(fā)環(huán)境、一系列的集成開發(fā)工具、圖形界面調(diào)試器、混合模式的模擬及數(shù)字電路仿真器、代碼質(zhì)量檢查器等。硬件和應(yīng)用軟件能進(jìn)行并發(fā)仿真。最主要的一點(diǎn)
5、是它能以單片機(jī)為核心仿真出包括模擬元器件在內(nèi)的一些動態(tài)外設(shè)(按鍵,led ,液晶顯示器等) ,具有圖形顯示和波形顯示的功能。因此,proteus 不僅僅是一個微處理器的仿真軟件,它所支持的大量常用芯片模型為單片機(jī)和其他芯片協(xié)同仿真復(fù)雜的完整系統(tǒng)提供了極大的方便。proteus 在完整的系統(tǒng)仿真方面是其他單片機(jī)仿真軟件所不能獨(dú)立完成的。這時,proteus 為我們提供的不僅僅是一個單片機(jī)的仿真環(huán)境,稱其為一個虛擬的單片機(jī)實(shí)驗(yàn)室是完全合適的,只要我們能充分的利用proteus提供的實(shí)驗(yàn)器件就可以完成一個具有相當(dāng)集成性的單片機(jī)系統(tǒng)。1.3設(shè)計(jì)方法本設(shè)計(jì)是一個實(shí)現(xiàn)加、減、乘、除的計(jì)算器,它的硬件主要由
6、四部分組成,一個at89c51單片機(jī)芯片,一個八位共陽極的數(shù)碼管,一個四乘四的鍵盤,一個排阻做p0口的上拉電阻(接線圖在附錄2),它可以實(shí)現(xiàn)結(jié)果低于65535的加、減、乘、除運(yùn)算。采用動態(tài)顯示,由八位共陽極數(shù)碼管通過p0口,p2口與單片機(jī)相連,數(shù)碼管的a,b,c,d,e,f,g,dp分別依次與單片機(jī)的p0.0p0.7相連,p0口做為字碼控制端,數(shù)碼管的1,2,3,4,5,6,7,8各引腳分別與單片機(jī)的p2.0p2.7相連,p2口做為數(shù)碼管的位控制端,動態(tài)顯示是每次數(shù)碼管只顯示一位,由于人的視覺停留是0.05到0.2秒之間,當(dāng)數(shù)碼管依次點(diǎn)亮各個位時,使循環(huán)的頻率高于人的視覺停留時間,人們就會認(rèn)為
7、數(shù)碼管是同時點(diǎn)亮的,就可以達(dá)到動態(tài)顯示的效果。采用4*4鍵盤。采用軟件識別鍵值并執(zhí)行相應(yīng)的操作,鍵盤的第0行到第3行依次與單片機(jī)的p3.4p3.7管腳相連,鍵盤的第0列到第3列依次與單片機(jī)的p1.0p1.3管腳相連,程序運(yùn)行時依次掃描各行,查詢是否有鍵按下,如果有則進(jìn)入鍵盤識別處理程序,實(shí)現(xiàn)相應(yīng)的運(yùn)算,然后通過數(shù)碼管輸出結(jié)果,如果沒有按鍵就調(diào)用顯示程序顯示一個0,等待按鍵按下,在進(jìn)入按鍵掃描程序。這樣循環(huán)執(zhí)行。1.4基本功能1.計(jì)算器可顯示8位數(shù)字,開機(jī)運(yùn)行時,只有數(shù)碼管最低位顯示為“0”,其余位全部不顯示;2.第一次按下時,顯示“d1”;第二次按下時,顯示“d1d2”;第三次按下時,顯示“d
8、1d2d3”,8個全顯示完畢,再按下按鍵下時,給出“嘀”提示音,并且輸入的第九個數(shù)不接收,仍然顯示原來的八位數(shù);3.可以對計(jì)算結(jié)果小于65535的兩個無符號數(shù)進(jìn)行、-、*、/運(yùn)算,并顯示計(jì)算結(jié)果,如果輸入的預(yù)計(jì)算的數(shù)超過65535,則運(yùn)算時報(bào)錯,顯示“error”,如果結(jié)果超過65535仍然報(bào)錯,顯示“error”,以提示使用者輸入錯誤,應(yīng)清零后在從新輸入。4.運(yùn)算時,如果輸入錯了可按清零鍵清零,重新輸入數(shù)據(jù),運(yùn)算過程中,如果運(yùn)算的表達(dá)式是加、減、乘、除混合運(yùn)算,可以連續(xù)運(yùn)算,不需按等號鍵,運(yùn)算規(guī)則是從左到右,不區(qū)分運(yùn)算等級,即、-、*、/認(rèn)為是同級別的運(yùn)算。2 系統(tǒng)總體方案及硬件設(shè)計(jì) 2.1
9、計(jì)算器總體思想 很高興做這個課程設(shè)計(jì),因?yàn)閷W(xué)了半學(xué)期的單片機(jī)終于可以練練手了,我特別喜歡單片機(jī),特喜歡編程,一直很向往編程,這是我編的第一個程序,我想這將是我編程生涯的開始,在編這個程序時,遇到了很多麻煩,我沒有氣餒過,因?yàn)槲覍ψ约河行判模K于如愿完成了課程設(shè)計(jì)。 總結(jié)自己的編程思想是這樣的,首先得設(shè)計(jì)一個顯示程序,這個顯示程序應(yīng)是動態(tài)顯示,思路有兩個:(1)讓p2口做位掃描,p0口做段碼輸出,在調(diào)用顯示程序時,p2口循環(huán)選通數(shù)碼管每一位的,p0口也依次循環(huán)輸出相對應(yīng)位的代碼。如何控制數(shù)字顯示呢?可先將09、熄滅,11個段碼放入列表中,在設(shè)置八個顯示緩沖區(qū),數(shù)碼管要顯示的數(shù)字就存放在這八個單元
10、中,通過控制八個緩沖區(qū)的內(nèi)容來控制輸出的數(shù)字。如:要顯示的是1234則將緩沖區(qū)從低位開始依次放入04h、03h、02h、01h剩余四位放入11h(代表數(shù)碼管熄滅的代碼),要注意的是,當(dāng)調(diào)用顯示程序時,通過程序根據(jù)八個數(shù)碼管緩沖區(qū)的數(shù)字調(diào)用相對應(yīng)的代碼就可以循環(huán)輸出,但是我們看到的是同時顯示1234,因?yàn)橐曈X停留的原故。當(dāng)它的循環(huán)頻率大于人的視覺停留時間,人們就認(rèn)為它是同時顯示的。雖然八個數(shù)碼管都輸出了,但是高四位送的代碼是熄滅,即不顯示,當(dāng)不輸入數(shù)字時使八個緩沖區(qū)初始化為,第一位放00h,其余放11h,就可以只顯示0,等待輸入數(shù)據(jù),這樣就控制了顯示位數(shù)實(shí)現(xiàn)了動態(tài)顯示。(2)讓p2口做位掃描,p
11、0口做段碼輸出,設(shè)置一個單元用來記錄輸入數(shù)字的位數(shù),這樣可以不用循環(huán)掃描每一位,而是根據(jù)輸出位數(shù)判斷掃描哪些位。如上面的例子,當(dāng)顯示1234時,不用在向高四位送入11h,也不需要熄滅的代碼了。調(diào)用顯示程序時先選通第一位(最低位),送出代碼1,然后判斷是否顯示完畢,(通過記錄數(shù)字個數(shù)單元的內(nèi)容減一是否得0來判斷),如沒顯示完則顯示下一位,如顯示完則跳出。在本設(shè)計(jì)中選用后者。其次是設(shè)計(jì)鍵盤掃描程序,這里采用4*4矩陣鍵盤,通過軟件識別,行和列可接在同個端口上,也可接在不同端口上,本設(shè)計(jì)行接在p3口的高四位,列接在p1口的低四位,通過循環(huán)掃描行,讀取列的數(shù)據(jù)判斷是否有鍵按下,如果有則調(diào)用按鍵識別程序
12、識別是哪個鍵,執(zhí)行相應(yīng)的操作,按鍵識別是根據(jù)按鍵時得到的列代碼與行代碼組合,來判斷是哪個鍵的。按鍵識別后,如果是數(shù)字鍵則直接放入數(shù)碼管顯示緩沖區(qū),如果再次有數(shù)字鍵按下,則應(yīng)將緩存區(qū)的數(shù)字向高位移一位,將剛輸入的數(shù)放入最低位,并且記錄按鍵次數(shù),每輸入一個鍵值都調(diào)用顯示程序顯示出來,如果是運(yùn)算符,則執(zhí)行相應(yīng)的運(yùn)算,然后在調(diào)用顯示程序顯示結(jié)果。最后是運(yùn)算程序的加入,運(yùn)算程序很簡單,只要把、-、*、/分別做成模塊,用到時即可調(diào)用,本設(shè)計(jì)的難點(diǎn)是鍵盤識別和數(shù)值顯示,因?yàn)檫@里邊涉及到鍵盤輸入的數(shù)值在內(nèi)部要轉(zhuǎn)換成10進(jìn)制運(yùn)算,運(yùn)算結(jié)果要轉(zhuǎn)換成各個位的顯示數(shù)字輸出。2.2硬件的選擇與連接單片機(jī)選擇at89c5
13、1,數(shù)碼管選擇共陽機(jī)八位數(shù)碼管,鍵盤4*4矩陣鍵盤,p0口接上拉電阻,數(shù)碼管的a,b,c,d,e,f,g,dp分別依次與單片機(jī)的p0.0p0.7管腳相連,p0口做為單片機(jī)的字碼控制端,數(shù)碼管的1,2,3,4,5,6,7,8各引腳分別與單片機(jī)的p2.0p2.7管腳相連,鍵盤的第0行到第3行依次與單片機(jī)的p3.4p3.7,鍵盤的第0列到第3列依次與單片機(jī)的p1.0p1.3,at89c51接12mhz晶振。p3.0接風(fēng)鳴器。3 軟件設(shè)計(jì) 3.1顯示程序設(shè)計(jì)顯示程序流程圖如圖1。我的顯示程序是這樣設(shè)計(jì)的,因?yàn)榭紤]到顯示程應(yīng)具有通用性,在不進(jìn)行輸入時顯示0,輸入時顯示輸入的數(shù)字或運(yùn)算結(jié)果,而且要使8個數(shù)
14、碼管同時顯示不同的數(shù)字,選用動態(tài)顯示應(yīng)是最佳的。將30h-37h單元設(shè)置成數(shù)碼管顯示緩沖區(qū),分別存放數(shù)碼管各個位要顯示的數(shù)據(jù),40h單元作為輸入數(shù)據(jù)的計(jì)數(shù)單元。因?yàn)檫\(yùn)算結(jié)果超出范圍時應(yīng)報(bào)錯,使數(shù)碼管顯示“error”即可,將數(shù)碼管的09的代碼和“error”代碼存于lable1列表中。當(dāng)調(diào)用顯示程序時,顯示程序根據(jù)40h單元的記錄的個數(shù)決定數(shù)碼管顯示的位數(shù)。如果輸入錯誤將在數(shù)碼管上顯示“error”。這樣就得到了顯示程序的入口:30h-37h,依次存放個位千萬位。 40h,存放輸出的數(shù)字位數(shù)。 出口:數(shù)碼管,p0輸出字段碼 p2輸出位選碼。 數(shù)碼管顯示判斷顯示是否完畢 返回否是初始化r0緩沖區(qū)
15、指針,r1位控制,r5循環(huán)控制次數(shù)r0=30h,r1=#80h,r5=40h開始 圖1數(shù)碼管顯示流程圖3.2鍵盤識別程序設(shè)計(jì):鍵盤識別是這樣設(shè)計(jì)的,首先將p3口送0eoh,將p1口先送1在讀p1口的數(shù)據(jù)當(dāng)p1口低四位全一時說明沒有鍵按下,在掃描下一行,如果p1口不全一,則有鍵按下,將p3口高四位與p1口低四位組合成一個字節(jié),放入r5寄存器中,按鍵去抖,判鍵是否松開,如松開則將得到的鍵值判別是哪個鍵,如果是數(shù)字鍵則首先將其對應(yīng)的數(shù)字(按鍵代碼對應(yīng)如下表)放入緩沖區(qū)30h,同時將將鍵值放入結(jié)果緩沖區(qū),并調(diào)用顯示程序,顯示鍵值,在調(diào)用掃描鍵盤程序,如果在有鍵值輸入則將原來的數(shù)值在數(shù)碼管顯示緩沖區(qū)向高
16、位依次移一位,將剛鍵入的數(shù)值放入最低位,并將原來的數(shù)值乘十加上剛鍵入的數(shù)放人結(jié)果緩沖區(qū),然后調(diào)用顯示程序,如果是運(yùn)算符,則記錄運(yùn)算符標(biāo)志,加法用01h表示,減法用02h表示,乘法用03h表示,除法用04h表示,并將結(jié)果緩沖區(qū)的數(shù)轉(zhuǎn)移到中間結(jié)果緩沖區(qū),將結(jié)果緩沖區(qū)清零,等待輸入運(yùn)算數(shù)據(jù),當(dāng)按等號時,根據(jù)記錄的運(yùn)算符標(biāo)志,判斷是那種運(yùn)算,執(zhí)行運(yùn)算將結(jié)果依次除10取余數(shù)放入結(jié)果顯示緩沖區(qū),調(diào)用顯示程序。依次循環(huán)執(zhí)行。(流程圖如下)鍵碼 鍵值鍵碼 鍵值ee7be1 ed8bd2 eb9bb3 e7/b7- de47ecl dd57d0 db67b= d7*77+ 開始掃描第一行是否有鍵按下y判斷鍵值n
17、掃描第二行數(shù)字鍵放入顯示緩沖區(qū)運(yùn)算符修改標(biāo)志位調(diào)用顯示程序顯示數(shù)字進(jìn)行運(yùn)算運(yùn)算結(jié)果放入顯示緩沖區(qū)是否有鍵按下n掃描第三行是否有鍵按下n掃描第四行是否有鍵按下n 圖2 鍵盤掃描流程圖3.3運(yùn)算程序設(shè)計(jì)運(yùn)算程序分四個模塊,即加減乘除。分別采用兩字節(jié)運(yùn)算,因此運(yùn)算結(jié)果不能超出兩字節(jié),否則會溢出。溢出時顯示error。加法程序:入口:r0被加數(shù)低位字節(jié)地址指針,r1加數(shù)低位字節(jié)地址指針,r3字節(jié)數(shù)。出口:r0和值地位字節(jié)地址指針,r3和值字節(jié)數(shù)。運(yùn)算時用r0,r1間接尋址,從低字節(jié)算起,高字節(jié)采用帶進(jìn)位加(addc),計(jì)算結(jié)果回送到r0所指的單元中,并將和字節(jié)數(shù)放入r3單元中,如果r3大于等于3說明溢
18、出。減法同加法類似,入口:r0被減數(shù)低位字節(jié)地址指針,r1減數(shù)低位字節(jié)地址指針,r3字節(jié)數(shù)。出口:r0和值地位字節(jié)地址指針,r3和值字節(jié)數(shù)。只是判斷溢出是通過cy位,如果運(yùn)算后cy位有借位,則將07h位置1,否則置0。乘法程序:入口:r3,被乘數(shù)低位地址字節(jié),r2,被乘數(shù)高位地址字節(jié),r7,乘數(shù)低位地址字節(jié),r6,乘數(shù)高位地址字節(jié)。出口:r4,r5,r6,r7結(jié)果字節(jié)由高到低。通過判斷r5是否為零就可以知道運(yùn)算結(jié)果是否溢出,如果溢出調(diào)用溢出程序。 除法程序:入口:被除數(shù)放在r4r5r6r7,r4r5,內(nèi)容為零,r4高r5低,除數(shù)放在r2r3,r2高r3低。出口:商放在r6r7,r6高r7低,余
19、數(shù)放在r4r5,r4高r5低 。3.4風(fēng)鳴器程序設(shè)計(jì) 這個程序是實(shí)現(xiàn)當(dāng)輸入八個數(shù)字時,如果在輸入數(shù)字它便鳴叫,提示使用者輸入以滿,不允許在鍵入值,只需在鍵盤程序中,加入判別輸入是否超過八個如果超過則調(diào)用風(fēng)鳴器程序,使p3.0由低電平轉(zhuǎn)入高電平,延遲1ms返回。輸入等號將運(yùn)算結(jié)果放入緩沖區(qū)并調(diào)用顯示程序顯示結(jié)果開始得到鍵值判斷是否是第一個數(shù)y將數(shù)值直接轉(zhuǎn)移到結(jié)果緩沖區(qū),38h單元開始的四個單元里n數(shù)否按過運(yùn)算符將上次的數(shù)值乘10加上本次輸入放入結(jié)果緩沖區(qū)(38h單元開始)ny判斷是是哪種運(yùn)算符標(biāo)志位記錄運(yùn)算種類如:加法 41h=#01h減法 41h=#02h乘法 41h=#03h除法 41h=#
20、04h將第一次鍵入的數(shù)(在38h起始的單元)轉(zhuǎn)移到中間結(jié)果緩沖區(qū)自3ch開始的單元是否鍵入第二次數(shù)值ny等待鍵入數(shù)值將數(shù)值放入結(jié)果緩沖區(qū)38h其實(shí)單元里 圖3運(yùn)算程序流程圖4 proteus軟件仿真1運(yùn)行顯示0,等待鍵入數(shù)值。2鍵入被加數(shù)1000,顯示1000。鍵入“+”顯示原來鍵入的數(shù)值,等待鍵入加數(shù)。鍵入加數(shù)5000,顯示5000。鍵入“”顯示結(jié)果,6000。3鍵入清零鍵“cl”。4鍵入被減數(shù)4000,顯示4000。鍵入“”顯示上次鍵入的值,等待鍵入減數(shù)鍵入減數(shù)2000,顯示錄2000。鍵入等號“”顯示結(jié)果2000。5清零后鍵入被乘數(shù)5000,顯示5000。鍵入乘號“*”,顯示上一次鍵入的
21、數(shù),等待鍵入乘數(shù),鍵入乘數(shù)“2”顯示2。鍵入等號“”顯示結(jié)果10000。6清零后鍵入被除數(shù)3000,顯示3000。鍵入除號“/”顯示上次鍵入的數(shù),等待鍵入除數(shù),鍵入除數(shù)50,顯示50。鍵入等號“”顯示結(jié)果60。7當(dāng)運(yùn)算的數(shù)值超出范圍時將出現(xiàn)的信息。如:輸入70000,后在按“+”時顯示eeror因?yàn)?000065535所以報(bào)錯,顯示:“error”。5課程設(shè)計(jì)體會課程設(shè)計(jì)終于作完了,我足足花了一周時間,做這次課程設(shè)計(jì),我很疲憊,但我確很高興因?yàn)橥ㄟ^這次用單片機(jī)實(shí)現(xiàn)計(jì)算器的課程設(shè)計(jì),加深了我對單片機(jī)這門課程的了解。學(xué)以致用,不僅讓我回顧了過去的所學(xué),更使我了解了我現(xiàn)在的不足,彌補(bǔ)了不為我知的知識
22、漏洞。更重要的是在實(shí)踐中我們可以形成更加科學(xué)和理智的認(rèn)知,不斷形成更為合理和具有科學(xué)性的思想方式。在這次設(shè)計(jì)的過程中,我借助了互聯(lián)網(wǎng)等途徑查詢相關(guān)信息,并在圖書館查閱了大量單片機(jī)資料。這不但開拓了我有關(guān)單片機(jī)領(lǐng)域的眼界,而且完善了我以往的知識體系。在這次課程設(shè)計(jì)中遇到了很多問題,這是些問題,雖然有些問題已經(jīng)在課本中討論過但是,不真正的實(shí)踐,就不能真正理解其中的含義,在第一天,我很興奮,因?yàn)槲液芟矚g編程,但是還沒有真正的編很長的程序,這次終于可以鍛煉一下了。課程設(shè)計(jì)的畫圖還是很容易的,我認(rèn)真構(gòu)思了一下,確定了那個端口接數(shù)碼管那個接鍵盤很輕松就完成了,接線和編程是密不可分的,我接線是將p3口高四位
23、作為行掃描,p1口的底四位作為列掃描,后來一想,其實(shí)本可以接在一個端口上的但是由于程序?qū)懥撕荛L了,就沒有改動,不管怎么接不影響效果,圖很輕松畫好了,在畫圖的關(guān)鍵就是考慮p0口要有上拉電阻,不然不能輸出高電平,在畫圖的過程中,可以加深對proteus的理解,和提高了基本工具的應(yīng)用熟練程度,這是在今后學(xué)習(xí)中不可缺少的。接著進(jìn)入編程階段,在編程時,我范了一個錯誤,就是沒有寫流程圖,因此寫起程序很沒有方向感,雖然在課本了說過要寫流程圖,但是一到了實(shí)踐就忘了,后來同學(xué)提醒,才恍然大悟,于是又列寫程序流程圖。這個流程圖很關(guān)鍵,如果列不好程序走向就會發(fā)生混亂,在編程第三天時,我又范了第二個大錯誤,就時太急于
24、求成,我寫了很長的程序,幾乎把顯示程序,鍵盤查詢程序都寫完了,才進(jìn)行調(diào)試,在這調(diào)試過程中一些小的問題都很容易克服,也很輕松編譯通過了,就是運(yùn)行不能得到預(yù)期的效果,因?yàn)槌绦蛱L很難知道錯誤在那里,后來同學(xué)提醒,應(yīng)該先編譯個小的簡單的程序,在慢慢往上加程序,不斷完善。于是,我又更改方案,先編寫個顯示程序,實(shí)現(xiàn)動態(tài)顯示,調(diào)試好后,在編寫鍵盤程序,因?yàn)殒I盤每一行掃描的過程都是一樣的,因此只需要使第一行調(diào)試通過就能很好的使其它行通過,調(diào)試好鍵盤后。接著出現(xiàn)的問題是如何使運(yùn)行時首先顯示0,因?yàn)轱@示程序只有一個,必須使這個程序具有通用性,后來我想到了解決方法,就是設(shè)計(jì)個計(jì)數(shù)個數(shù)單元,(40h),當(dāng)此單元為零
25、,說明沒有輸入,則只使顯示程序執(zhí)行一次循環(huán),即,只顯示零,然后跳出,等待輸入,當(dāng)輸入數(shù)據(jù)時40h單元便記錄個數(shù),根據(jù)數(shù)據(jù)個數(shù)決定循環(huán)幾次,為了能區(qū)分?jǐn)?shù)字和運(yùn)算符,我又增設(shè)了運(yùn)算符標(biāo)志,(41h)此單元的內(nèi)容如果是1表示加法,2表示減法,3表示除法,4表示乘法。這樣就不會在運(yùn)算上出現(xiàn)混亂。在第五天時,我已經(jīng)實(shí)現(xiàn)了簡單的一個字節(jié)的加、減、乘、除運(yùn)算,后來我又修改了一下使運(yùn)算擴(kuò)大一個字節(jié),這樣足以滿足課程設(shè)計(jì)的要求了。在這次課程設(shè)計(jì)我學(xué)到了很多東西,不僅是編好一個程序,更重要的使學(xué)會了一種編程思想,有了一種好的編程思想,就可以讓單片機(jī),很聽話,想做什么就可以做什么。我在實(shí)踐的同時加深了對課本知識的認(rèn)
26、識,使自己的思維能力進(jìn)一步得到提高。單片機(jī)作為電氣自動化專業(yè)的專業(yè)核心課程,在本專業(yè)學(xué)習(xí)中起著承上啟下的關(guān)鍵作用。在這此課程設(shè)計(jì)中,我在學(xué)習(xí)單片機(jī)知識的同時,也復(fù)習(xí)了以前有關(guān)的電路知識,使我過去所學(xué)與現(xiàn)在所知融會貫通,真正鍛煉和提高了我運(yùn)用知識的綜合能力。參考文獻(xiàn)1 何立民.mcs-51系列單片機(jī)應(yīng)用系統(tǒng)設(shè)計(jì)m.北京:北京行天航空工業(yè)大學(xué)出版社,1990.143.160.2 李華.mcs-51系列單片機(jī)實(shí)用接口計(jì)數(shù)m.北京:北京行天航空工業(yè)大學(xué)出版社,1993.148-158.3 張毅剛、彭喜源、譚曉昀、曲春波編著。mcs-51單片機(jī)應(yīng)用設(shè)計(jì)。哈爾濱工業(yè)大學(xué)出版社4 蔡明生主編。電子設(shè)計(jì)。高等
27、教育出版社。附1 源程序代碼設(shè)30h-37h單元為八個數(shù)碼管從地位到高位所顯示的內(nèi)容.383fh結(jié)果緩沖區(qū)。40h輸入數(shù)據(jù)個數(shù),41h加減乘除標(biāo)志位 5053行地址。42單元放運(yùn)算符次數(shù)標(biāo)志位。org 0000h ljmp startorg 0030h start:mov 30h,#00h ;初始化定義; mov 38h,#00h mov 39h,#00h mov 3ah,#00h mov 3bh,#00h mov 3ch,#00h mov 3dh,#00h mov 3eh,#00h mov 3fh,#00h mov 40h,#00h mov 41h,#00h mov 42h,#00h mov
28、 43h,#00h mov 44h,#00h mov 50h,#0e0h ;行定義; mov 51h,#0d0h mov 52h,#0b0h mov 53h,#70h loop3: acall display mov r0,#50h ;r01表示啟用r0;尋鍵值; mov r7,#04h ;r71;循環(huán)4次; loop1:mov a,r0 ;a1;r0行號; mov p3,a ;a2; mov a,#0ffh ; a1; mov p1,a ;a2; mov a,p1 ;a1;讀p1口; anl a,#0fh mov r5,a ;a2;cjne a,#0fh,loop2 ;判斷有無按鍵; inc
29、 r0 djnz r7,loop1 ;r72; jmp loop3 ; loop2:mov r4,#0a0h ; tff:acall delay1ms ;延遲10ms; djnz r4,tff; ss: mov a,#0ffh mov p1,a mov a,p1 ;判鍵是否松開; anl a,#0fh cjne a,#0fh,ss mov a,42h ;判斷是否按/號; mov r1,#30h ;顯示區(qū)低字節(jié)地址指針; cjne a,#01h,next1 mov 40h,#00h mov 42h,#00h next1: cjne r0,#0e0h,row2key ;111111;r0行號; m
30、ov a,r5 ;a1; r5列號; orl a,r0 ;r02表示停用r0; cjne a,#0eeh,key2 ;a2; mov a,40h cjne a,#08h,tw1 acall warnning jmp loop3 tw1:inc 40h mov a,#07h mov 43h,a acall move acall change11 jmp loop3 key2:cjne a,#0edh,key3 mov a,40h cjne a,#08h,tw2 acall warnning jmp loop3 tw2: inc 40h mov a,#08h mov 43h,a acall mov
31、e acall change11 jmp loop3 key3:cjne a,#0ebh,key4 mov a,40h cjne a,#08h,tw3 acall warnning jmp loop3 tw3:mov a,#09h inc 40h mov 43h,a acall move acall change11 jmp loop3 key4:acall judeg ;計(jì)算結(jié)果放入3ch起始的單元; acall change ;將結(jié)果放入顯示緩沖區(qū); mov 42h,#01h mov 41h,#04h ;04 表示除法; jmp loop3row2key:cjne r0,#0d0h,row
32、3key ;2222222222; mov a,r5 orl a,r0 cjne a,#0deh,key5 mov a,40h cjne a,#08h,tw4 acall warnning jmp loop3 tw4:inc 40hmov a,#04hmov 43h,aacall moveacall change11 jmp loop3 key5:cjne a,#0ddh,key6 mov a,40h cjne a,#08h,tw5 acall warnning jmp loop3 tw5:mov a,#05hinc 40hmov 43h,aacall moveacall change11 j
33、mp loop3 key6:cjne a,#0dbh,key7 mov a,40h cjne a,#08h,tw6 acall warnning jmp loop3 tw6:mov a,#06hinc 40hmov 43h,aacall moveacall change11jmp loop3 key7:acall judeg ;計(jì)算結(jié)果放入3ch起始的單元; acall change ;將結(jié)果放入顯示緩沖區(qū); mov 42h,#01h mov 41h,#03h ;03表示乘法; jmp loop3row3key:cjne r0,#0b0h,row4key ;3333333333333; mov
34、 a,r5 orl a,r0 cjne a,#0beh,key8 mov a,40h cjne a,#08h,tw7 acall warnning jmp loop3 tw7:mov a,#01hinc 40hmov 43h,aacall moveacall change11jmp loop3 key8:cjne a,#0bdh,key9 mov a,40h cjne a,#08h,tw8 acall warnning jmp loop3 tw8:mov a,#02hinc 40hmov 43h,aacall moveacall change11 jmp loop3 key9:cjne a,#
35、0bbh,key10 mov a,40h cjne a,#08h,tw9 acall warnning jmp loop3 tw9: mov a,#03hinc 40hmov 43h,aacall moveacall change11 jmp loop3 key10:acall judeg ;放入3ch起始的單元; acall change ;將結(jié)果放入顯示緩沖區(qū); mov 42h,#01h mov 41h,#02h ;02 表示減法; jmp loop3row4key:mov a,r5 orl a,r0 ;444444444444; cjne a,#7eh,key11 jmp start ;
36、clear; key11:cjne a,#7dh,key12 mov a,40h jz qq cjne a,#08h,tw10 acall warnning jmp loop3 tw10:mov a,#00hinc 40hmov 43h,aacall moveacall change11 qq: jmp loop3 key12:cjne a,#0bbh,key13 ;equel; acall judeg ;計(jì)算結(jié)果放入3ch起始的單元; acall change ;將結(jié)果放入顯示緩沖區(qū); jmp loop3 key13:acall judeg ;計(jì)算結(jié)果放入3ch起始的單元; acall ch
37、ange ;將結(jié)果放入顯示緩沖區(qū); mov 42h,#01h mov 41h,#01h ;01表示加法; jmp loop3move:mov r1,#30h mov r6,40hddd: xch a,r1 ;交換指令; nop nop nop nop inc r1 ;r1=30h djnz r6,ddd ret加法程序:人口:r0,被加數(shù)低位字節(jié)地址指針,r1,加數(shù)低位字節(jié)地址指針,r3,字節(jié)數(shù)出口:r0,和值地位字節(jié)地址指針,r3,和值字節(jié)數(shù)。makeadd:mov a,r0 ;保存地址; mov r2,a mov a,r3 mov r7,a clr c lop:mov a,r0 addc
38、a,r1mov r0,ainc r0inc r1djnz r7,lopjnc nextinc r3mov r0,#01h next:mov a,r2 ;回復(fù)地址; mov r0,aret減法程序:入口:r0,被減數(shù)低位字節(jié)地址指針,r1,減數(shù)低位字節(jié)地址指針,r3,字節(jié)數(shù)出口:r0,差值地位字節(jié)地址指針,r3,差值字節(jié)數(shù)。makesub:clr 07h mov a,r0 mov r2,amov a,r3mov r7,aclr c lop1:mov a,r0 subb a,r1mov r0,ainc r0inc r1djnz r7,lop1jnc lop2setb 07h lop2:mov a,
39、r2 mov r0,a ret乘法程序: 入口:r3,被乘數(shù)低位地址字節(jié),r2,被乘數(shù)高位地址字節(jié),r7,乘數(shù)低位地址字節(jié),r6,乘數(shù)高位地址字節(jié),出口:r4,r5,r6,r7結(jié)果字節(jié)由高到低makemul:mov a,r3 mov b,r7mul abxch a,r7mov r5,bmov b,r2mul abadd a,r5mov r4,aclr aaddc a,b mov r5,amov a,r6mov b,r3mul abadd a,r4xch a,r6xch a,baddc a,r5mov r5,amov f0,cmov a,r2mul abadd a,r5mov r5,aclr a
40、mov acc.0,cmov c,f0addc a,bmov r4,aret除法程序:入口:被除數(shù)放在r4r5r6r7,r4r5,內(nèi)容為零,r4高r5低,除數(shù)放在r2r3,r2高r3低,出口:商放在r6r7,r6高r7低,余數(shù)放在r4r5,r4高r5低makediv:mov a,r5 clr csubb a,r3mov a,r4subb a,r2jnc div11mov b,#16div22:clr c mov a,r7rlc amov r7,amov a,r6rlc amov r6,amov a,r5rlc amov r5,axch a,r4rlc axch a,r4mov f0,cclr
41、csubb a,r3mov r1,amov a,r4subb a,r2jb f0,div33 jc div44 div33:mov r4,a mov a,r1 mov r5,a inc r7 div44:djnz b,div22 clr f0 ret div11:setb f0 retchange11: mov r0,#40h cjne r0,#01h,ta1 ;change; mov 38h,43h jmp ta2 ta1:mov r3,38h mov r2,39h mov r6,#00h mov r7,#0ah acall makemul mov 39h,r6 mov 38h,r7 mov 3ah,r5 mov 3bh,r4 mov r0,#38h mov r1,#43h mov r3,#02h ac
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年挖掘機(jī)改裝與定制服務(wù)合同范本3篇
- 二零二五版離異家庭子女撫養(yǎng)權(quán)調(diào)整與生活費(fèi)用分擔(dān)合同3篇
- 二零二五年度酒店人力資源部員工勞動合同與招聘服務(wù)合同
- 二零二五年度心理咨詢試崗咨詢師合同
- 二零二五年度垂直電梯授權(quán)使用與垂直交通規(guī)劃合同
- 2025年度藝術(shù)瓷磚定制及清包安裝服務(wù)合同
- 2025年度個人購房借款合同及房屋維修基金擔(dān)保服務(wù)4篇
- 2025年淘寶入駐商家產(chǎn)品質(zhì)量監(jiān)控服務(wù)合同
- 2025年度滅蟑螂服務(wù)行業(yè)標(biāo)準(zhǔn)制定合同4篇
- 二零二五版新能源科技公司充電樁運(yùn)維人員聘用合同3篇
- 南通市2025屆高三第一次調(diào)研測試(一模)地理試卷(含答案 )
- 2025年上海市閔行區(qū)中考數(shù)學(xué)一模試卷
- 銷售提成對賭協(xié)議書范本 3篇
- 勞務(wù)派遣招標(biāo)文件范本
- 信息安全意識培訓(xùn)課件
- Python試題庫(附參考答案)
- 碳排放管理員 (碳排放核查員) 理論知識考核要素細(xì)目表三級
- 2024年河北省中考數(shù)學(xué)試題(含答案解析)
- 小學(xué)二年級數(shù)學(xué)口算練習(xí)題1000道
- 納布啡在產(chǎn)科及分娩鎮(zhèn)痛的應(yīng)用
- DZ/T 0462.4-2023 礦產(chǎn)資源“三率”指標(biāo)要求 第4部分:銅等12種有色金屬礦產(chǎn)(正式版)
評論
0/150
提交評論