設(shè)計(jì)要求總體方案硬件設(shè)計(jì)軟件設(shè)計(jì)系統(tǒng)調(diào)試與運(yùn)行_第1頁(yè)
設(shè)計(jì)要求總體方案硬件設(shè)計(jì)軟件設(shè)計(jì)系統(tǒng)調(diào)試與運(yùn)行_第2頁(yè)
設(shè)計(jì)要求總體方案硬件設(shè)計(jì)軟件設(shè)計(jì)系統(tǒng)調(diào)試與運(yùn)行_第3頁(yè)
設(shè)計(jì)要求總體方案硬件設(shè)計(jì)軟件設(shè)計(jì)系統(tǒng)調(diào)試與運(yùn)行_第4頁(yè)
設(shè)計(jì)要求總體方案硬件設(shè)計(jì)軟件設(shè)計(jì)系統(tǒng)調(diào)試與運(yùn)行_第5頁(yè)
已閱讀5頁(yè),還剩197頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、設(shè)計(jì)要求總體方案硬件設(shè)計(jì)軟件設(shè)計(jì)系統(tǒng)調(diào)試與運(yùn)行第10章單片機(jī)的應(yīng)用系統(tǒng)設(shè)計(jì)與開發(fā) 本章內(nèi)容Single Chip Microcomputer 第10章 單片機(jī)應(yīng)用系統(tǒng)的設(shè)計(jì)與開發(fā) 10.1 課程設(shè)計(jì)電腦鐘的設(shè)計(jì)與制作 10.2 應(yīng)用系統(tǒng)設(shè)計(jì)實(shí)例單片溫度控制系統(tǒng) 10.3 單片機(jī)應(yīng)用系統(tǒng)開發(fā)的一般方法 10.4 單片機(jī)應(yīng)用系統(tǒng)實(shí)用技術(shù) 10.5 抗干擾設(shè)計(jì)返回主目錄第10章 單片機(jī)應(yīng)用系統(tǒng)的設(shè)計(jì)與開發(fā) 10.1 課程設(shè)計(jì)電腦鐘的設(shè)計(jì)與制作 10.1.1 設(shè)計(jì)要求 設(shè)計(jì)并制作出具有如下功能的電腦鐘: (1) 自動(dòng)計(jì)時(shí),由6位LED顯示器顯示時(shí)、分、秒。 (2) 具備校準(zhǔn)功能,可以直接由09數(shù)字鍵設(shè)

2、置當(dāng)前時(shí)間。 (3) 具備定時(shí)起鬧功能。 (4) 一天時(shí)差不超過1秒鐘。 10.1.2 總體方案 1. 計(jì)時(shí)方案 方案一:采用實(shí)時(shí)時(shí)鐘芯片。 針對(duì)計(jì)算機(jī)系統(tǒng)對(duì)實(shí)時(shí)時(shí)鐘功能的普遍需求,各大芯片生產(chǎn)廠家陸續(xù)推出了一系列的實(shí)時(shí)時(shí)鐘集成電路,如DS1287、DS12887等。這些實(shí)時(shí)時(shí)鐘芯片具備年、月、日、時(shí)、分、秒計(jì)時(shí)功能和多點(diǎn)定時(shí)功能,計(jì)時(shí)數(shù)據(jù)的更新每秒自動(dòng)進(jìn)行一次,不需程序干預(yù)。計(jì)算機(jī)間,程序簡(jiǎn)單。此外,實(shí)時(shí)時(shí)鐘芯片多數(shù)帶有鋰電池做后備電源,具備永不停止的計(jì)時(shí)功能;具有可編程方波輸出功能,可用做實(shí)時(shí)測(cè)控系統(tǒng)的采樣信號(hào)等;有的實(shí)時(shí)時(shí)鐘芯片內(nèi)部還帶有非易失性RAM,可用來存放需長(zhǎng)期保存但有時(shí)也需變更

3、的數(shù)據(jù)。 方案二:軟件控制。 利用MCS-51內(nèi)部的定時(shí)/計(jì)數(shù)器進(jìn)行中斷定時(shí),配合軟件延時(shí)實(shí)現(xiàn)時(shí)、分、秒的計(jì)時(shí)。該方案節(jié)省硬件成本,且能夠使讀者在定時(shí)/計(jì)數(shù)器的使用、中斷及程序設(shè)計(jì)方面得到鍛煉與提高,因此本系統(tǒng)將采用軟件方法實(shí)現(xiàn)計(jì)時(shí)。 2. 鍵盤/顯示方案 對(duì)于實(shí)時(shí)時(shí)鐘而言,顯示顯然是另一個(gè)重要的環(huán)節(jié)。如前所述,通常有兩種顯示方式:動(dòng)態(tài)顯示和靜態(tài)顯示。 方案一:串口擴(kuò)展,LED靜態(tài)顯示。 如圖10.1(a)所示,該方案占用口資源少,采用串口傳輸實(shí)現(xiàn)靜態(tài)顯示,顯示亮度有保證,但硬件開銷大,電路復(fù)雜,信息刷新速度慢,比較適用于并行口資源較少的場(chǎng)合。 方案二:8155擴(kuò)展,LED動(dòng)態(tài)顯示。 如圖10

4、.1(b)所示,該方案硬件連接簡(jiǎn)單,但動(dòng)態(tài)掃描的顯示方式需占用CPU較多的時(shí)間,在單片機(jī)沒有太多實(shí)時(shí)測(cè)控任務(wù)的情況下可以采用。圖10.1 顯示方式框圖(a) 靜態(tài)顯示框圖;(b) 動(dòng)態(tài)顯示框圖 10.1.3 硬件設(shè)計(jì) 1. 電路原理圖 電腦鐘電路的核心是89C51單片機(jī),其內(nèi)部帶有4KB的FLASH ROM,無須外擴(kuò)程序存儲(chǔ)器;電腦時(shí)鐘沒有大量的運(yùn)算和暫存數(shù)據(jù),現(xiàn)有的128B片內(nèi)RAM已能滿足要求,也不必外擴(kuò)片外RAM。系統(tǒng)配備6位LED顯示和43鍵盤,采用8155作為鍵盤/顯示接口電路。利用8155的A口作為6位LED顯示的位選口,其中,PA0PA5分別對(duì)應(yīng)位LED0LED5,B口則作為段選

5、口,C口的低3位為鍵盤輸入口,對(duì)應(yīng)02行,A口同時(shí)用作鍵盤 的列掃描口。由于采用共陰極數(shù)碼管,因此A口輸出低電平選中相應(yīng)的位,而B口輸出高電平點(diǎn)亮相應(yīng)的段。P1.0接蜂鳴器,低電平驅(qū)動(dòng)蜂鳴器鳴叫啟鬧。 由圖10.2可見,8155的地址分配如下: 控制寄存器:8000H,定義為PORT A口:8001H,定義為PORTA B口:8002H,定義為PORTB C口:8003H,定義為PORTC 如果使用本書配備的實(shí)驗(yàn)板實(shí)現(xiàn)該電腦鐘,需將8155地址改變?yōu)?圖10.2 電腦鐘硬件原理圖 控制寄存器:4400H A口:4401H B口:4402H C口:4403H 并通過引出的P1口外接一個(gè)蜂鳴器電路

6、,或是用P1口上的發(fā)光二極管模擬鬧鐘功能。需要指出的是,實(shí)驗(yàn)板使用的是8031芯片,使用外擴(kuò)程序存儲(chǔ)器EPROM2764,因此其腳必須接地。 2. 系統(tǒng)工作流程 本電腦鐘具備以下功能: (1) 時(shí)鐘顯示:6位LED從左到右依次顯示時(shí)、分、秒,采用24小時(shí)計(jì)時(shí)。 (2) 鍵盤功能:采用43鍵盤,包括:09 數(shù)字鍵,鍵號(hào)為00H09HC/R鍵 時(shí)間設(shè)定/啟動(dòng)計(jì)時(shí)鍵,鍵號(hào)為0AH ALM鍵 鬧鐘設(shè)置/啟鬧/停鬧鍵,鍵號(hào)為0BH (1) 時(shí)間顯示:上電后,系統(tǒng)自動(dòng)進(jìn)入時(shí)鐘顯示,從00:00:00開始計(jì)時(shí),此時(shí)可以設(shè)定當(dāng)前時(shí)間。 (2) 時(shí)間調(diào)整:按下C/R鍵,系統(tǒng)停止計(jì)時(shí),進(jìn)入時(shí)間設(shè)定狀態(tài),系統(tǒng)保持原

