《單片機原理及應用》
單片機課程設計報告
超聲波測距報告
目錄 第1 章 課程設計概述……………………………………………………………2
1.1 課程設計選題及原理………………………………………………2 1.2 課程設計選題調研…………………………………………………2 1.2.1 選題目的與意義………………………………………………2 1.2.2 國內外研究綜述………………………………………………3 第2 章 方案設計……………………………………………………………………………4 2.1 主要任務…………………………………………………………………… 4 2.2 設計框圖…………………………………………………………………… 4 2.3 設計所需元器件及簡介………………………………………………… 4 2.4 設計程序流程簡圖…………………………………………………………5 2.5 編程語言的選擇 第3 章 電路及部分代碼設計…………………………………………………………… 6 3.1 Stc12c5a60s2最小系統……………………………………………………6 3.2 超聲波測距模塊……………………………………………………7 3.3 數碼管顯示模塊…………………………………………………………… 8 3.4 蜂鳴器報警模塊…………………………………………………………… 9 3.5 總仿真結果及實物測量結果……………………………………………10 第4 章 課程設計心得體會和總結………………………………………………………11 4.1 心得體會…………………………………………………………………… 11 4.2 總結……………………………………………………………… 11 附 1 課程設計仿真圖………………………………………………………… 附 2 課程設計實物圖………………………………………………………… 附 3 課程設計程序設計代碼……………………………………………………………
第1 章 課程設計概述
1.1 課程設計選題及原理
課程設計題目
超聲波測距儀
設計原理
通過超聲波發射裝置發出超聲波,根據接收器接到超聲波時的時間差就可以知道距離了。這與雷達測距原理相似。 超聲波發射器向某一方向發射超聲波,在發射時刻的同時開始計時,超聲波在空氣中傳播,途中碰到障礙物就立即返回來,超聲波接收器收到反射波就立即停止計時。 最常用的超聲測距的方法是回聲探測法,超聲波發射器向某一方向發射超聲波,在發射時刻的同時計數器開始計時,超聲波在空氣中傳播,途中碰到障礙物面阻擋就立即反射回來,超聲波接收器收到反射回的超聲波就立即停止計時。超聲波在空氣中的傳播速度為340m/s,根據計時器記錄的時間t,就可以計算出發射點距障礙物面的距離s,即:s=340t/2。 由于超聲波也是一種聲波,其聲速V與溫度有關。在使用時,如果傳播介質溫度變化不大,則可近似認為超聲波速度在傳播的過程中是基本不變的。如果對測距精度要求很高,則應通過溫度補償的方法對測量結果加以數值校正。聲速確定后, 只要測得超聲波往返的時間,即可求得距離。這就是超聲波測距儀的基本原理。
1.2 課程設計選題調研
1.2.1 選題目的與意義
超聲波是指頻率在20KHz以上的聲波,它屬于機械波的范疇,可用于非接觸測量,具有不受光、電磁波以及粉塵等外界因素的干擾的優點,利用計算超聲波在發送端和接收端之間的傳輸時間和聲速來測量距離,對被測目標無損害。而且超聲波傳播速度在很大范圍內與頻率無關。超聲波的這些獨特優點越來越受到人們的重視。 目前對于超聲波精確測距的需求也越來越大,比如油庫和水箱液面的精確測量和控制,汽車輔助泊位系統的應用,物體內氣孔大小的檢測和機械內部損傷的檢測等。在機械制造,電子冶金,航海,宇航,石油化工,等工業領域也有廣泛地應用。此外,在材料科學,醫學,生物科學等領域中也占具重要地位。
1.2.2 國內外研究綜述
歷史上使用超聲波來測量距離是從第二次世界大戰時海軍的聲納技術的發展開始。聲納是一種利用聲波在水下測定目標距離和運動速度的儀器。經過幾個世紀,科學家們對此反復研究,最終發現了超聲波的原理。超聲波測距應用于各種工業領域,如工業自動控制,建筑工程測量和機器人視覺識別等方面。 超聲波作為一種檢測技術,采用的是非接觸式測量,由于它具有不受外界因素影響,對環境有一定的適應能力,且操作簡單,測量精度高等優點而被廣泛應用。這些特點可使測量儀器不受被測介質的影響,大大解決了傳統測量儀器存在的問題,比如,在粉塵多的情況下對人引起的身體接觸傷害,腐蝕性質的被測物對測量儀器腐蝕,觸電接觸不良造成的誤測等。此外該技術對被測元件無磨損,使測量儀器牢固耐用,使用壽命加長,而且還降低了能量損耗,節省人力和勞動的強度。因此,利用超聲波檢測既迅速、方便、計算簡單,又易于實時控制,在測量精度方面能達到工業實用的要求。 然而超聲波測距在實際應用中也有很多局限性。由于超聲波在傳播過程中,聲壓會隨距離的增大而呈指數規律衰減,遠目標的回波信號幅度小,信噪比低,用固定閾值的比較器檢測回波,可能導致越過門檻的時間前后移動,從而影響計時的準確性,這必然會影響到測距的準確度。此外,構成超聲波傳感器的壓電陶瓷片在壓電的雙向轉換過程中,存在慣性,滯后等現象,以及超聲波脈沖在空氣中傳播本身及多重的反射路徑,均導致回波信號被展寬,也會使測量產生較大的誤差,影響了測距的分辨率。其它如溫度,風速等也會對測量造成一定的影響。工程師針對這些誤差提出的可變閾值的超聲波測距方法,從回波信號處理的角度出發,分析了超聲波回波曲線的特性,利用回波包絡的峰值檢測技術以確定回波到達的時刻,另外,利用溫度補償電路可以降低溫度對聲速的影響,這些改進都大大的提高了超聲波測距的準確性。 計量學在制造業中越來越重要。直接在機器上測量尤其能推動制造業的發展。目前為止大部分還是采用視覺的或觸覺的測量方法。但是墻的厚度就不能用這些來測量,因此德國人把超聲系統結合到機器設計出了測距方法。隨著超聲波的發展,早在2000年時英國人就設計出了可觀察,識別并測距的超聲波集成系統。
第2 章方案設計
2.1 主要任務
設計制作一個超聲波測距儀,通過單片機控制超聲波測距模塊,計算并顯示所測距離以及實現報警功能。 整體電路的控制核心為單片機STC12C5A60S2。超聲波發射和接收電路中都對相應信號進行整形及放大,以保證測量結果盡可能精確。超聲波探頭接OUT口實現超聲波的發射和接收。另外超聲波發射和接受模塊hc-sr04還有具有溫度補償的作用,使測量精度能夠達到要求。整體結構圖包括超聲波發射接收電路,單片機電路,顯示電路與蜂鳴器報警電路等幾部分模塊組成。
2.2 設計框圖
本設計主要的四個模塊:超聲波發射和接收模塊,蜂鳴器報警模塊,單片機 STC12C5A60S2,四位數碼管顯示模塊。以下是設計框圖 file:///C:/Users/ADMINI~1/AppData/Local/Temp/msohtmlclip1/01/clip_image001.gif 圖1 設計框圖
2.3 設計所需元器件及簡介
STC12C5A60S2
增強型 8051 CPU,1T,單時鐘/ 機器周期,指令代碼完全兼容傳統8051。工作電壓5.5V-3.3V。STC12C5A60S2/AD/PWM系列單片機是宏晶科技生產的單時鐘/機器周期(1T)的單片機,是高速/低功耗/超強抗干擾的新一代8051單片機,指令代碼完全兼容傳統8051,但速度快8-12倍。內部集成MAX810專用復位電路,2路PWM,8路高速10位A/D轉換(250K/S),針對電機控制,強干擾場合。 通用I/O口(36/40/44個),復位后為:準雙向口/弱上拉(普通8051傳統I/O口) 可設置成四種模式:準雙向口/弱上拉,推挽/強上拉,僅為輸入/高阻,開漏每個I/O口驅動能力均可達到20mA,但整個芯片最大不要超過55mA。 本設計中用到的單片機管腳有P1,P2.0-P2.3,P3.5-P3.7。
超聲波測距模塊HC-SR04
超聲波測距模塊HC-SR04 可提供2-400cm的非接觸式距離感測功能,測距精度可高達3mm。模塊包括超聲波發器、接收器與控制電路本模塊性能穩定,測度距離精確。能和國外的SRF05,SRF02等超聲波測距模塊相媲美。模塊高精度,盲區(2cm)超近,穩定的測距是此產品成功走向市場的有力根據 file:///C:/Users/ADMINI~1/AppData/Local/Temp/msohtmlclip1/01/clip_image003.gif 圖2 HC-SR04正面圖
主要技術參數:1:使用電壓:DC5V 2:靜態電流:小于2mA
3:電平輸出:高5V 4:電平輸出:底0V
5:感應角度:不大于15度 6:高精度 可達0.2cm 7:探測距離:2cm-450cm 接線方式:VCC,trig(控制端),echo(接收端),GND 模塊工作原理:(1)采用IO觸發測距,給至少10us的高電平信號; (2)模塊自動發送8個40khz的方波,自動檢測是否有信號返回; (3)有信號返回,通過IO輸出一高電平,高電平持續的時間就是超聲波從發射到返回的時間.測試距離=(高電平時間*聲速(340M/S))/2; 超聲波發射器向某一方向發射超聲波,在發射超聲波的同時開始計時,超聲波在空氣中傳播,途中碰到障礙物反射后立即返回來,超聲波接收器收到反射波就立即停止計時。超聲波在空氣中的傳播速度約為340m/s,根據計時器記錄的時間t,就可以計算出超聲波發射點距障礙物的距離(s),即為:s=340t/2,這就是所謂的時間差測距法。 存在4個因素限制了該系統的最大可測距離:超聲波的幅度、反射的質地、反射回波和入射聲波之間的夾角。
四位數碼管顯示模塊
數碼管(LED SegmentDisplays)是由多個發光二極管封裝在一起組成“8”字型的器件,引線已在內部連接完成,只需引出它們的各個筆劃,公共電極。led數碼管常用段數一般為7段有的另加一個小數點,還有一種是類似于3位“+1”型。位數有半位,1,2,3,4,5,6,8,10位等等....,led數碼管根據LED的接法不同分為共陰和共陽兩類。本設計用到的是共陽極,靜態驅動也稱直流驅動數碼管。靜態驅動是指每個數碼管的每一個段碼都由一個單片機的I/O端口進行驅動,或者使用如BCD碼二-十進制譯碼器譯碼進行驅動。 共陽TAB: DB0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H,088H
本設計還需要的元件有蜂鳴器,電阻,電容,12M晶振,按鍵,三極管,面包板等
2.4 設計程序流程簡圖 file:///C:/Users/ADMINI~1/AppData/Local/Temp/msohtmlclip1/01/clip_image004.gif 圖3 設計程序流程簡圖
設計流程圖說明:本設計P3.5連接超聲波發射端,P3.7口接超聲波接收端。首先單片機開始工作,系統初始化后單片機向P3.5口發送40KHZ的方波,使超聲波發射和接受模塊開始工作,當P3.7口接收到高電平時計時器開始計時,選用的是計時器工作方式1,16位。當P3.7口接收到低電平的時候計時器關閉。此時時間存在TH0,TL0中,這是通過計算子程序把時間換算成距離四位,從高到底分別存在78H,77H,76H,75H。此時調用顯示子程序把距離顯示在四位數碼管中。再調用報警子程序,根據距離的判斷,使蜂鳴器發出不同頻率的聲音。延時很短的時間,繼續下次的測量。
2.5 編程語言的選擇 在編程語言的選擇上,我們主要考慮使用我所學過的匯編語言和C語言。 匯編語言是一種面向機器的低級的程序設計語言。它直接利用機器提供的指令系統編寫程序,該類程序的可執行指令是與機器語言程序的指令一一對應的。匯編語言由于是面向機器的程序設計語言,與具體的計算機硬件有著密切的關系,因此,可移植性差。但由于匯編指令與機器語言指令一一對應,即一條匯編語言的可執行指令對應著一條機器語言指令,反之亦然。因此,匯編語言可直接利用機器硬件系統的許多特性,如寄存器、標志位以及一些特殊指令等,具有執行速度快、占用內存少等優點。 在本設計中,設計程序過程相對不復雜,用匯編語言完全可以實現,所以本設計選擇了使用匯編語言進行編程。 第3 章電路及部分代碼設計
3.1 Stc12c5a60s2最小系統 在電源旁接了開關控制電源。復位電路旁還接了按鍵,方便復位操作。 file:///C:/Users/ADMINI~1/AppData/Local/Temp/msohtmlclip1/01/clip_image006.jpg 圖4 單片機工作最小系統
3.2 超聲波測距模塊 設計思路:單片機P3.5發送40KHZ的方波,超聲波接收到后開始測距,返回一段高電平到P3.7就是超聲波的測量的時間,所以程序設計時P3.7接收到高電平時開啟定時器,P3.7口接收到低電平時關閉定時器,這樣定時器TH0,TL0里存儲的就是測量的時間,根據公式s=340t/2就可以計算出距離。 流程圖 file:///C:/Users/ADMINI~1/AppData/Local/Temp/msohtmlclip1/01/clip_image007.gif 圖5超聲波發射和接收流程圖 電路部分 file:///C:/Users/ADMINI~1/AppData/Local/Temp/msohtmlclip1/01/clip_image009.jpg 圖6 超聲波發射和接收電路 根據超聲波測距模塊原理代碼設計部分如下 P3.5發射,P3.7接受 MOV TMOD,#01H ;置定時器T0工作方式樣3,對內部機器周期計數 CJZCX: MOV TL0,#00H ;裝入定時器初值 MOV TH0,#00H puzel:MOV 14H,#08H ;超聲波發射持續200us Here:CPL P3.5 ;輸出40kHz方波 NOP ; NOP ; NOP ; DJNZ 14H,Here ; QBA:JB P3.7,QBC ;等待1跳到QBC DJNZ R1,QBA DJNZ R0,QBA QBC:SETB TR0 ;測到1開始計時 SETB P3.2 QBB:JNB P3.7,QBD ;等待0跳到QBD JMP QBB QBD:CLR P2.3 ;測到0關閉計時 CLR TR0 3.3 數碼管顯示模塊
設計思路:此時通過計算后四位數據分別從高到底存在78H,77H,76H,75H里,顯示數據時從高到低,P1口接a-h,P2.0-P2.3口接共陽極。首先賦值P2口0FEH,讓78H中的數據給高位,在左移,把77H數據給次高位,這樣循環知道四位數據全部顯示,此時跳到主程序。 電路部分如圖6 代碼部分(說明顯示四位左端為高位,代碼中78H,77H,76H,75H分別存了四位,P1口接a-h,P2.0-P2.3接共陽極) DISPLAY: MOV R1,#78H ;立即數78H送寄存器中 MOV R5,#0FEH ;立即數FEH送寄存器R5中 PLAY: MOV A,R5 ;寄存器R5中的數值送累加器A中 MOV P2,A ;累加器A中的數值送P2口 MOV A,@R1 ;以寄存器R1中的數為地址單元的數值送累加器中 MOV DPTR,#TAB ;16位地址送地址寄存器中 MOVC A,@A+DPTR ;以中的地址為基地變址尋址單元中的數送累加器 MOV P1,A ;累加器A中的數值送P1口 MOV R6,#14H ;立即數據14送寄存器R6中 DL1:MOV R7,#19H ;立即數據19送寄存器R7中 DL2:DJNZ R7,DL2 ;寄存器中的數據減1,不為零時則轉移 DJNZ R6,DL1 ;寄存器中的數據減1,不為零時則轉移 DEC R1 ;寄存器R1中的數值減1 MOV A,R5 ;寄存器R5中的數值送累加器A中 JNB ACC.3,ENDOUT ;地址位為0則轉到ENDOUT RL A ;累加器循環右移 MOV R5,A ;累加器A中的數值送寄存器R5中 AJMP PLAY ;絕對短轉移 ENDOUT: SETB P3.5 ;置P3.5口 RET ;返回 TAB: DB0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H,088H
file:///C:/Users/ADMINI~1/AppData/Local/Temp/msohtmlclip1/01/clip_image011.jpg 圖 7 數碼管顯示電路 3.4 蜂鳴器報警模塊
設計思路:如圖P3.6口接的是蜂鳴器電路,實現蜂鳴器不同頻率報警,首先要距離分段,此程序判斷的是最高位,所以是78H里的值,控制蜂鳴器報警頻率不同是通過改變P3.6口0和1翻轉的狀態時間不同來實現的。 電路部分 file:///C:/Users/ADMINI~1/AppData/Local/Temp/msohtmlclip1/01/clip_image013.jpg 圖8 蜂鳴器報警電路 蜂鳴器報警分5種頻率 分段為<1m,1-2m,2-3m,3-4m,>4m 距離不同設定的蜂鳴器報警的頻率不同
3.5 總仿真結果及其實物測量結果
由于沒有超聲波發射和接收模塊,用按鍵來給P3.7口信號。電路的仿真結果是單片機工作后,用按鍵給信號,四位數碼管可以顯示計算值出來,蜂鳴器可以正常工作。 本次設計的實物能實現的功能功能有: (1)超聲波的發射和接受控制 (2)對回波信號的檢測 (3)測距時間到距離的換算 (4)距離不斷測量和不斷顯示 (5)對距離進行判斷,并且蜂鳴器報警
第4 章課程設計心得體會和總結 4.1 心得體會 心得:這兩個星期是一個不斷發現問題和解決問題的過程,從調研選題背景意義,了解了超聲波測距儀的工作原理及其發展,感覺上通過單片機控制是一個相對簡單的過程沒有什么彎路要走。確定方案,購買元件的時候就發現有很多的實際問題,由于第一次實際做一些東西出來,總覺得不知道從什么地方下手,這個時候小組合作就顯得格外重要,大家一起討論,給出不同的意見,完善各自的方案,了解更多實際電路要考慮到的問題,電阻的限流作用,單片機工作的電壓電流,電阻選多大,電容選多大,這些對電路都是有影響的,選的不對很可能就把單片機燒壞。每天都會有新的問題,解決完一個就會發現那不是結束僅僅是一個開始。焊接電路是一項需要有耐心的過程,一不小心就會犯錯,那是萬萬不允許的,所以必須檢查每一個焊接點,剛開始做必然做的不太嫻熟,焊接的也不太美觀,但最也算是完成了。調試電路是最頭疼的,一開始不知道是電路的問題還是程序的問題。這次我們用的是匯編語言,而大部分組用的是C語言,這讓我們在交流程序的時候顯得有些無奈,開始我們只有一個部分一個部分的慢慢調試,先從四位數碼顯示部分開始,這部分知道電路連接正確應該就不會有問題。然后我們測蜂鳴器是否工作正常。最后遇到問題是發現超聲波接收和發射模塊不能正常工作,找了很多原因,都不行。后來恍然大悟,是我們在一開始是就把超聲波發射和接收模塊的時間開始和接受弄錯了,所以計算的時間總是錯的。完成能測距的這一基本任務讓我們有了信心去做接下來的報警功能。對于我們這個超聲波測距模塊,要弄清楚每一個環節的工作原理,才能進行電路設計及程序編寫。 4.2 總結 總結:我們使用stc12c5a60s2單片機控制,hc-sr04超聲波發射和接受模塊輔助測量,在四位數碼顯示管顯示結果,蜂鳴器報警,這是整個超聲波測距系統的主要四個部分。測量范圍在2cm到300cm之間。由于經驗不足,最后的成品能雖然實現測量和報警的功能,但是任然有很多不足的地方,電路排版焊接不美觀,電路測量的有效性不夠強,程序的穩定性容錯性都存在問題。程序在努力改進后還需加強。本次課程設計學習到很多,對課本原理性的內容更是加深理解。對實踐動手能力有了很大的鍛煉和提高。 附錄1 課程設計仿真圖 file:///C:/Users/ADMINI~1/AppData/Local/Temp/msohtmlclip1/01/clip_image015.jpg 圖9 仿真電路
附錄2 課程設計實物圖 file:///C:/Users/ADMINI~1/AppData/Local/Temp/msohtmlclip1/01/clip_image017.jpg 圖10 實物圖
附錄3 程序設計代碼 ; 基于STC12C5A60S2單片機超聲波測距系統 ; 測量范圍35-300厘米 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; 中斷入口程序 ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ORG 0000H AJMP START ORG 000BH ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; 主 程 序 ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; START: MOV R0,#70H ;立即數70H送寄存器R0中 MOV R7,#0BH ;立即數0BH送寄存器R7中 MOV 20H,#00H ;立即數00H送20H單元中 CLEARDISP: MOV @R0,#00H ;立即數立即數00H送R0中的地址單元中 INC R0 ;寄存器R0加1 DJNZ R7,CLEARDISP;寄存器中的數值減1非零時轉移 MOV TMOD,#01H ;置定時器T0工作方式樣3,對內部機器周期計數 CJZCX: MOV TL0,#00H ;裝入定時器初值 MOV TH0,#00H MOV R0,#0FH MOV R1,#5bH puzel:MOV 14H,#08H ;超聲波發射持續200us Here:CPL P3.5 ;輸出40kHz方波 NOP ; NOP ; NOP ; DJNZ 14H,Here ; QBA:JB P3.7,QBC ;等待1跳到QBC DJNZ R1,QBA DJNZ R0,QBA QBC:SETB TR0 ;測到1開始計時 SETB P3.2 QBB:JNB P3.7,QBD ;等待0跳到QBD JMP QBB QBD:CLR P2.3 ;測到0關閉計時 CLR TR0 MOV 70H,TL0 MOV 71H,TH0 MOV R2,71H MOV R3,70H MOV R6,#11H MOV R7,#0H LCALL MULD MOV R6,#64H MOV R7,#0H LCALL DIVD MOV 73H,R2 MOV 74H,R3 MOV R3,#0H MOV R4,#0H MOV R5,#0H MOV R6,73H MOV R7,74H LCALL HB2 MOV A,R4 ;分離BCD MOV B,#10H DIV AB MOV 78H,A MOV 77H,B MOV A,R5 MOV B,#10H DIV AB MOV 76H,A MOV 75H,B MOV 7AH,#0FFH XXX:LCALL DISPLAY LCALL WARNING DJNZ 7AH,XXX AJMP CJZCX ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; 乘34程序(乘聲速) ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; MULD: MOV A,R3 ;計算R3乘R7 MOV B,R7 MUL AB MOV R4,B ;暫存部分積 MOV R5,A MOV A,R3 ;計算R3乘R6 MOV B,R6 MUL AB ADD A,R4 ;累加部分積 MOV R4,A CLR A ADDC A,B MOV R3,A MOV A,R2 ;計算R2乘R7 MOV B,R7 MUL AB ADD A,R4 ;累加部分積 MOV R4,A MOV A,R3 ADDC A,B MOV R3,A CLR A RLC A XCH A,R2 ;計算R2乘R6 MOV B,R6 MUL AB ADD A,R3 ;累加部分積 MOV R3,A MOV A,R2 ADDC A,B MOV R2,A RET ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; 除100程序(除法) ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; DIVD: CLR C ;比較被除數和除數 MOV A,R3 SUBB A,R7 MOV A,R2 SUBB A,R6 JC DVD1 SETB OV ;溢出 RET DVD1: MOV B,#10H ;計算雙字節商 DVD2: CLR C ;部分商和余數同時左移一位 MOV A,R5 RLC A MOV R5,A MOV A,R4 RLC A MOV R4,A MOV A,R3 RLC A MOV R3,A XCH A,R2 RLC A XCH A,R2 MOV F0,C ;保存溢出位 CLR C SUBB A,R7 ;計算(R2R3-R6R7) MOV R1,A MOV A,R2 SUBB A,R6 ANL C,/F0 ;結果判斷 JC DVD3 MOV R2,A ;夠減,存放新的余數 MOV A,R1 MOV R3,A INC R5 ;商的低位置一 DVD3: DJNZ B,DVD2 ;計算完十六位商(R4R5) MOV A,R4 ;將商移到R2R3中 MOV R2,A MOV A,R5 MOV R3,A CLR OV ;設立成功標志 RET ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; BCD轉換 ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; HB2: CLR A ;BCD碼初始化 MOV R3,A MOV R4,A MOV R5,A MOV R2,#10H ;轉換雙字節十六進制整數 HB3: MOV A,R7 ;從高端移出待轉換數的一位到CY中 RLC A MOV R7,A MOV A,R6 RLC A MOV R6,A MOV A,R5 ;BCD碼帶進位自身相加,相當于乘2 ADDC A,R5 DA A ;十進制調整 MOV R5,A MOV A,R4 ADDC A,R4 DA A MOV R4,A MOV A,R3 ADDC A,R3 MOV R3,A ;雙字節十六進制數的萬位數不超過6,不用調整 DJNZ R2,HB3 ;處理完16bit RET ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; 報警程序 ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; WARNING: MOV R6,#10 MOV A,78H CJNE A,#00H,B1 LJMP W1 B1: SUBB A,#01H CJNE A,#00H,B2 LJMP W2 B2: SUBB A,#01H CJNE A,#00H,B3 LJMP W3 B3: SUBB A,#01H CJNE A,#00H,B4 LJMP W4 B4: LJMP W5 RET W1: CPL P3.6 ;蜂鳴器驅動電平取反 MOV R7,#28 DE1: DJNZ R7,DE1 DEC R6 CJNE R6,#00,W1 ;反復循環 RET W2: CPL P3.6 ;蜂鳴器驅動電平取反 MOV R7,#228 DE2: DJNZ R7,DE2 DEC R6 CJNE R6,#00,W2 ;反復循環 RET W3: CPL P3.6 ;蜂鳴器驅動電平取反 MOV R7,#428 DE3: DJNZ R7,DE3 DEC R6 CJNE R6,#00,W3 ;反復循環 RET W4: CPL P3.6 ;蜂鳴器驅動電平取反 MOV R7,#628 DE4: DJNZ R7,DE4 DEC R6 CJNE R6,#00,W4 ;反復循環 RET W5: CPL P3.6 ;蜂鳴器驅動電平取反 MOV R7,#828 DE5: DJNZ R7,DE5 DEC R6 CJNE R6,#00,W5 ;反復循環 RET ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; 顯示程序 ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; DISPLAY: MOV R1,#78H ;立即數76H送寄存器中 MOV R5,#0FDH ;立即數FEH送寄存器R5中 PLAY: MOV A,R5 ;寄存器R5中的數值送累加器A中 MOV P2,A ;累加器A中的數值送P3口 MOV A,@R1 ;以寄存器R1中的數為地址單元的數值送累加器中 MOV DPTR,#TAB ;16位地址送地址寄存器中 MOVC A,@A+DPTR ;以中的地址為基地變址尋址單元中的數送累加器 MOV P1,A ;累加器A中的數值送P1口 MOV R6,#14H ;立即數據14送寄存器R6中 DL1:MOV R7,#19H ;立即數據19送寄存器R7中 DL2:DJNZ R7,DL2 ;寄存器中的數據減1,不為零時則轉移 DJNZ R6,DL1 ;寄存器中的數據減1,不為零時則轉移 DEC R1 ;寄存器R1中的數值加1 MOV A,R5 ;寄存器R5中的數值送累加器A中 JNB ACC.3,ENDOUT ;地址位為0則轉到ENDOUT RL A ;累加器循環右移 MOV R5,A ;累加器A中的數值送寄存器R5中 AJMP PLAY ;絕對短轉移 ENDOUT: SETB P3.5 ;置P3.5口 RET ;返回 TAB: DB0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H,088H EEE: END ;結束
|