7、有顯示,等待鍵入當(dāng)前時(shí)間。按下09數(shù)字鍵可以順序設(shè)置時(shí)、分、秒,并在相應(yīng)LED管上顯示設(shè)置值,直至6位設(shè)置完畢。系統(tǒng)將自動(dòng)由設(shè)定后的時(shí)間開始計(jì)時(shí)顯示。 (3) 鬧鐘設(shè)置/啟鬧/停鬧:按下ALM鍵,系統(tǒng)繼續(xù)計(jì)時(shí),顯示00:00:00,進(jìn)入鬧鐘設(shè)置狀態(tài),等待鍵入啟鬧時(shí)間。按下09數(shù)字鍵可以順序進(jìn)行相應(yīng)的時(shí)間設(shè)置,并在相應(yīng)LED管上顯示設(shè)置值,直至6位設(shè)置完畢。這將啟動(dòng)定時(shí)啟鬧功能,并恢復(fù)時(shí)間顯示。定時(shí)時(shí)間到,蜂鳴器鳴叫,直至重新按下ALM鍵停鬧,并取消鬧鐘設(shè)置。 10.1.4 軟件設(shè)計(jì) 1. 系統(tǒng)資源分配 為方便閱讀程序,先對(duì)系統(tǒng)的資源分配加以說明。 (1) 定時(shí)器:定時(shí)器0用作時(shí)鐘定時(shí),按方式1

8、工作,每隔100 ms溢出中斷一次。 (2) 片內(nèi)RAM及標(biāo)志位的分配與定義見表10.1。地 址功 能名 稱初始化值30H35H顯示緩沖區(qū),小時(shí)、分、秒(高位在前)DISP0DISP500H3CH3FH計(jì)時(shí)緩沖區(qū),時(shí)、分、秒、100 msHOUR,MIN,SEC,MSEC00H40H42H鬧鐘值寄存區(qū),時(shí)、分、秒AHOUR,AMIN,ASECFFH50H7FH堆棧區(qū)PSW.5計(jì)時(shí)顯示允許位(1:禁止,0:允許)F00PSW.1鬧鐘標(biāo)志位(1:正在鬧響,0:未鬧響)F10表10.1 電子鐘控制軟件片內(nèi)RAM及標(biāo)志位分配表 2. 軟件流程 根據(jù)上述工作流程,軟件設(shè)計(jì)可分為以下幾個(gè)功能模塊: (1)

9、 主程序:初始化與鍵盤監(jiān)控。 (2) 計(jì)時(shí):為定時(shí)器0中斷服務(wù)子程序,完成刷新計(jì)時(shí)緩沖區(qū)的功能。 (3) 時(shí)間設(shè)置與鬧鐘設(shè)置:由鍵盤輸入設(shè)置當(dāng)前時(shí)間與定時(shí)啟鬧時(shí)間。 (4) 顯示:完成6位動(dòng)態(tài)顯示。 (5) 鍵盤掃描:判斷是否有鍵按下,并求取鍵號(hào)。 (6) 定時(shí)比較:判斷啟鬧時(shí)間到否?如時(shí)間到,則啟動(dòng)蜂鳴器鳴叫。 (7) 其它輔助功能子程序,如鍵盤設(shè)置、拆字、合字、時(shí)間合法性檢測(cè)等。 下面分模塊進(jìn)行軟件設(shè)計(jì): (1) 主程序模塊MAIN:流程圖如圖10.3所示。 (2) 計(jì)時(shí)程序模塊CLOCK:流程圖如圖10.4所示。圖10.3 主程序流程圖圖10.4 計(jì)時(shí)程序流程圖 如前所述,系統(tǒng)定時(shí)采用定

10、時(shí)器與軟件循環(huán)相結(jié)合的方法。定時(shí)器0每隔100 ms溢出中斷一次,則循環(huán)中斷10次延時(shí)時(shí)間為1 s,上述過程重復(fù)60次為1分,分計(jì)時(shí)60次為1小時(shí),小時(shí)計(jì)時(shí)24次則時(shí)間重新回到00:00:00。 設(shè)系統(tǒng)使用6 MHz的晶振,定時(shí)器0工作在方式1,則100 ms定時(shí)對(duì)應(yīng)的定時(shí)器初值可由下式計(jì)算得到: 定時(shí)時(shí)間=(216-定時(shí)器0初值)(12/fosc)因此,定時(shí)器0初值=3CB0H,即TH0=3CH,TL0=0B0H 當(dāng)系統(tǒng)使用其它頻率的晶振時(shí),可以由上式計(jì)算相應(yīng)的定時(shí)器0初值,也可以改變定時(shí)時(shí)間。例如當(dāng)系統(tǒng)晶振為12 MHz時(shí),同樣的初值對(duì)應(yīng)的定時(shí)時(shí)間為50 ms,則循環(huán)中斷次數(shù)為20次時(shí),延

11、時(shí)時(shí)間為1 s。 第一,定時(shí)器溢出產(chǎn)生中斷請(qǐng)求,CPU并不一定立即響應(yīng)中斷,而可能需要延遲一個(gè)中斷響應(yīng)時(shí)間之后才能響應(yīng)中斷,中斷響應(yīng)時(shí)間大約為38個(gè)機(jī)器周期。顯然,這將在定時(shí)時(shí)間中加入額外的延時(shí)時(shí)間,導(dǎo)致計(jì)時(shí)誤差。 為了保證計(jì)時(shí)精度,必須采取措施進(jìn)行補(bǔ)償。我們采用增大重裝的定時(shí)器0初值的方法來減少定時(shí)器0定時(shí)時(shí)間。具體應(yīng)調(diào)整為多大,一般需要通過調(diào)試來確定。經(jīng)測(cè)試,定時(shí)器0重裝初值設(shè)為3CB7H3CBFH可以滿足精度要求。 第二,時(shí)間是按十進(jìn)制遞增,而MCS-51單片機(jī)只有二進(jìn)制加法指令,因此用加法指令計(jì)時(shí)必須進(jìn)行二十進(jìn)制轉(zhuǎn)換。 (3) 時(shí)間設(shè)置程序和鬧鐘定時(shí)程序模塊MODIFY:流程圖如圖10

12、.5所示。圖10.5 時(shí)間設(shè)置/鬧鐘定時(shí)流程圖 將鍵盤輸入的6位時(shí)間值合并為3位壓縮BCD碼(時(shí)、分、秒)送入計(jì)時(shí)緩沖區(qū)和鬧鐘值寄存區(qū),作為當(dāng)前計(jì)時(shí)起始時(shí)間或鬧鐘定時(shí)時(shí)間。該模塊的入口為計(jì)時(shí)緩沖區(qū)或鬧鐘值寄存區(qū)的首地址,置入R1中。程序調(diào)用一個(gè)鍵盤設(shè)置子程序KEYIN(如圖10.6所示)來將鍵入的6位時(shí)間值送入鍵盤設(shè)置緩沖區(qū),然后用合字子程序COMB將鍵盤設(shè)置緩沖區(qū)中的6位BCD碼合并為3位壓縮BCD碼,送入計(jì)時(shí)緩沖區(qū)或鬧鐘值寄存區(qū)。該程序同時(shí)作為時(shí)間值合法性檢測(cè)程序,若鍵盤輸入的小時(shí)值大于23,分和秒值大于59,則不合法,將取消本次設(shè)置,清零重新開始計(jì)時(shí)。圖10.6 鍵盤設(shè)置子程序流程圖圖1

13、0.7 鍵盤掃描流程圖 (4) 鍵盤掃描程序模塊KEYSCAN:流程圖如圖10.7所示。 判斷是否有鍵按下,無鍵按下則循環(huán)等待;有鍵按下則求取鍵號(hào)并將鍵號(hào)送A累加器返回。程序中的去抖延時(shí)和循環(huán)等待延時(shí)都用DISPLAY子程序來代替,從而保證隨時(shí)刷新顯示。鍵盤掃描程序在第7章中有詳細(xì)的敘述,在此不再贅述。 (5) 顯示程序模塊DISPLAY:流程圖如圖10.8所示。 將顯示緩沖區(qū)中的6位BCD碼用動(dòng)態(tài)掃描方式顯示。為此,必須首先將3 字節(jié)計(jì)時(shí)緩沖區(qū)中的時(shí)、分、秒壓縮BCD碼拆分為6字節(jié)(百位、十位分別占有1字節(jié))BCD碼,這一功能由拆字子程序SEPA來實(shí)現(xiàn)。圖10.8 顯示流程圖 需要注意的是,

14、當(dāng)按下時(shí)間或鬧鐘設(shè)置鍵后,在6位設(shè)置完成之前,應(yīng)顯示鍵入的數(shù)據(jù),而不顯示當(dāng)前時(shí)間。為此,我們?cè)O(shè)置了一個(gè)計(jì)時(shí)顯示允許標(biāo)志位F0,在時(shí)間/鬧鐘設(shè)置期間F0=1,不調(diào)用SEPA,即調(diào)用SEPA刷新顯示緩沖區(qū)的前提條件是F0=0。 (6) 定時(shí)比較程序模塊ALARM:流程圖如圖10.9所示。 將當(dāng)前時(shí)間(計(jì)時(shí)緩沖區(qū)的值)與預(yù)設(shè)的啟鬧時(shí)間(鬧鐘設(shè)置寄存區(qū)的值)比較,二者完全相同時(shí),啟動(dòng)蜂鳴器鳴叫,并置位鬧鐘標(biāo)志位。返回后,待重新按下ALM鍵停鬧,并清零鬧鐘標(biāo)志。圖10.9 定時(shí)比較流程圖 (7) 拆字程序SEPA與合字程序COMB:如前所述,拆字程序的功能是將3字節(jié)計(jì)時(shí)緩沖區(qū)中的時(shí)、分、秒壓縮BCD碼拆

15、分為6字節(jié)(百位、十位、個(gè)位分別占有2字節(jié))BCD碼并刷新顯示緩沖區(qū);合字程序的功能是將鍵盤設(shè)置緩沖區(qū)中的6位BCD碼合并為3位壓縮BCD碼,送入計(jì)時(shí)緩沖區(qū)或鬧鐘值寄存區(qū),同時(shí)檢測(cè)時(shí)間值的合法性。下面給出各模塊的源程序。;*主程序MAIN*ORG0000HAJMPMAINORG 000BHAJMPCLOCKORG 0030HPORT EQU 8000HPORTA EQU 8001HPORTB EQU 8002HPORTCEQU 8003HDISP0 EQU 30HDISP1 EQU 31HDISP2 EQU 32HDISP3 EQU 33HDISP4 EQU 34HDISP5 EQU 35HH

16、OUR EQU 3CH MIN EQU 3DH SEC EQU 3EH MSEC EQU 3FH AHOUR EQU 40H AMINEQU 41H ASEC EQU 42H F1 BIT PSW.1MAIN:MOV SP,#50H ;設(shè)置堆棧區(qū) MOVX DPTR,#PORT MOVA,#03H MOVX DPTR,A;8155初始化CLR F1;清零鬧鐘標(biāo)志位CLRF0;允許計(jì)時(shí)顯示 MOV AHOUR,#0FFH MOV AMIN,#0FFH MOV ASEC,#0FFH MOV R7,#10H MOV R0,#DISP0 CLR ALOOP: MOV R0,A INCR0 DJNZ R

17、7,LOOP ;設(shè)置初值 MOV TMOD,#01H MOV TL0,#0B0H MOV TH0,#3CH ;定時(shí)器0初始化,定時(shí) 時(shí)間100 ms SETB TR0;啟動(dòng)定時(shí)器 SETB EA SETB ET0;開中斷 BEGIN: ACALLALARM ;調(diào)用定時(shí)比較 ACALLKEYSCAN ;調(diào)用鍵盤掃描 CJNEA,#0AH,NEXT1 ;是CLR/RST鍵否? CLR TR0 ;是則暫時(shí)停止計(jì)時(shí) MOV R1,#HOUR ;地址指針指向計(jì)時(shí)緩沖區(qū)首地址 AJMPMODNEXT1:CJNE A,#0BH,BEGIN ;是ALARM鍵否? JBF1,NEXT2 ;鬧鐘正在鬧響否? MO

18、VR1,#AHOUR ;地址指針指向鬧鐘值寄存區(qū)首地址 MOD: SETBF0 ;置位時(shí)間設(shè)置/鬧鐘定時(shí)標(biāo)志,禁止顯示計(jì)時(shí)時(shí)間 ACALLMODIFY ;調(diào)用時(shí)間設(shè)置/鬧鐘定時(shí)程序 SETBTR0 ;重新開始計(jì)時(shí) CLRF0 ;清零時(shí)間設(shè)置/鬧鐘定時(shí)標(biāo)志,恢復(fù)顯示計(jì)時(shí)時(shí)間 AJMPBEGINNEXT2: SETBP1.0;鬧鐘正在鬧響,停鬧 CLRF1;清零鬧鐘標(biāo)志 AJMPBEGIN ;*時(shí)間設(shè) 置/鬧鐘定時(shí)模塊MODIFY*MODIFY:ACALLKEYIN;調(diào)用鍵盤設(shè)置子程序 ACALL COMB;調(diào)用合字子程序RET鍵盤設(shè)置子程序KEYIN:KEYIN:PUSHPSWPUSHACC S

19、ETBRS1 ;保護(hù)現(xiàn)場(chǎng) MOVR0,#DISP0 ;R0指向顯示緩沖區(qū)首地址 MOVR7,#06H ;設(shè)置鍵盤輸入次數(shù)L1:CLRRS1 ACALLKEYSCAN ;調(diào)用鍵盤掃描程序取按下鍵 的鍵號(hào) SETB RS1 CJNEA,#0AH,L2 ;鍵入數(shù)合法性檢測(cè)(是否大 于9) L2:JNCL1;大于9,重新鍵入MOVR0,A;鍵號(hào)送顯示緩沖區(qū)INCR0DJNZR7,L1;6位時(shí)間輸入完否?未 完繼續(xù),否則返回POPACCPOPPSWCLRRS1;恢復(fù)現(xiàn)場(chǎng)RET ;*鍵盤掃描子程序KEYSCAN* KEYSCAN:ACALLTEST ;調(diào)判按鍵是否按下子程序TEST JNZ REMOV ;

20、有鍵按下調(diào)消抖延時(shí) ACALLDISPLAY ACALLALARM AJMP KEYSCAN ;無鍵按下繼續(xù)判是否按鍵 REMOV: ACALL DISPLAY;調(diào)用顯示子程序延時(shí)消抖 ACALLTEST ;再判是否有鍵按下 JNZLIST ;有鍵按下轉(zhuǎn)逐列掃描 ACALLDISPLAY ACALL ALARM AJMPKEYSCAN ;無鍵按下繼續(xù)判是否按鍵 LIST:MOVR2,#0FEH ;首列掃描字送R2MOVR3,#00H ;首列鍵號(hào)送R3LINE0:MOVDPTR,#PORTA ;DPTR指針指向8155的A口 MOV A,R2 ;首列掃描字送R2 MOVXDPTR,A ;首列掃描

21、字送8155的A口 MOV DPTR,#PORTC ;DPTR指針指向8155的C口 MOVXA,DPTR ;讀入C口的行狀態(tài) JB ACC.0,LINE1 ;第0行鍵無鍵按下轉(zhuǎn)第1行 MOVA,#00H ;第0行有鍵按下,行首鍵號(hào)送A AJMPTRYK ;求鍵號(hào) NEXT: INC R3;掃描下一列 MOV A,R2;列掃描字送A JNBACC.3,EXIT ;4列掃描完,重新進(jìn)行 下一輪掃描 RL A;4列未掃描完,掃描字左移掃描下一列 MOV R2,A;掃描字送A AJMP LINE0 ;轉(zhuǎn)向掃描下一列 EXIT: AJMP KEYSCAN;等待下一次按鍵TRYK: ADD A,R3;按

22、公式計(jì)算鍵碼,求得鍵號(hào) PUSH ACC;鍵號(hào)入棧保護(hù)LETK:ACALL TEST;等待按鍵釋放 JNZLETK;按鍵未釋放,繼續(xù)等待 POPACC;按鍵釋放,鍵號(hào)出棧RET;鍵盤掃描結(jié)束,返回TEST:MOVDPTR,#PORTA ;DPTR指針指向8155的A口MOV A,#00HMOVX DPTR, A ;全掃描字00H送8155的A口MOVDPTR,#PORTC ;DPTR指針指向8155的C口MOVX A,DPTR ;讀入C口行狀態(tài)CPLA ;A取反,以高電平表示有 鍵按下ANLA,#07H ;屏蔽高5位RET ;*顯示子程序DISPLAY*DISPLAY:JB F0,DISP ;

23、允許時(shí)間顯示標(biāo)志F0=1轉(zhuǎn)DISPACALL SEPA ;否則調(diào)用SEPA刷新顯示緩沖區(qū) DISP: push psw ;動(dòng)態(tài)掃描顯示子程序 Pushacc setb rs0 MOV dptr,#PORTA MOV A,#0FFH MOVX DPTR,A ;關(guān)顯示 mov r0,#disp0 mov r7,#00h mov r6,#06h mov r5,#0fehdis1: mov dptr,#tab mov a,r0 movc a,a+dptr mov dptr,#portbmovxdptr,a mov dptr,#porta mov a,r5 movx dptr,ahere: djnz r

24、7,here inc r0 mov a,r5 rl a mov r5,a djnz r6,dis1 clr rs0 pop acc pop psw ret tab: db 3fh,06h,5bh,4fh,66h,6dh,7dh,07h db 7fh,6fh,77h,7ch,39h,5eh,79h,71h;共陰極字型碼表 ;*合字子程序COMB*COMB: MOV R0,#DISP1 ;R0指向顯示緩沖區(qū)小時(shí) 低位 ACALL COMB1 ;合字 CJNE A,#24H,CHK ;小時(shí)大于24否?CHK: JNCEXIT1 ;大于24則取消本次設(shè) 置,退出 MOVR1,A ;否則小時(shí)送計(jì)時(shí)緩沖區(qū)

25、 /鬧鐘值寄存區(qū)小時(shí)單元 INCR1 MOVR0,#DISP3;R0指向顯示緩沖區(qū)分低位 ACALLCOMB1 CJNEA,#60H,CHK1CHK1:JNC EXIT1 MOV R1,A INCR1 MOV R0,#DISP5 ;R0指向顯示緩沖區(qū)秒低位 ACALL COMB1 CJNEA,#60H,CHK2 CHK2:JNCEXIT1 MOVR1,ARET EXIT1: AJMPMAIN ;輸入不合法退出,重新清 零計(jì)時(shí)COMB1:MOV A,R0 ANL A,#0FH ;取出低位 MOV43H,A;暫存于43H單元 DECR0;指向高位 MOVA,R0 ANLA,#0FH SWAPA;高

26、位送高4位 ORLA,43H;高低位合并RET;*拆字子程序SEPA*SEPA:PUSH PSW PUSH ACC SETBRS0 MOVR0,#DISP5;指向顯示緩沖區(qū)秒低位 MOVA,SEC ACALLSEPA1 MOVA,MIN ACALLSEPA1 MOVA,HOUR ACALLSEPA1 POPACC POPPSW RETSEPA1:MOV 44H,A;暫存44H ANLA, #0FH;取出低位 MOV R0,A;送顯示緩沖區(qū)低位 DEC R0 ;指向顯示緩沖區(qū)高位 MOV A,44H ANL A,#0F0H;取出高位 SWAPA;高位送往低4位形成高位數(shù)據(jù) MOVR0,A ;高位

27、數(shù)據(jù)送顯示緩沖區(qū)高位RET;*定時(shí)比較模塊ALARM*ALARM:MOVA,ASECCJNEA,SEC,BACK ;秒單元相同則繼續(xù)比較,否則返回 MOVA,AMINCJNEA,MIN,BACK;分單元相同則繼續(xù)比較,否則返回MOVA,AHOUR CJNE A,HOUR,BACK ;小時(shí)單元相同定時(shí)時(shí)間到 CLRP1.0 ;啟動(dòng)鬧鐘鳴叫 SETBF1 ;置位鬧鐘標(biāo)志BACK: RET;*定時(shí)器0中斷服務(wù)子程序CLOCK*CLOCK:MOV TL0,#0B7H MOVTH0,#3CH ;重裝初值,時(shí)間校正 PUSHPSWPUSHACC;保護(hù)現(xiàn)場(chǎng)INCMSECMOVA,MSECCJNEA,#0AH

28、,DONEMOVMSEC,#00HMOVA,SECINCA DAA;二十進(jìn)制轉(zhuǎn)換 MOVSEC,A CJNEA,#60H,DONE MOVSEC,#00H MOVA,MIN INCA DAA MOVMIN,A CJNEA,#60H,DONEMOVMIN,#00HMOVA,HOURINCADAAMOVHOUR,ACJNEA,#24H,DONEMOVHOUR,#00H DONE:POPACCPOPPSW;恢復(fù)現(xiàn)場(chǎng)RETI 10.1.5 系統(tǒng)調(diào)試與脫機(jī)運(yùn)行 完成了硬件的設(shè)計(jì)、制作和軟件編程之后,要使系統(tǒng)能夠按設(shè)計(jì)意圖正常運(yùn)行,必須進(jìn)行系統(tǒng)調(diào)試。系統(tǒng)調(diào)試包括硬件調(diào)試和軟件調(diào)試兩個(gè)部分。不過,作為一個(gè)計(jì)

29、算機(jī)系統(tǒng),其運(yùn)行是軟硬件相結(jié)合的,因此,軟硬件的調(diào)試也是不可能絕對(duì)分開的,硬件的調(diào)試常常需要利用調(diào)試軟件,軟件的調(diào)試也可能需要通過對(duì)硬件的測(cè)試和控制來進(jìn)行。 1. 硬件調(diào)試 硬件調(diào)試的主要任務(wù)是排除硬件故障,其中包括設(shè)計(jì)錯(cuò)誤和工藝性故障。 (1) 脫機(jī)檢查。用萬用表逐步按照電路原理圖檢查印制電路板中所有器件的各引腳,尤其是電源的連接是否正確;檢查數(shù)據(jù)總線、地址總線和控制總線是否有短路等故障,順序是否正確;檢查各開關(guān)按鍵是否能正常開關(guān),是否連接正確;各限流電阻是否短路等。為了保護(hù)芯片,應(yīng)先對(duì)各IC座(尤其是電源端)電位進(jìn)行檢查,確定其無誤后再插入芯片檢查。 (2) 聯(lián)機(jī)調(diào)試。暫時(shí)拔掉89C51芯

30、片,將仿真器的40芯仿真插頭插入89C51的芯片插座進(jìn)行調(diào)試,檢驗(yàn)鍵盤/顯示接口電路是否滿足設(shè)計(jì)要求??梢酝ㄟ^一些簡(jiǎn)單的測(cè)試軟件來查看接口工作是否正常。例如,我們可以設(shè)計(jì)一個(gè)軟件,使8155的A、B口輸出55H或AAH,同時(shí)讀C口,運(yùn)行后用萬用表檢查相應(yīng)端口電平是否一高一低,在仿真器中檢查讀入的C口低3位是否為1,如果正常則說明8155工作正常。還可設(shè)計(jì)一個(gè)使所有LED全顯示“8.”的靜態(tài)顯示程序來檢驗(yàn)LED的好壞。如果運(yùn)行測(cè)試結(jié)果與預(yù)期不符,很容易根據(jù)故障現(xiàn)象判斷故障原因并采取針對(duì)性措施排除故障。 2. 軟件調(diào)試 軟件調(diào)試的任務(wù)是利用開發(fā)工具進(jìn)行在線仿真調(diào)試,發(fā)現(xiàn)和糾正程序錯(cuò)誤,同時(shí)也能發(fā)現(xiàn)

31、硬件故障。 程序的調(diào)試應(yīng)一個(gè)模塊一個(gè)模塊地進(jìn)行,首先單獨(dú)調(diào)試各功能子程序,檢驗(yàn)程序是否能夠?qū)崿F(xiàn)預(yù)期的功能,接口電路的控制是否正常等;最后逐步將各子程序連接起來總調(diào)。聯(lián)調(diào)需要注意的是,各程序模塊間能否正確傳遞參數(shù),特別要注意各子程序的現(xiàn)場(chǎng)保護(hù)與恢復(fù)。調(diào)試的基本步驟如下: (1) 用仿真器修改顯示緩沖區(qū)內(nèi)容,屏蔽拆字程序,調(diào)試動(dòng)態(tài)掃描顯示功能。例如將DISP0DISP5單元置為“012345”,應(yīng)能在LED上從左到右顯示“012345”。若顯示不正確,可在DISP子程序相應(yīng)位置設(shè)置斷點(diǎn)調(diào)試檢查。然后用仿真器修改計(jì)時(shí)緩沖區(qū)內(nèi)容,調(diào)用拆字程序,調(diào)試顯示模塊DISPLAY。例如,將HOUR、MIN、SE

32、C單元置為“123456”,檢查是否能正確顯示“12:34:56”。若顯示不正確,應(yīng)在SEPA子程序相應(yīng)位置設(shè)置斷點(diǎn),調(diào)試檢查。 (2) 運(yùn)行主程序調(diào)試計(jì)時(shí)模塊,不按下任何鍵,檢查是否能從由00:00:00開始正確計(jì)時(shí)。 若不能正確計(jì)時(shí)則應(yīng)在定時(shí)器中斷服務(wù)子程序中設(shè)置斷點(diǎn),檢查HOUR、MIN、SEC、MSEC單元是否隨斷點(diǎn)運(yùn)行而變化。然后屏蔽緩沖區(qū)初始化部分,用仿真器修改計(jì)時(shí)緩沖區(qū)內(nèi)容為23:58:48,運(yùn)行主程序(不按下任何鍵),檢驗(yàn)?zāi)芊裾_進(jìn)位。 (3) 調(diào)試鍵盤掃描模塊KEYSCAN,先用延時(shí)10ms子程序代替顯示子程序延時(shí)消抖,在求取鍵號(hào)后設(shè)置斷點(diǎn),中斷后觀察A累加器中的鍵號(hào)是否正確

33、;然后恢復(fù)用顯示子程序延時(shí)消抖,檢驗(yàn)與DISPLAY模塊能否正確連接。 (4) 調(diào)試時(shí)間設(shè)置/鬧鐘定時(shí)模塊MODIFY。首先屏蔽COMB子程序,單獨(dú)調(diào)試鍵盤設(shè)置模塊KEYIN,觀察顯示緩沖區(qū)DISP0DISP5單元的內(nèi)容是否隨鍵入的鍵號(hào)改變,以及鍵號(hào)能否在LED上顯示。然后屏蔽KEYIN子程序,單獨(dú)調(diào)試合字模塊COMB,分別將R1設(shè)置為時(shí)間設(shè)置緩沖區(qū)和鬧鐘值寄存區(qū)的首地址,修改顯示緩沖區(qū)內(nèi)容,程序運(yùn)行后查看時(shí)間設(shè)置緩沖區(qū)HOUR、MIN、SEC單元和鬧鐘值寄存區(qū)AHOUR、AMIN、ASEC單元內(nèi)容是否正確。最后聯(lián)調(diào)MODIFY模塊。 (5) 運(yùn)行主程序聯(lián)調(diào),檢查能否用鍵盤修改當(dāng)前時(shí)間以及設(shè)置

34、鬧鐘,能否正確計(jì)時(shí)、啟鬧、停鬧。 3. 脫機(jī)運(yùn)行 軟硬件調(diào)試成功之后,可以將程序固化到89C51的FLASH ROM中,插入89C51芯片,接上電源脫機(jī)運(yùn)行。既然軟硬件都已調(diào)試成功,脫機(jī)運(yùn)行似乎肯定成功,然而事實(shí)往往并非如此,仍有可能出現(xiàn)以下故障: (1) 系統(tǒng)不工作。其原因主要有晶振不起振(晶振損壞、晶振電路不正常導(dǎo)致晶振信號(hào)太弱等),或腳沒有接高電平(接地或懸空)等。 (2) 系統(tǒng)工作時(shí)好時(shí)壞。這主要是由干擾引起的。由于本系統(tǒng)沒有傳感輸入通道和控制輸出通道,干擾源相對(duì)較少且簡(jiǎn)單,因此,在電源、總線處對(duì)地接濾波電容一般可以解決問題。10.2 應(yīng)用系統(tǒng)設(shè)計(jì)實(shí)例單片機(jī)溫度控制系統(tǒng) 10.2.1

35、技術(shù)指標(biāo) 烘干箱的具體指標(biāo)如下: (1) 烘干箱由2 kW電爐加熱,最高溫度為500。 (2) 烘干箱溫度可預(yù)置,烘干過程恒溫控制,溫度控制誤差2。 (3) 預(yù)置時(shí)顯示設(shè)定溫度,烘干時(shí)顯示實(shí)時(shí)溫度,顯示精確到1。 (4) 溫度超出預(yù)置溫度5時(shí)發(fā)聲報(bào)警。 (5) 對(duì)升降溫過程的線性沒有要求。 10.2.2 控制方案 產(chǎn)品的工藝不同,控制溫度的精度也不同,因而所采用的控制算法也不同。就溫度控制系統(tǒng)的動(dòng)態(tài)特性來講,基本上都是具有純滯后的一階環(huán)節(jié),當(dāng)系統(tǒng)精度及溫控的線性性能要求較高時(shí),多采用PID算法或達(dá)林頓算法來實(shí)現(xiàn)溫度控制。 本系統(tǒng)是一個(gè)典型的閉環(huán)控制系統(tǒng)。從技術(shù)指標(biāo)可以看出,系統(tǒng)對(duì)控制精度的要求

36、不高,對(duì)升降溫過程的線性也沒有要求,因此,系統(tǒng)采用最簡(jiǎn)單的通斷控制方式,即當(dāng)烘干箱溫度達(dá)到設(shè)定值時(shí)斷開加熱電爐,當(dāng)溫度降到低于某值時(shí)接通電爐開始加熱,從而保持恒溫控制。 10.2.3 硬件設(shè)計(jì) 系統(tǒng)的硬件電路包括主機(jī)、溫度檢測(cè)、溫度控制、人機(jī)對(duì)話(鍵盤/顯示/報(bào)警)4個(gè)主要部分。圖10.10為系統(tǒng)的結(jié)構(gòu)框圖,圖10.11為系統(tǒng)的硬件電路原理圖。 下面對(duì)各部分電路分述如下。 1) 主機(jī) 由于系統(tǒng)控制方案簡(jiǎn)單,數(shù)據(jù)量也不大,因此選用8031作為控制系統(tǒng)的核心,外擴(kuò)EPROM2764作為程序存儲(chǔ)器。也可視具體情況換用8051、8052、8751、8752、80C51、89C51、89C52等。其中,

37、8051、8052、8751、8752的各個(gè)引腳輸入/輸出電平只與TTL電平兼容;89C51、89C52、80C51各引腳輸入/輸出電平既與TTL電平兼容,也與CMOS電平兼容。圖10.10 電烤箱控制系統(tǒng)結(jié)構(gòu)框圖10.11 電烤箱控制系統(tǒng)硬件電路原理圖 8031的晶振頻率為6 MHz。 2) 溫度檢測(cè) 這部分包括溫度傳感器、變送器和A/D轉(zhuǎn)換三部分。 溫度傳感器和變送器的類型選擇與被控溫度的范圍及精度等級(jí)有關(guān)。型號(hào)為WZB003,分度號(hào)為BA2的鉑熱電阻適用于0500的溫度測(cè)量范圍,可以滿足本系統(tǒng)的要求。 變送器將電阻信號(hào)轉(zhuǎn)換成與溫度成正比的電壓,當(dāng)溫度在0500時(shí)變送器輸出04.9 V左右

38、的電壓。 A/D轉(zhuǎn)換器件的選擇主要取決于溫度的控制精度。本系統(tǒng)要求溫度控制誤差2,采用8位A/D轉(zhuǎn)換器,其最大量化誤差為=,完全能夠滿足精度要求。這里我們采用ADC0809作為A/D轉(zhuǎn)換器。電路設(shè)計(jì)好后,調(diào)整變送器的輸出,使 0500的溫度變化對(duì)應(yīng)于04.9 V的輸出,則A/D轉(zhuǎn)換對(duì)應(yīng)的數(shù)字量為00HFAH,即0250,則轉(zhuǎn)換結(jié)果乘以2正好是溫度值。用這種方法一方面可以減少標(biāo)度轉(zhuǎn)換的工作量,另一方面還可以避免標(biāo)度轉(zhuǎn)換帶來的計(jì)算誤差。 3) 溫度控制 電爐控制采用可控硅來實(shí)現(xiàn),雙向可控硅和電爐電阻絲串接在交流220 V市電回路中。單片機(jī)的P1.7口通過光電隔離器和驅(qū)動(dòng)電路送到可控硅的控制端,由P

39、1.7口的高低電平來控制可控硅的導(dǎo)通與斷開,從而控制電阻絲的通電加熱時(shí)間。 4) 人機(jī)對(duì)話 這部分包括鍵盤、顯示和報(bào)警三部分電路。 本系統(tǒng)設(shè)有3位LED數(shù)碼顯示器,停止加熱時(shí)顯示設(shè)定溫度,啟動(dòng)加熱時(shí)顯示當(dāng)前烤箱溫度。采用串行口擴(kuò)展的靜態(tài)顯示電路作為顯示接口電路。 為使系統(tǒng)簡(jiǎn)單緊湊,鍵盤只設(shè)置4個(gè)功能鍵,分別是啟動(dòng)、“百位+”、“十位+”和“個(gè)位+”鍵,由P1口低4位作為鍵盤接口。利用+1按鍵可以分別對(duì)預(yù)置溫度的百位、十位和個(gè)位進(jìn)行加1設(shè)置,并在LED上顯示當(dāng)前設(shè)置值。連續(xù)按動(dòng)相應(yīng)位的加1鍵即可實(shí)現(xiàn)0500的溫度設(shè)置。 報(bào)警功能由蜂鳴器實(shí)現(xiàn)。當(dāng)由于意外因素導(dǎo)致烤箱溫度高于設(shè)置溫度時(shí),P1.6口送

40、出的低電平經(jīng)反向器驅(qū)動(dòng)蜂鳴器鳴叫報(bào)警。 5) 其它可擴(kuò)展電路 對(duì)于要求更高的系統(tǒng),在現(xiàn)有電路的基礎(chǔ)上,讀者還可以視需要自行擴(kuò)展以下接口電路: (1) 實(shí)時(shí)時(shí)鐘電路:連接實(shí)時(shí)時(shí)鐘芯片DS12887可以獲得長(zhǎng)的采樣周期,顯示年、月、日、時(shí)、分、秒,而其片內(nèi)帶有的114 B非易失性RAM,可用來存入需長(zhǎng)期保存但有時(shí)也需變更的數(shù)據(jù)。如采樣周期、PID控制算法的系數(shù)KP、KI、KD等。 (2) “看門狗”電路:連接集成監(jiān)控芯片MAX705可實(shí)現(xiàn)對(duì)主電源VCC的監(jiān)控,提高系統(tǒng)的可靠性。 由于本書附帶的實(shí)驗(yàn)板已將P1口用排針引出,因此,讀者可以方便地用實(shí)驗(yàn)板來實(shí)現(xiàn)上述系統(tǒng)??稍赑1.6口外接蜂鳴器電路,在P

41、1.7口外接電爐驅(qū)動(dòng)控制電路,P1.0P1.3口外接4個(gè)功能按鍵(啟動(dòng)、+100、+10、+1)。 10.2.4 軟件設(shè)計(jì) 1. 工作流程 烤箱在上電復(fù)位后先處于停止加熱狀態(tài),這時(shí)可以用“+1”鍵設(shè)定預(yù)置溫度,顯示器顯示預(yù)定溫度;溫度設(shè)定好后就可以按啟動(dòng)鍵啟動(dòng)系統(tǒng)工作了。溫度檢測(cè)系統(tǒng)不斷定時(shí)檢測(cè)當(dāng)前溫度,并送往顯示器顯示,達(dá)到預(yù)定值后停止加熱并顯示當(dāng)前溫度;當(dāng)溫度下降到下限(比預(yù)定值低2)時(shí)再啟動(dòng)加熱。這樣不斷重復(fù)上述過程,使溫度保持在預(yù)定溫度范圍之內(nèi)。啟動(dòng)后不能再修改預(yù)置溫度,必須按復(fù)位/停止鍵回到停止加熱狀態(tài)再重新設(shè)定預(yù)置溫度。 2. 功能模塊 根據(jù)上面對(duì)工作流程的分析,系統(tǒng)軟件可以分為以

42、下幾個(gè)功能模塊: (1) 鍵盤管理:監(jiān)測(cè)鍵盤輸入,接收溫度預(yù)置,啟動(dòng)系統(tǒng)工作。 (2) 顯示:顯示設(shè)置溫度及當(dāng)前溫度。 (3) 溫度檢測(cè)及溫度值變換:完成A/D轉(zhuǎn)換及數(shù)字濾波。 (4) 溫度控制:根據(jù)檢測(cè)到的溫度控制電爐工作。 (5) 報(bào)警:當(dāng)預(yù)置溫度或當(dāng)前爐溫越限時(shí)報(bào)警。 3. 資源分配 為了便于閱讀程序,首先給出單片機(jī)資源分配情況。數(shù)據(jù)存儲(chǔ)器的分配與定義見表10.2。表10.2 溫度控制軟件數(shù)據(jù)存儲(chǔ)器分配表地址功能名稱初始化值50H51H當(dāng)前檢測(cè)溫度,高位在前TEMP1TEMP000H52H53H預(yù)置溫度,高位在前ST1ST000H54H56HBCD碼顯示緩沖區(qū),百位、十位、個(gè)位T100,

43、T10,T00H57H58H二進(jìn)制顯示緩沖區(qū),高位在前BT1,BT000H59H7FH堆棧區(qū)PSW.5報(bào)警允許標(biāo)志F0=0時(shí)禁止報(bào)警;F0=1時(shí)允許報(bào)警F00 程序存儲(chǔ)器:EPROM2764的地址范圍為0000H1FFFH I/O口:P1.0P1.3鍵盤輸入;P1.6、P1.7報(bào)警控制和電爐控制。 A/D轉(zhuǎn)換器0809:通道0通道7的地址為7FF8H7FFFH,使用通道0。 4. 功能軟件設(shè)計(jì) 1) 鍵盤管理模塊 上電或復(fù)位后系統(tǒng)處于鍵盤管理狀態(tài),其功能是監(jiān)測(cè)鍵盤輸入,接收溫度預(yù)置和啟動(dòng)鍵。程序設(shè)有預(yù)置溫度合法檢測(cè)報(bào)警,當(dāng)預(yù)置溫度超過500時(shí)會(huì)報(bào)警并將溫度設(shè)定在500。鍵盤管理子程序流程圖如圖

44、10.12所示。 圖10.12 鍵盤管理子程序流程圖鍵盤管理子程序KIN: KIN:ACAL CHK ;預(yù)置溫度合法性檢測(cè) MOV BT1,ST1 MOVBT0,ST0 ;預(yù)置溫度送顯示緩沖區(qū) LCALLDISP ;顯示預(yù)置溫度KIN0: ACALLKEY ;讀鍵值 JZKIN0 ;無鍵閉合和重新檢測(cè) ACALL DISP ACALLDISP ;二次調(diào)用顯示子程序延時(shí)去抖 ACALLKEY;再檢測(cè)有無鍵按下 JZKIN0;無鍵按下重新檢測(cè) JBACC.1,S10 MOVA,#100;百位鍵按下 AJMP SUMS10:JB ACC.2,S1 MOVA,#10;十位鍵按下 AJMPSUM S1:

45、JBACC.3,S0MOVA,#01;個(gè)位鍵按下 SUM:ADDA,ST0;預(yù)置溫度按鍵+1MOVST0,AMOVA,#00H ADDCA,ST1MOVST1,AKIN1: ACALL KEY;判斷閉合鍵釋放 JNZKIN1;未釋放繼續(xù)判斷 AJMPKIN;閉合鍵釋放繼續(xù)掃描鍵盤 S0: JNB ACC.0,KIN;無鍵按下重新掃描鍵盤 RET;啟動(dòng)鍵按下返回 KEY: MOVA,P1;讀鍵值子程序 CPLA ANLA,#0FH RET 預(yù)置溫度合法性檢測(cè)子程序CHK(用雙字節(jié)減法比較預(yù)置溫度是否大于500(01F4H): CHK:MOVA,#0F4H;預(yù)置溫度上限低8位送ACLRCSUBBA

46、,ST0;低8位減,借位送CYMOVA,#01H;預(yù)置溫度上限高8位送ASUBBA,ST1;高8位帶借位減JC OUTA ;預(yù)置溫度越界,轉(zhuǎn)報(bào)警MOVA,#00H;預(yù)置溫度合法標(biāo)志RET OUTA:MOVST1,#01H;將500寫入預(yù)置溫度數(shù)據(jù)區(qū)MOVST0,#0F4HCLRP1.6;發(fā)報(bào)警信號(hào)0.6 sACALLD0.6s SETBP1.6;停止報(bào)警RET 2) 顯示模塊 顯示子程序的功能是將顯示緩沖區(qū)57H和58H的二進(jìn)制數(shù)據(jù)先轉(zhuǎn)換成三個(gè)BCD碼,分別存入百位、十位和個(gè)位顯示緩沖區(qū)(54H、55H和56H單元),然后通過串口送出顯示。顯示子程序DISP: DISP:ACALL HTB ;

47、將顯示數(shù)據(jù)轉(zhuǎn)換為BCD碼 MOV SCON,#00H ;置串行口為方式0 MOV R2,#03H ;顯示位數(shù)送R2 MOV R0,#T100 ;顯示緩沖區(qū)首地址送R0 LD: MOV DPTR,#TAB ;指向字型碼表首地址 MOV A,R0 ;取顯示數(shù)據(jù) MOVC A,A+DPTR;查表 MOVSBUF,A;字型碼送串行口WAIT:JBC TI,NEXT;發(fā)送結(jié)束轉(zhuǎn)下一個(gè)數(shù)據(jù)并清中斷標(biāo)志 SJMP WAIT;發(fā)送未完等待NEXT: INCR0 ;修改顯示緩沖區(qū)指針 DJNZR2,LD;判3位顯示完否,未完繼續(xù)RET TAB:;字型碼表(略) BCD碼轉(zhuǎn)換子程序HTB: HTB:MOVA,BT

48、0;取二進(jìn)制顯示數(shù)據(jù)低8位MOVB,#100 ;除100,確定百位數(shù)DIVABMOVT100,A;百位數(shù)送54H單元MOVA,#10;除10,確定十位 XCH A,B DIV A,B MOV T10,A ;十位數(shù)送55H單元 MOVT,B ;個(gè)位數(shù)送56H單元 MOVA,BT1 ;取二進(jìn)制顯示數(shù)據(jù)高8位 JNZ LH1 ;高位不為0轉(zhuǎn)LH1繼續(xù)高8位轉(zhuǎn)換 RET ;高位為0結(jié)束,返回LH1:MOVA,#06H ;高位不為0,低位轉(zhuǎn)換結(jié)果加256(因?yàn)闇囟葦?shù)據(jù)不會(huì) ;大于500,所以高8位最多為01H,即256) ADDA,T DAA;個(gè)位加6(十進(jìn)制加) MOVT,A;結(jié)果送回個(gè)位 MOVA,

49、#05H ADDCA,T10 DAA;十位加5(十進(jìn)制加) MOVT10,A;結(jié)果送回十位 MOVA,#02H ADDCA,T100 DA A ;百位加2(十進(jìn)制加) MOVT100,A;結(jié)果送回百位RET 3) 溫度檢測(cè)模塊 A/D轉(zhuǎn)換采用查詢方式。為提高數(shù)據(jù)采樣的可靠性,對(duì)采樣溫度進(jìn)行數(shù)字濾波。數(shù)字濾波的算法很多,這里采用4次采樣取平均值的方法。如前所述,本系統(tǒng)A/D轉(zhuǎn)換結(jié)果乘2正好是溫度值,因此,4次采樣的數(shù)字量之和除以2就是檢測(cè)的當(dāng)前溫度。檢測(cè)結(jié)果高位存入50H,低位存入51H。溫度檢測(cè)子程序流程圖如圖10.13所示。 溫度檢測(cè)子程序TIN:圖10.13 溫度檢測(cè)子程序流程圖 溫度檢測(cè)

50、子程序TIN:TIN: MOV TEMP1,#00H ;清檢測(cè)溫度緩沖區(qū) MOV TEMP0,#00H MOV R2,#04H ;取樣次數(shù)送R2 MOV DPTR,#7FF8H ;指向A/D轉(zhuǎn)換器0通道 LTIN1: MOVX DPTR,A ;啟動(dòng)轉(zhuǎn)換HERE:JNB IE1,HERE ;等待轉(zhuǎn)換結(jié)束 MOVX A,DPTR ;讀轉(zhuǎn)換結(jié)果 ADDA,TEMP0;累加(雙字節(jié)加法)MOVTEMP0,AMOVA,#00HADDCA,TEMP1MOVTEMP1,ADJNZR2,LTIN1;4次采樣完否,未完繼續(xù)CLR C ;累加結(jié)果除2(雙字節(jié)除法)MOVA,TEMP1 RRCAMOVTEMP1,A

51、MOVA,TEMP0 RRCAMOVTEMP0,ARET 4) 溫度控制模塊 將當(dāng)前溫度與預(yù)置溫度比較,當(dāng)前溫度小于預(yù)置溫度時(shí),繼電器閉合,接通電阻絲加熱;當(dāng)前溫度大于預(yù)置溫度時(shí),繼電器斷開,停止加熱;當(dāng)二者相等時(shí)電爐保持原來狀態(tài);當(dāng)前溫度降低到比預(yù)置溫度低2時(shí),再重新啟動(dòng)加熱;當(dāng)前溫度超出報(bào)警上下限時(shí)將啟動(dòng)報(bào)警,并停止加熱。由于電爐開始加熱時(shí),當(dāng)前溫度可能低于報(bào)警下限,為了防止誤報(bào),在未達(dá)到預(yù)置溫度時(shí),不允許報(bào)警,為此設(shè)置了報(bào)警允許標(biāo)志F0。模塊流程見圖10.14。圖10.14 溫度控制流程圖 溫度控制子程序CONT: CONT:MOVA,TEMP0;當(dāng)前溫度-預(yù)置溫度(雙字節(jié)減)CLRCS

52、UBBA,ST0MOVB,A;低8位相減的差值暫存BMOVA,TEMP1SUBBA,ST1 JNCLOFF ;無借位,表示當(dāng)前溫度預(yù)置溫度,轉(zhuǎn)LOFF JNBF0,LON ;當(dāng)前溫度預(yù)置溫度,判是否達(dá)到過預(yù)置溫度 MOVA,B ;若達(dá)到過預(yù)置溫度,判二者差值是否大于2 CLRC SUBBA,#02H JNC ACC.7,LOFF ;差值不大于2,轉(zhuǎn)LOFFLON:CLR P1.7 ;開電爐 SJMPEXIT ;返回LOFF:SETBF0;設(shè)置允許報(bào)警標(biāo)志SETBP1.7;關(guān)電爐EXIT:RET 在此,讀者也可自行加入PID算法程序來實(shí)現(xiàn)PID控制。 5) 溫度越限報(bào)警模塊 報(bào)警上限溫度值為預(yù)置

53、溫度+5,即當(dāng)前溫度上升到高于預(yù)置溫度+5時(shí)報(bào)警,并停止加熱;報(bào)警下限溫度值為預(yù)置溫度-5,即在當(dāng)前溫度下降到低于預(yù)置溫度-5,且報(bào)警允許時(shí)報(bào)警,這是為了防止開始從較低溫度加溫時(shí)誤報(bào)警。報(bào)警的同時(shí)也關(guān)閉電爐。圖10.15為報(bào)警子程序流程圖。圖10.15 報(bào)警子程序流程圖 報(bào)警子程序ALARMALARM:MOVA,TEMP0;當(dāng)前溫度低字節(jié)ACLRCSUBBA,ST0;(當(dāng)前溫度低字節(jié)-預(yù)置溫度低字節(jié))AMOVB,A ;低字節(jié)相減結(jié)果送B暫存MOVA,TEMP1 ;當(dāng)前溫度高字節(jié)ASUBBA,ST1 ;(當(dāng)前溫度高字節(jié)-預(yù)置溫度高字節(jié))A JC LA0 ;有借位,當(dāng)前溫度小于預(yù)置溫度轉(zhuǎn)LA0 S

54、ETB F0 ;當(dāng)前溫度預(yù)置溫度,允許報(bào)警 AJMP LA1LA0: MOV A,ST0 ;預(yù)置溫度低字節(jié)A CLR CSUBB A,TEMP0;(預(yù)置溫度低字節(jié)-當(dāng)前溫度低字節(jié))A MOV B,A ;低字節(jié)相減結(jié)果送B暫存 MOV A,ST1 ;預(yù)置溫度高字節(jié)A SUBB A,TEMP1;(預(yù)置溫度高字節(jié)-當(dāng)前溫度高字節(jié))A LA1:XCH A,B ;高低字節(jié)互換,判斷相減結(jié)果是否大于5 CLRC SUBBA,#05H;(低字節(jié)差-5)A XCHA,B;(低字節(jié)差-5)B,高字節(jié)差A(yù) SUBBA,#00H;(高字節(jié)差-0)A(因?yàn)?的高字節(jié)為0) JCLA2;相減結(jié)果小于5,不報(bào)警返回 JN

55、BF0,LA2;相減結(jié)果5,判是否允許報(bào)警,不允許則返回 CLRP1.6;啟動(dòng)報(bào)警SETBP1.7;關(guān)電爐LCALLD0.6s;報(bào)警延時(shí)0.6 sSETBP1.6;關(guān)報(bào)警LA2:RETD0.6s:(略);延時(shí)0.6 s子程序 6) 主程序和中斷服務(wù)子程序 主程序采用中斷嵌套方式設(shè)計(jì),各功能模塊可直接調(diào)用。主程序完成系統(tǒng)的初始化,溫度預(yù)置及其合法性檢測(cè),預(yù)置溫度的顯示及定時(shí)器0設(shè)置。定時(shí)器0中斷服務(wù)子程序是溫度控制體系的主體,用于溫度檢測(cè)、控制和報(bào)警(包括啟動(dòng)A/D轉(zhuǎn)換、讀入采樣數(shù)據(jù)、數(shù)字濾波、越限溫度報(bào)警和越限處理、輸出可控硅的控制脈沖等)。中斷由定時(shí)器0產(chǎn)生,根據(jù)需要每隔15 s中斷一次,即

56、每15 s采樣控制一次。但系統(tǒng)采用6 MHz晶振,最大定時(shí)為130 ms,為實(shí)現(xiàn)15 s定時(shí),這里另行設(shè)了一個(gè)軟件計(jì)數(shù)器。主程序和中斷服務(wù)子程序的流程圖如圖10.16所示。圖10.16 系統(tǒng)程序總體結(jié)構(gòu)框圖主程序MAIN :(數(shù)據(jù)緩沖區(qū)的定義和初始化部分從略) ORG0000H AJMPMAIN ORG000BH AJMPPT0 ORG0030H MAIN: MOVSP,#59H;設(shè)定堆棧指針 MOV TMOD,#01H;定時(shí)器0初始化 MOVTL0,#0B0H ;定時(shí)器定時(shí)時(shí)間100 ms MOVTH0,#3CH MOVR7,#150;置15 s軟計(jì)數(shù)器初值A(chǔ)CALLKIN;調(diào)鍵盤管理子程序

57、SETBET0;允許定時(shí)器0中斷SETBEA;開中斷SETBTR0;啟動(dòng)定時(shí)器0SJMP$ 定時(shí)器0中斷服務(wù)子程序PT0: PT0:MOVTL0,#0B0HMOVTH0,#3CH ;重置定時(shí)器0初值DJNZR7,BACK ;15 s到否,不到返回MOVR7,#150 ;重置軟計(jì)數(shù)器初值A(chǔ)CALLTIN ;溫度檢測(cè) MOVBT1,TEMP1 ;當(dāng)前溫度送顯示緩沖區(qū)MOVBT0,TEMP0 ACALL DISP ;顯示當(dāng)前溫度ACALL CONT ;溫度控制LCALL ALARM ;溫度越限報(bào)警 BACK:RETI10.3 單片機(jī)應(yīng)用系統(tǒng)開發(fā)的一般方法 10.3.1 確定任務(wù) 單片機(jī)應(yīng)用系統(tǒng)的開發(fā)

58、過程是以確定系統(tǒng)的功能和技術(shù)指標(biāo)開始的。首先要細(xì)致分析、研究實(shí)際問題,明確各項(xiàng)任務(wù)與要求,綜合考慮系統(tǒng)的先進(jìn)性、可靠性、可維護(hù)性以及成本、經(jīng)濟(jì)效益,擬訂出合理可行的技術(shù)性能指標(biāo)。 10.3.2 總體設(shè)計(jì) 在對(duì)應(yīng)用系統(tǒng)進(jìn)行總體設(shè)計(jì)時(shí),應(yīng)根據(jù)應(yīng)用系統(tǒng)提出的各項(xiàng)技術(shù)性能指標(biāo),擬訂出性價(jià)比最高的一套方案。首先,應(yīng)根據(jù)任務(wù)的繁雜程度和技術(shù)指標(biāo)要求選擇機(jī)型。選定機(jī)型后,再選擇系統(tǒng)中要用到的其它外圍元器件,如傳感器、執(zhí)行器件等。 在總體方案設(shè)計(jì)過程中,對(duì)軟件和硬件進(jìn)行分工是一個(gè)首要的環(huán)節(jié)。原則上,能夠由軟件來完成的任務(wù)就盡可能用軟件來實(shí)現(xiàn),以降低硬件成本,簡(jiǎn)化硬件結(jié)構(gòu)。同時(shí),還要求大致規(guī)定各接口電路的地址、

59、軟件的結(jié)構(gòu)和功能、上下位機(jī)的通信協(xié)議、程序的駐留區(qū)域及工作緩沖區(qū)等。總體方案一旦確定,系統(tǒng)的大致規(guī)模及軟件的基本框架就確定了。 10.3.3 硬件設(shè)計(jì) 硬件設(shè)計(jì)是指應(yīng)用系統(tǒng)的電路設(shè)計(jì),包括主機(jī)、控制電路、存儲(chǔ)器、I/O接口、A/D和D/A轉(zhuǎn)換電路等。硬件設(shè)計(jì)時(shí),應(yīng)考慮留有充分余量,電路設(shè)計(jì)力求正確無誤,因?yàn)樵谙到y(tǒng)調(diào)試中不易修改硬件結(jié)構(gòu)。下面討論MCS-51單片機(jī)應(yīng)用系統(tǒng)硬件電路設(shè)計(jì)時(shí)應(yīng)注意的幾個(gè)問題。 1. 程序存儲(chǔ)器 一般可選用容量較大的EPROM芯片,如2764(8 KB)、27128(16 KB)或27256(32 KB)等。盡量避免用小容量的芯片組合擴(kuò)充成大容量的存儲(chǔ)器。程序存儲(chǔ)器容量

60、大些,則編程空間寬裕些,價(jià)格相差也不會(huì)太多。 2. 數(shù)據(jù)存儲(chǔ)器和I/O接口 根據(jù)系統(tǒng)功能的要求,如果需要擴(kuò)展外部RAM或I/O口,那么RAM芯片可選用6116(2 KB)、6264(8 KB)或62256(32 KB),原則上應(yīng)盡量減少芯片數(shù)量,使譯碼電路簡(jiǎn)單。I/O接口芯片一般選用8155(帶有256 KB靜態(tài)RAM)或8255。這類芯片具有口線多、硬件邏輯簡(jiǎn)單等特點(diǎn)。若口線要求很少,且僅需要簡(jiǎn)單的輸入或輸出功能,則可用不可編程的TTL電路或CMOS電路。 A/D和D/A電路芯片主要根據(jù)精度、速度和價(jià)格等來選用,同時(shí)還要考慮與系統(tǒng)的連接是否方便。 3. 地址譯碼電路 通常采用全譯碼、部分譯碼

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論