《單片機(jī)應(yīng)用實(shí)例開發(fā)》課件第11章_第1頁(yè)
《單片機(jī)應(yīng)用實(shí)例開發(fā)》課件第11章_第2頁(yè)
《單片機(jī)應(yīng)用實(shí)例開發(fā)》課件第11章_第3頁(yè)
《單片機(jī)應(yīng)用實(shí)例開發(fā)》課件第11章_第4頁(yè)
《單片機(jī)應(yīng)用實(shí)例開發(fā)》課件第11章_第5頁(yè)
已閱讀5頁(yè),還剩281頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

11.1液晶顯示萬(wàn)年歷的設(shè)計(jì)

11.2數(shù)字心率計(jì)的設(shè)計(jì)

11.3數(shù)字溫度計(jì)的設(shè)計(jì)

實(shí)例十一單片機(jī)應(yīng)用系統(tǒng)實(shí)例11.1液晶顯示萬(wàn)年歷的設(shè)計(jì)11.1.1背景知識(shí)

1.萬(wàn)年歷概述什么是萬(wàn)年歷呢?萬(wàn)年歷是編排年、月、日、節(jié)氣等內(nèi)容供人們查詢的工具書,就是記錄了一定時(shí)間范圍內(nèi)(比如100年或更多)的具體陽(yáng)歷與陰歷的日期的年歷。約公元前1450年,在定陽(yáng)山下住著一位以砍柴采藥為生的樵夫叫做萬(wàn)年,他平時(shí)對(duì)歷法及節(jié)令比較感興趣,從平時(shí)的生活中得到啟發(fā),做了一個(gè)利用漏水的方法來計(jì)時(shí)的五層漏壺。這樣,不管天氣如何都可以正確地掌握時(shí)間。有了計(jì)時(shí)的工具,萬(wàn)年更加用心地觀察天時(shí)節(jié)令的變化。經(jīng)過長(zhǎng)期的歸納,他發(fā)現(xiàn)每隔三百六十多天,天時(shí)的長(zhǎng)短就會(huì)重復(fù)一次。只要搞清楚日月運(yùn)行的規(guī)律,就不用擔(dān)心節(jié)令不準(zhǔn)了。萬(wàn)年將他研究了數(shù)十載的成果——太陽(yáng)歷獻(xiàn)給天子祖乙時(shí),已是個(gè)白發(fā)蒼蒼的老人了。祖乙深受感動(dòng),就把太陽(yáng)歷定名為“萬(wàn)年歷”,并封萬(wàn)年為“日月壽星”。隨著時(shí)代的進(jìn)步,萬(wàn)年歷一直延續(xù)發(fā)展至今,世人為了使用方便,設(shè)計(jì)了各種各樣實(shí)用的萬(wàn)年歷,以便于人們使用及攜帶,并且在原來的基礎(chǔ)上增加了許多其他的功能?,F(xiàn)在大多數(shù)人用的是電子萬(wàn)年歷。

2.16×2字符型液晶顯示器的認(rèn)識(shí)

液晶顯示器以其功耗小、體積小、顯示內(nèi)容豐富、超薄輕巧等諸多優(yōu)點(diǎn)在袖珍式儀表和低功耗應(yīng)用系統(tǒng)中得到了越來越廣泛的應(yīng)用。

這里介紹的字符型液晶模塊是一種用5×7點(diǎn)陣圖形來顯示字符的液晶顯示器,根據(jù)顯示的容量可以分為1行16個(gè)字、2行16個(gè)字、2行20個(gè)字等。下面以長(zhǎng)沙太陽(yáng)人公司的2行16個(gè)字的1602液晶模塊為例進(jìn)行介紹。

1)主要技術(shù)參數(shù)

1602液晶模塊的主要技術(shù)參數(shù)如表11-1所示。

2)引腳符號(hào)及說明

長(zhǎng)沙太陽(yáng)人公司的1602液晶模塊總共有16引腳,各引腳符號(hào)及說明如表11-2所示。

3)控制器接口說明(HD44780及兼容芯片)

(1)基本操作時(shí)序如下:

?讀狀態(tài):

輸入:RS=L,R/W=H,E=H。

輸出:D0~D7=狀態(tài)字。

?寫指令:

輸入:RS=L,R/W=L,D0~D7=指令碼,E=高脈沖。

輸出:無(wú)。

?讀數(shù)據(jù):

輸入:RS=H,R/W=H,E=H。

輸出:D0~D7=數(shù)據(jù)。

?寫數(shù)據(jù):

輸入:RS=H,R/W=L,D0~D7=數(shù)據(jù),E=高脈沖。

輸出:無(wú)。

(2)狀態(tài)字說明如圖11-1所示。

圖11-1中,STA0~STA6是當(dāng)前數(shù)據(jù)地址指針的數(shù)值;STA7是讀/寫操作使能,1為禁止,0為允許。

注意:每次對(duì)控制器進(jìn)行讀/寫操作之前,都必須進(jìn)行讀/寫檢測(cè),確保STA7為0。圖11-1狀態(tài)字

(3)?RAM地址映射圖??刂破鲀?nèi)部帶有80?×?8位(80字節(jié))的RAM緩沖區(qū),其對(duì)應(yīng)關(guān)系如圖11-2所示。圖11-2RAM地址映射圖

(4)指令說明。

①初始化設(shè)置。

?顯示模式設(shè)置如表11-3所示。

?顯示開/關(guān)及光標(biāo)設(shè)置如表11-4所示。②數(shù)據(jù)控制??刂破鲀?nèi)部設(shè)有一個(gè)數(shù)據(jù)地址指針,用戶可通過它們來訪問內(nèi)部的全部80字節(jié)RAM。

?數(shù)據(jù)指針設(shè)置如表11-5所示。

?讀數(shù)據(jù):見“控制器接口說明(HD44780及兼容芯片)”中的“基本操作時(shí)序”。

?寫數(shù)據(jù):見“控制器接口說明(HD44780及兼容芯片)”中的“基本操作時(shí)序”。

?其他設(shè)置見表11-6。

(5)初始化過程(復(fù)位過程)。

①延時(shí)15ms→寫指令38H(不檢測(cè)忙信號(hào))→延時(shí)5ms→寫指令38H(不檢測(cè)忙信號(hào))→延時(shí)5ms→寫指令38H(不檢測(cè)忙信號(hào))。

注意:以后每次寫指令、讀/寫數(shù)據(jù)操作之前均需檢測(cè)忙信號(hào)。

②寫指令38H(顯示模式設(shè)置)→寫指令08H(顯示關(guān)閉)→寫指令01H(顯示清屏)→寫指令06H(顯示光標(biāo)移動(dòng)設(shè)置)→寫指令0CH(顯示開及光標(biāo)設(shè)置)。

4)?SMC1602A參考連接

(1)?8051系列總線方式如圖11-3所示。圖11-38051系列總線方式

(2)?8051系列模擬接口方式如圖11-4所示。圖11-48051系列模擬接口方式

5)控制器接口時(shí)序說明(HD44780及兼容芯片)

(1)讀操作時(shí)序如圖11-5所示。圖11-5讀操作時(shí)序

(2)寫操作時(shí)序如圖11-6所示。圖11-6寫操作時(shí)序

(3)時(shí)序圖中各時(shí)序參數(shù)說明如表11-7所示。11.1.2設(shè)計(jì)任務(wù)及分析

1.設(shè)計(jì)任務(wù)

本實(shí)例要實(shí)現(xiàn)以下功能:

(1)顯示日期和時(shí)間;

(2)具有校時(shí)功能,即可以調(diào)整時(shí)間和日期;

(3)具有省電工作模式,即不顯示時(shí)鐘,但是計(jì)時(shí)工作仍然進(jìn)行;

(4)具有整點(diǎn)報(bào)時(shí)功能和鬧鐘功能。

2.設(shè)計(jì)方案

根據(jù)設(shè)計(jì)任務(wù)的要求,我們可以考慮采用如圖11-7所示的設(shè)計(jì)框架。本設(shè)計(jì)任務(wù)要求具有校時(shí)功能和鬧鐘功能,顯然在設(shè)計(jì)過程中需考慮由按鍵的輸入來實(shí)現(xiàn);要求能顯示日期和時(shí)間,顯然在設(shè)計(jì)過程中需考慮有顯示器;要求有整點(diǎn)報(bào)時(shí)功能和鬧鐘功能,顯然在設(shè)計(jì)過程中需考慮有聲響電路。

(1)按鍵輸入設(shè)計(jì)。根據(jù)設(shè)計(jì)要求在按鍵輸入設(shè)計(jì)模塊可以采用矩陣式鍵盤和獨(dú)立式按鍵兩種方案??紤]到矩陣式鍵盤一般適于硬件資源需求比較大,單片機(jī)I/O口數(shù)量有限的情況,況且要完成本設(shè)計(jì)要求,只設(shè)置五個(gè)按鍵就可以完成,所以選擇獨(dú)立式按鍵控制的方案。圖11-7系統(tǒng)設(shè)計(jì)框圖

(2)萬(wàn)年歷顯示設(shè)計(jì)。在單片機(jī)應(yīng)用系統(tǒng)中,顯示器通常有數(shù)碼管和液晶模塊兩種。采用數(shù)碼管顯示成本低,軟件設(shè)計(jì)簡(jiǎn)單,但硬件設(shè)計(jì)較復(fù)雜,且占用單片機(jī)I/O口資源較多;采用液晶模塊顯示成本較高,硬件設(shè)計(jì)簡(jiǎn)單,但軟件設(shè)計(jì)較復(fù)雜。在本次的設(shè)計(jì)中采用液晶顯示,這樣在顯示日期、時(shí)間時(shí)可以用一些符號(hào)來美化界面,而且縮小了產(chǎn)品的體積。

(3)聲響電路設(shè)計(jì)。根據(jù)設(shè)計(jì)要求需要報(bào)時(shí)及鬧鈴聲響,考慮產(chǎn)品的實(shí)用性及設(shè)計(jì)成本,于是采用較簡(jiǎn)單的無(wú)源蜂鳴器發(fā)聲電路來實(shí)現(xiàn)。

(4)電源設(shè)計(jì)。由于本設(shè)計(jì)要求所需元件的工作電壓都是?+5V,所以,電源設(shè)計(jì)直接采用能輸出?+5V的開關(guān)電源。11.1.3設(shè)計(jì)與制作

1.萬(wàn)年歷的基本結(jié)構(gòu)

用STC89C51來控制液晶顯示器,顯示設(shè)計(jì)要求的內(nèi)容。通過五個(gè)獨(dú)立按鍵來修改要顯示的內(nèi)容,實(shí)現(xiàn)時(shí)間及日期的修改,其設(shè)計(jì)框圖如圖11-8所示。

2.萬(wàn)年歷的硬件設(shè)計(jì)

萬(wàn)年歷的完整設(shè)計(jì)電路如圖11-9所示。若考慮燒寫程序方便,則讀者可以自行將串口下載電路加上。圖11-8設(shè)計(jì)框圖圖11-9系統(tǒng)設(shè)計(jì)電路圖單片機(jī)的管腳分配如表11-8所示。按鍵輸入電路設(shè)計(jì)采用獨(dú)立式,按鍵功能對(duì)照表如表11-9所示。液晶顯示電路設(shè)計(jì)采用模擬口線方式。液晶顯示器引腳及單片機(jī)I/O口對(duì)照表如表11-10所示。聲響電路設(shè)計(jì)為兩個(gè)發(fā)光二極管和一個(gè)蜂鳴器,用于整點(diǎn)的聲光報(bào)時(shí)和鬧鐘的聲光報(bào)警,蜂鳴器用三極管9012驅(qū)動(dòng)。

3.萬(wàn)年歷的軟件設(shè)計(jì)

1)設(shè)計(jì)思路

程序設(shè)計(jì)采用模塊化設(shè)計(jì)方法,包括主程序模塊、鍵盤模塊、顯示模塊、鬧鐘模塊、報(bào)時(shí)模塊和顯示開關(guān)控制模塊等,通過主程序按照一定順序調(diào)用各功能模塊來實(shí)現(xiàn)系統(tǒng)要求。在程序運(yùn)行后若開啟關(guān)閉顯示器功能,則定時(shí)器仍繼續(xù)工作。

2)操作說明

液晶顯示萬(wàn)年歷仿真圖如圖11-10所示。萬(wàn)年歷的操作說明如下所述。圖11-10液晶顯示萬(wàn)年歷仿真圖

(1)校時(shí)設(shè)置操作。

①不在鬧鐘模式下,即顯示器上未顯示“&”圖標(biāo)時(shí),按下“位選控制按鈕”,進(jìn)入校時(shí)設(shè)置狀態(tài),此時(shí)光標(biāo)閃爍。

②“位選控制按鈕”每按下一次,光標(biāo)向右移動(dòng)一個(gè)位置閃爍。當(dāng)移到最后一個(gè)數(shù)值時(shí),若再按下“位選控制按鈕”,則光標(biāo)回到第一個(gè)數(shù)值位置。

③每次按下“加1控制按鈕”,光標(biāo)閃爍位置的數(shù)據(jù)加1,當(dāng)該位數(shù)據(jù)加到最大時(shí)回零。例如,分鐘的個(gè)位數(shù)據(jù)為當(dāng)前調(diào)整位,當(dāng)其值為“9”時(shí),再按一次“加1控制按鈕”,該位顯示“0”。

④設(shè)置完畢后,按下“返回和報(bào)時(shí)控制按鈕”,回到正常計(jì)時(shí)狀態(tài)。

(2)鬧鐘設(shè)置操作。

①在鬧鐘模式下,即顯示器上顯示“&”圖標(biāo)時(shí),按下“位選控制按鈕”,進(jìn)入鬧鐘設(shè)置狀態(tài),此時(shí)光標(biāo)閃爍,且鬧鐘設(shè)置只對(duì)小時(shí)和分鐘設(shè)置。

②“位選控制按鈕”每按下一次,光標(biāo)向右移動(dòng)一個(gè)位置閃爍,當(dāng)移到最后一個(gè)數(shù)值時(shí),若再按下“位選控制按鈕”,則光標(biāo)回到第一個(gè)數(shù)值位置。

③每次按下“加1控制按鈕”,光標(biāo)閃爍位置的數(shù)據(jù)加1,當(dāng)該位數(shù)據(jù)加到最大時(shí)回零。例如,分鐘的個(gè)位數(shù)據(jù)為當(dāng)前調(diào)整位,當(dāng)其值為“9”時(shí),再按一次“加1控制按鈕”,該位顯示“0”。

④設(shè)置完畢后按下“返回和報(bào)時(shí)控制按鈕”,回到正常計(jì)時(shí)狀態(tài)。

(3)顯示操作。

①按下“顯示器控制按鈕”可以進(jìn)行顯示時(shí)間和不顯示時(shí)間選擇。

②時(shí)間的標(biāo)識(shí)為TIME,日期的標(biāo)識(shí)為DATE,用“:”分隔時(shí)間的時(shí)、分、秒,用“-”分隔日期的年、月、日,用“&”表示鬧鐘開啟標(biāo)志,用“%”表示整點(diǎn)報(bào)時(shí)開啟標(biāo)志。

(4)鬧鐘操作。

①按下“鬧鐘控制按鈕”進(jìn)行鬧鐘模式和非鬧鐘模式選擇,若為鬧鐘模式,則顯示器顯示“&”圖標(biāo),否則不顯示。

②在鬧鐘模式下,若當(dāng)前時(shí)間與所設(shè)置的鬧鐘時(shí)刻一致,則鬧鐘指示燈(D2)亮,同時(shí)響起蜂鳴聲。

(5)報(bào)時(shí)操作。

①按下“返回和報(bào)時(shí)控制按鈕”進(jìn)行整點(diǎn)報(bào)時(shí)模式和非整點(diǎn)報(bào)時(shí)模式選擇,若為整點(diǎn)報(bào)時(shí)模式,則顯示器顯示“%”圖標(biāo),否則不顯示。

②整點(diǎn)報(bào)時(shí)模式下,若當(dāng)前時(shí)間為整點(diǎn),則整點(diǎn)指示燈(D1)亮,同時(shí)響起蜂鳴聲。

3)程序設(shè)計(jì)

(1)主程序。軟件設(shè)計(jì)采用模塊式設(shè)計(jì)方法,總程序通過調(diào)用相應(yīng)的功能模塊來實(shí)現(xiàn)軟件的功能。主程序流程圖如圖11-11所示。圖11-11主程序流程圖

(2)液晶初始化程序。根據(jù)前面液晶顯示器的資料顯示,在液晶顯示器工作之前必須先進(jìn)行初始化,通常我們把它放在程序的開始部分,只有經(jīng)過初始化之后液晶才能正常工作,并可以根據(jù)要求進(jìn)行相關(guān)設(shè)置,具體流程如圖11-12所示。圖11-12液晶初始化

(3)液晶初始狀態(tài)程序。液晶顯示初始狀態(tài)的格式如圖11-13所示。液晶初始狀態(tài)程序流程圖如圖11-14所示。這部分程序?qū)崿F(xiàn)了根據(jù)設(shè)計(jì)要求在液晶顯示器的特定位置顯示設(shè)定好的字符。在顯示器上設(shè)置了“TIME”和“DATE”作為區(qū)別時(shí)間和日期的字母,用“:”和“-”分別間隔時(shí)間和日期,通過程序直接送它們的ASCII碼3AH和2DH給液晶顯示器。圖11-13液晶顯示初始狀態(tài)的格式圖11-14液晶初始狀態(tài)程序流程圖

(4)鍵盤程序。鍵盤程序流程圖如圖11-15所示。當(dāng)相應(yīng)的按鍵按下后程序就會(huì)執(zhí)行對(duì)應(yīng)的操作,系統(tǒng)會(huì)根據(jù)鬧鐘是否開啟自動(dòng)判斷是校準(zhǔn)時(shí)間還是設(shè)置鬧鐘定時(shí)時(shí)間。在鬧鐘未開啟的情況下,當(dāng)位選按鍵按下后就會(huì)進(jìn)入時(shí)間調(diào)整并實(shí)現(xiàn)位置改變;當(dāng)加1按鍵按下后就會(huì)實(shí)現(xiàn)加1。在程序中設(shè)定好了校準(zhǔn)范圍,時(shí)的十位不會(huì)超過3,即在2加1后就會(huì)變成0,在分的十位5加1后就會(huì)變成0,日期也進(jìn)行同樣的范圍限定,這樣就使我們?cè)谡{(diào)整時(shí)間時(shí)變得很方便。在按下返回鍵后退出時(shí)間調(diào)整功能。圖11-15鍵盤程序

(5)顯示程序。顯示格式如圖11-16所示,液晶顯示程序流程圖如圖11-17所示。這部分程序的任務(wù)是將更新的數(shù)據(jù)顯示出來。時(shí)間的標(biāo)識(shí)為TIME,日期的標(biāo)識(shí)為DATE,用“:”分隔時(shí)間的時(shí)、分、秒,用“-”分隔日期的年、月、日,用“&”表示鬧鐘開啟標(biāo)志,用“%”表示整點(diǎn)報(bào)時(shí)開啟標(biāo)志。圖11-16顯示格式圖11-17顯示程序流程圖

(6)鬧鐘開關(guān)程序。這部分程序用來控制鬧鐘功能的開啟和關(guān)閉。這部分程序中設(shè)置了一個(gè)標(biāo)志位,每按一下鬧鐘控制按鍵,程序就會(huì)取反標(biāo)志位,程序根據(jù)標(biāo)志位的情況判斷是否開啟鬧鐘功能并在液晶顯示器上顯示和清除鬧鐘開啟的標(biāo)志。程序流程圖如圖11-18所示。

(7)鬧鐘比較程序。這部分程序用來判斷當(dāng)前系統(tǒng)的時(shí)間和設(shè)定的鬧鐘時(shí)間是否相等。當(dāng)系統(tǒng)的時(shí)間和設(shè)定的時(shí)間相等時(shí),鬧鐘就會(huì)開始響鈴直到手動(dòng)關(guān)閉鬧鐘。這部分程序流程圖如圖11-19所示。圖11-18鬧鐘開關(guān)程序流程圖圖11-19鬧鐘比較程序流程圖

(8)報(bào)時(shí)開關(guān)程序。這部分程序用來控制報(bào)時(shí)功能的開啟和關(guān)閉。這部分程序中設(shè)置了一個(gè)標(biāo)志位,按一下按鈕標(biāo)志位就會(huì)取反一次,程序會(huì)根據(jù)標(biāo)志位的狀態(tài)判斷是否開啟報(bào)時(shí)功能,并且在顯示器上顯示,若開啟則顯示“%”,否則不顯示。程序流程圖如圖11-20所示。圖11-20報(bào)時(shí)開關(guān)程序流程圖

(9)報(bào)時(shí)次數(shù)轉(zhuǎn)換和報(bào)時(shí)程序。這部分程序根據(jù)時(shí)間的小時(shí)位的個(gè)位是否有進(jìn)位來判斷。當(dāng)報(bào)時(shí)功能處于開啟狀態(tài)且小時(shí)位的個(gè)位有進(jìn)位時(shí)把幾點(diǎn)鐘轉(zhuǎn)換成報(bào)時(shí)次數(shù)。報(bào)時(shí)程序在報(bào)時(shí)功能處于開啟狀態(tài)下根據(jù)轉(zhuǎn)換好的次數(shù),幾點(diǎn)鐘發(fā)光二極管就閃亮幾下,在報(bào)好時(shí)后自動(dòng)熄滅。程序流程圖如圖11-21和圖11-22所示。圖11-21報(bào)時(shí)次數(shù)程序流程圖圖11-22報(bào)時(shí)程序流程圖

(10)顯示開關(guān)程序。這部分程序用來控制顯示器的開關(guān)狀態(tài)。當(dāng)顯示器處在關(guān)閉狀態(tài)時(shí),為省電模式,屏幕上不會(huì)顯示時(shí)間,但仍計(jì)時(shí),其他功能均正常;當(dāng)顯示器處在開啟狀態(tài)時(shí),正常顯示時(shí)間和功能圖標(biāo)。顯示開關(guān)程序流程圖如圖11-23所示。圖11-23顯示開關(guān)程序流程圖

;********************日期部分*********************

DAYL EQU 40H ;日個(gè)

DAYH EQU 41H ;日十

HENL EQU 42H ;-

MONTHL EQU 43H ;月

MONTHH EQU 44H ;月

HENH EQU 45H ;-

YEARO EQU 46H ;年

YEART EQU 47H

YEARS EQU 48H

YEARF EQU 49H

TEMP EQU 50H

;用作存儲(chǔ)單元,顯示子程序(DISPLAY)中用到

BIJIAO EQU 51H ;加1子程序(JIAYI)中用到

ZDRQO EQU 55H ;中斷加1程序中用到

ZDRQT EQU 56H ;中斷加1程序中用到

ZDRQS EQU 57H ;中斷加1程序中用到

ZDRQF EQU 58H ;中斷加1程序中用到

DIZHI EQU 59H

;鍵盤(JIANPAN)子程序中用到

NZBZ BIT 60H

;定時(shí)標(biāo)志位在鬧鐘開關(guān)部分

BSCSBZ BIT 39H

;報(bào)時(shí)次數(shù)轉(zhuǎn)換標(biāo)志(BSCS)中用到

BSCSCC EQU 3AH ;報(bào)時(shí)次數(shù)存儲(chǔ)(BSCS)中用到

ZDBSBZ BIT 3BH ;整點(diǎn)報(bào)時(shí)標(biāo)志(SSBS)中用到

ZMBSBZ BIT 3CH ;整秒閃爍標(biāo)志(SSBS)中用到

BSKGBZ BIT 3DH ;報(bào)時(shí)開啟標(biāo)志(BSKG)中用到

XKQHBZ BIT 3EH

;顯示開啟關(guān)閉標(biāo)志(XIANKONG)中用到

;*****************************

ORG 0000H

AJMP MAIN

ORG 000BH

AJMP ZD

ORG 0030H

MAIN: MOV SP,#60H ;給堆棧指針賦初值

MOV 30H,#05H ;秒

MOV 31H,#05H ;秒

MOV 32H,#3AH ;:

MOV 33H,#09H ;分

MOV 34H,#05H ;分

MOV 35H,#3AH ;:

MOV 36H,#03H ;時(shí)

MOV 37H,#01H ;時(shí) ;****************日期部分*********************

MOV 40H,#09H ;日個(gè)

MOV 41H,#02H ;日十

MOV 42H,#2DH ;-

MOV 43H,#09H ;月

MOV 44H,#00H ;月

MOV 45H,#2DH ;-

MOV 46H,#09H ;年

MOV 47H,#09H

MOV 48H,#09H

MOV 49H,#02H

CLR P2.5 ;鬧鐘

CLR P2.6 ;整點(diǎn)報(bào)時(shí)

MOV 03H,#00H ;鬧鐘分個(gè)位

MOV 04H,#00H ;鬧鐘分十位

MOV 06H,#04H ;鬧鐘時(shí)個(gè)位

MOV 07H,#01H ;鬧鐘時(shí)十位

MOVB,#20

MOVTMOD,#01H ;定時(shí)器工作方式1

MOV TH0,#4CH

MOV TL0,#08H

SETB ET0 ;允許T0中斷

SETB EA ;總中斷開放

LCALL LCDRESET ;初始化LCD

LCALL DISPSTART ;調(diào)用顯示初始狀態(tài)

SETB TR0 ;開啟定時(shí)器

CLR NZBZ ;鬧鐘開啟關(guān)閉標(biāo)志

CLRB SKGBZ ;報(bào)時(shí)開啟關(guān)閉標(biāo)志

CLR XKQHBZ ;顯示開啟關(guān)閉標(biāo)志

LOOP:

LCALL JIANPAN ;按鍵子程序

LCALL DISPLAY ;顯示子程序

LCALL NZBF ;鬧鐘部分

LCALL NZBJ ;鬧鐘比較

LCALL BSKG ;報(bào)時(shí)開關(guān)

LCALL BSCS ;報(bào)時(shí)次數(shù)

LCALL SSBS ;閃爍報(bào)時(shí)

LCALL XIANKONG

;調(diào)用顯示開啟關(guān)閉控制

SJMP LOOP

;============中斷加1程序===================

ZD: PUSH ACC

MOV TH0,#4CH

MOV TL0,#08H

DJNZ B,ZDEND

MOVB,#20

INC SECONTL

SETB ZMBSBZ

MOV A,SECONTL

CJNE A,#0AH,ZDEND MOV SECONTL,#00H

INC SECONTH

MOV A,SECONTH

CJNE A,#06H,ZDEND

MOV SECONTH,#00H

INC MINIUTL

MOV A,MINIUTL

CJNE A,#0AH,ZDEND

MOV MINIUTL,#00H

INC MINIUTH

MOV A,MINIUTH

CJNE A,#06H,ZDEND MOV MINIUTH,#00H

INC HOURL

SETB BSCSBZ

SETB ZDBSBZ

MOV A,HOURL ;24小時(shí)的判斷

CJNE A,#04H,ZDF

MOV A,HOURH

CJNE A,#02H,ZDEND

MOV HOURL,#00H

MOV HOURH,#00H

LCALL

ZDRQ

SJMP ZDEND

ZDF:

CJNE A,#0AH,ZDEND

MOV HOURL,#00H

INC HOURH

ZDEND:

POP ACC

RETI

;日期部分

ZDRQ: PUSH ACC

INC DAYL

;判斷天數(shù)28、30、31部分

MOV A,MONTHH

;用于判斷月份時(shí),為31天、30天、28天

CJNE A,#01H,LL

MOV 55H,#0AH

;存放月份的十位轉(zhuǎn)化為個(gè)位,為0AH

MOV A,MONTHL

ADD A,55H ;月份高低相加用于查表

SJMP LL3

LL: MOV A,MONTHL

ADD A,MONTHH

LL3: MOV 56H,A ;存放相加后的月份數(shù)據(jù)

MOV DPTR,#TAB5

MOVC

A,@A+DPTR

;查十位和天數(shù)的十位比較

MOV 57H,A

MOV A,56H

MOV DPTR,#TAB6;查個(gè)位和天數(shù)的個(gè)位比較

MOVC A,@A+DPTR

MOV 58H,A

MOV A,DAYH

CJNE A,57H,LL2

MOV A,DAYL

CJNE A,58H,LL2

MOV DAYH,#00H

MOV DAYL,#01H

SJMP LL4

LL2: MOV A,DAYL

CJNE A,#0AH,ZDRQEND

MOV DAYL,#00H

INC DAYH

MOV A,DAYH ;比較天數(shù)是否要進(jìn)位

CJNE A,57H,ZDRQEND

MOV A,DAYL

CJNE A,58H,ZDRQEND

MOV DAYH,#00H

MOV DAYL,#01H

;月份和年份

LL4: INC MONTHL

MOV A,MONTHL

CJNE A,#03H,ZDRQ1

;用于判斷為12月時(shí)的進(jìn)位

MOV A,MONTHH

CJNE A,#01H,ZDRQ1

MOV MONTHL,#01H ;天數(shù)符合要求

MOV MONTHH,#00H

SJMP ZDRQ2

ZDRQ1:

CJNE A,#0AH,ZDRQEND

MOV MONTHL,#00H

INC MONTHH

SJMP ZDRQEND

ZDRQ2: INC YEARO ;年的加1

MOV A,YEARO

CJNE A,#0AH,ZDRQEND

MOV YEARO,#00H

INC YEART ;年的進(jìn)位 MOV A,YEART

CJNE A,#0AH,ZDRQEND

MOV YEART,#00H

INC YEARS

MOV A,YEARS

CJNE A,#0AH,ZDRQEND

MOV YEARS,#00H

INC YEARF

MOV A,YEARF

CJNE A,#0AH,ZDRQEND

MOV YEARF,#00H

ZDRQEND:

POP ACC

RET

;液晶初始化

;===========初始化程序===============

LCDRESET: ;初始化程序

LCALL DELAY5MS ;延時(shí)15ms

LCALL DELAY5MS

LCALL DELAY5MS

MOV A,#38H

;顯示模式設(shè)置(不檢測(cè)忙信號(hào))

LCALL LCDWCN ;共三次

LCALL DELAY5MS

MOV A,#38H

LCALL LCDWCN

LCALL DELAY5MS

MOV A,#38H

LCALL LCDWCN

MOV A,#38H;顯示模式設(shè)置(以后均檢測(cè)忙信號(hào))

LCALL LCDWC

MOV A,#08H;顯示關(guān)閉 LCALL LCDWC

MOV A,#01H ;顯示清屏

LCALL LCDWC

MOV A,#06H ;顯示光標(biāo)移動(dòng)設(shè)置

LCALL LCDWC

MOV A,#0CH ;設(shè)置開顯示和顯示光標(biāo)

LCALL LCDWC

RET ;=============寫指令===================

LCDWC: ;送控制字子程序(檢測(cè)忙信號(hào))

LCALLWAITIDLE

;******寫指令*******;送控制字子程序(不檢測(cè)忙信號(hào))

LCDWCN:CLRRSPIN;RS=0,R/W=0,E=高脈沖

CLRRWPIN

MOVP0,A

SETBEPIN ;(

NOP ;給高電平脈沖

CLREPIN ;)

RET ;============寫數(shù)據(jù)=================

LCDWD: ;寫字符子程序

LCALLWAITIDLE

SETBRSPIN ;RS=1,R/W=0,E=高脈沖

CLR RWPIN

MOVP0,A

SETBEPIN

NOP

CLR EPIN

RET ;============等待控制器空閑=============

WAITIDLE:

PUSHACC

;在正常讀/寫操作之前必須檢測(cè)LCD控制器狀態(tài)

MOV

P0,#0FFH

LCALL

DELAY5MS

CLR

RSPIN;RS=0,R/W=1,E=高電平

SETB

RWPIN

SETB

EPIN

LCALL

DELAY5MS

WTD_PA:NOP;DB7:0表示LCD控制器空閑

JB P0.7,WTD_PA;1表示LCD控制器忙

CLR EPIN

POP ACC

RET ;***************初始狀態(tài)子程序**************

DISPSTART:

;顯示初始狀態(tài)子程序

PUSH

ACC

MOV

A,#80H

LCALL

LCDWC

MOV

DPTR,#TAB ;顯示字符

DISP1: CLR

A

MOVC

A,@A+DPTR

JZ

DISP2

LCALL

LCDWD

INC

DPTR

SJMP

DISP1

DISP2: MOV

A,#0C0H

LCALL

LCDWC

MOV

DPTR,#TAB1

DISP3: CLR

A

MOVC

A,@A+DPTR

JZ

DISP_END

LCALL

LCDWD

INC

DPTR

SJMP

DISP3

DISP_END:

POP

ACC

RET

;=============顯示子程序=================

DISPLAY:PUSH PSW

PUSH ACC

SETB RS0

CLR RS1

MOV A,#85H

LCALL LCDWC

MOV R1,#38H

;第一行顯示數(shù)據(jù)存儲(chǔ)單元的起始地址

MOV TEMP,#30H

;第一行顯示數(shù)據(jù)存儲(chǔ)單元的結(jié)束地址

MOV R6,#2

PLAY: DEC R1

CJNE R1,#32H,PLY ;判斷是否為冒號(hào)位

MOV A,MAOHAOL;是,則送冒號(hào)的ASCII碼

SJMP PLAY1

PLY: CJNE R1,#35H,PLY1

MOV A,MAOHAOH

SJMP PLAY1

PLY1: CJNE R1,#42H,PLY2;判斷是否為橫杠的位置

MOV A,HENL ;是,則送橫杠的ASCII碼

SJMP PLAY1

PLY2: CJNE R1,#45H,PLY3

MOV A,HENH

SJMP PLAY1

PLY3: MOV A,@R1 ;用查表法送要顯示的數(shù)據(jù)

MOV DPTR,#TAB2

MOVC

A,@A+DPTR

PLAY1: LCALL LCDWD

MOV A,R1

CJNE A,TEMP,PLAY

;判斷第一行是否已顯示好

MOV A,#0C5H

LCALL

LCDWC

MOV R1,#4AH

;第二行顯示數(shù)據(jù)存儲(chǔ)單元的起始地址

MOV TEMP,#40H ;第二行的結(jié)束地址

DJNZ R6,PLAY ;R6為0時(shí)兩行顯示結(jié)束

POP ACC

POP PSW

RET

;**************顯示開啟和關(guān)閉控制**************

XIANKONG:JB P2.0,XIANEND

LCALL DELAY5MS

JB P2.0,XIANEND

PUSH ACC

JNB P2.0,$

CPL XKQHBZ

JNB XKQHBZ,XK_LL

MOV A,#08H ;顯示關(guān)閉

LCALL LCDWC

SJMP XK_LP

XK_LL: MOV A,#0CH;顯示開啟

LCALL LCDWC

XK_LP: POP ACC

XIANEND:RET

;********************按鍵子程序****************

JIANPAN:CLR RS0 ;鍵盤子程序

SETB RS1 ;鍵盤子程序

JB WEIXUAN,JIAN_END

;設(shè)置鍵的判斷

LCALL

DELAY5MS

JB

WEIXUAN,JIAN_END

PUSH ACC

JNB

WEIXUAN,$

MOV

A,#0FH ;開啟光標(biāo)閃爍設(shè)置

LCALL LCDWCN

FAH: JNB NZBZ,JPNZSJ

;為“1”表示鬧鐘,為“0”表示時(shí)鐘

LCALL

JPXS

;MOV A,#0FH ;開啟光標(biāo)閃爍設(shè)置

;LCALL

LCDWCN

MOV R4,#85H

;鬧鐘設(shè)定時(shí)間R4存放顯示位地址

MOV R5,#2

;鬧鐘設(shè)定時(shí)間第一行、第二行等位置改變次數(shù)

MOV DIZHI,#8BH

;鬧鐘設(shè)定時(shí)間第一行結(jié)束地址

MOV R0,#07H

SJMP GIVED

JPNZSJ: CLR TR0

MOV A,#0FH ;開啟光標(biāo)閃爍設(shè)置

LCALL

LCDWCN

MOV R4,#85H ;R4存放顯示位地址

MOV R5,#2

;第一行、第二行等位置改變次數(shù)

MOV DIZHI,#8DH ;第一行結(jié)束地址

MOV R0,#37H

GIVED: MOV A,R4

LCALL LCDWC

UPONE: JB FANHUI,UPtwo ;返回鍵的判斷

LCALL

DELAY5MS

JB FANHUI,UPtwo

JNB FANHUI,$

SJMP GOBACK

UPtwo: JB JIAJIAN,IAM ;加1鍵的判斷

LCALL

DELAY5MS

JB JIAJIAN,IAM

JNB JIAJIAN,$

LCALL

JIAYI ;調(diào)用按鍵加1子程序

AJMP GIVED

IAM: JB WEIXUAN,UPONE;位選鍵的判斷

LCALL DELAY5MS

JB WEIXUAN,UPONE

JNB WEIXUAN,$

DEC R0

INC R4

LCALL JIAN ;調(diào)用位選比較程序

MOV A,R4

CJNE A,DIZHI,GIVED

JB NZBZ,FAH

;為“1”表示鬧鐘,為“0”表示時(shí)鐘

MOV R4,#0C5H

MOV DIZHI,#0CFH

MOV R0,#49H

DJNZ R5,GIVED

SJMP FAH

GOBACK:

MOV A,#0CH ;關(guān)閉光標(biāo)閃爍設(shè)置

LCALL LCDWCN

POP ACC

JIAN_END:

SETB TR0

RET

JPXS: MOV A,#85H

LCALL

LCDWC

MOV R1,#08H

;第一行顯示數(shù)據(jù)存儲(chǔ)單元的起始地址

JPXS_LL:DEC R1

CJNE R1,#05H,JPXS_LP

MOV A,#3AH

SJMP JPXS_LY

JPXS_LP:MOV A,@R1 ;用查表法送要顯示的數(shù)據(jù)

MOV DPTR,#TAB2

MOVC A,@A+DPTR

JPXS_LY:LCALL LCDWD

CJNE R1,#03H,JPXS_LL

RET

;*****************位選比較控制程序***************

;在調(diào)整時(shí)間時(shí)以下各地址顯示的數(shù)據(jù)是符號(hào):冒號(hào)和橫杠

;在這幾位時(shí)跳到下一位

JIAN: CJNE R4,#87H,JIAN5

DEC R0

INC R4

SJMP JIANEND

JIAN5: CJNE R4,#8AH,JIAN1

DEC R0

INC R4

SJMP JIANEND

JIAN1: CJNE R4,#0C9H,JIAN2

DEC R0

INC R4

SJMP JIANEND

JIAN2: CJNE R4,#0CCH,JIANEND

DEC R0

INC R4

JIANEND:RET

;*********************按鍵加1子程序***************

JIAYI: INC @R0

MOV BIJIAO,@R0

MOV A,R0

ANL A,#0FH

CJNE R5,#02H,CICHU

;若相等,則為第一

行顯示(時(shí)間);若不相等,則為第二行顯示(日期)

MOV DPTR,#TAB3 ;查第一行顯示(時(shí)間)的設(shè)定值

SJMP BIJI1

CICHU: MOV DPTR,#TAB4 ;查第二行顯示(日期)的設(shè)定值

BIJI1: MOVC

A,@A+DPTR

CJNE A,BIJIAO,BIJI

;比較是否超過設(shè)定值

MOV @R0,#00H

BIJI: MOV A,@R0

;查表顯示數(shù)據(jù)

MOV DPTR,#TAB2

MOVC

A,@A+DPTR

LCALL

LCDWD

RET

11.1.4系統(tǒng)功能測(cè)試

1.測(cè)試準(zhǔn)備

按照原理圖將各個(gè)原器件焊接到板子上,檢查有無(wú)短接、虛焊,芯片是否已經(jīng)插好。在準(zhǔn)確無(wú)誤后,插好芯片及液晶模塊,打開電源開關(guān),將編好的程序下載到單片機(jī)上,進(jìn)行通電測(cè)試。

2.測(cè)試儀器及設(shè)備

測(cè)試儀器設(shè)備清單如表11-11所示。

3.測(cè)試方案

1)按鍵功能測(cè)試

在程序運(yùn)行中有按鍵按下后,能否根據(jù)不同的鍵執(zhí)行設(shè)定好的程序,以實(shí)現(xiàn)對(duì)日期和時(shí)間的調(diào)整,在進(jìn)入時(shí)間修改程序后是否可以進(jìn)行修改,位選鍵是否可以使用,顯示控制鍵能否開啟及關(guān)閉顯示屏。

2)時(shí)間功能測(cè)試

測(cè)試時(shí)間是否可以準(zhǔn)確實(shí)現(xiàn)進(jìn)位、24小時(shí)的判斷、2月份的28天以及其他月份的31天和30天的進(jìn)位。測(cè)試時(shí)間是不是一秒一秒走得很準(zhǔn)確以及時(shí)鐘的誤差。

3)顯示功能測(cè)試

顯示是否完全按照要求在液晶顯示屏的設(shè)定位置顯示,是否可以準(zhǔn)確地更新時(shí)間及日期,在符號(hào)的位置是否正確地顯示了“:”和“-”,在修改時(shí)間時(shí)光標(biāo)是否能正確地在預(yù)修改的地方閃爍,修改位置改變時(shí)光標(biāo)能否正確地跟隨移動(dòng)。

4)日期及時(shí)間修改功能測(cè)試

在位選鍵和加1鍵配合下能否選定位置并在程序設(shè)定好的范圍內(nèi)實(shí)現(xiàn)修改,在修改時(shí)間時(shí)能否準(zhǔn)確地實(shí)現(xiàn)設(shè)定而不會(huì)超過設(shè)定的值,如在調(diào)整時(shí)的十位時(shí),只會(huì)在0~2之間循環(huán)而不會(huì)超過,在程序中是否對(duì)所有的值都進(jìn)行了上限值的設(shè)定。

5)報(bào)時(shí)和鬧鐘功能測(cè)試

在報(bào)時(shí)功能開啟下液晶顯示屏上是否有顯示報(bào)時(shí)功能標(biāo)志,到達(dá)整點(diǎn)時(shí)是否會(huì)發(fā)出聲光報(bào)時(shí)(即發(fā)光二極管閃爍,蜂鳴器發(fā)出聲音),報(bào)時(shí)是否準(zhǔn)確。在鬧鐘功能開啟后,時(shí)間走到和設(shè)定好的時(shí)間相等時(shí),是否有聲光報(bào)警,是否在準(zhǔn)確的時(shí)間報(bào)警。11.2數(shù)字心率計(jì)的設(shè)計(jì)不論在生物醫(yī)學(xué)還是在體育運(yùn)動(dòng)領(lǐng)域,心率都是一個(gè)重要的生理參數(shù),它能反饋人的當(dāng)前身體狀況。近年來,測(cè)試心率的設(shè)備以多種形式出現(xiàn),或者為單獨(dú)的便攜產(chǎn)品,或者集成于某些醫(yī)療設(shè)備或運(yùn)動(dòng)器材中,硬件電路也從單純的數(shù)字電路向以微控制器為核心發(fā)展。本節(jié)將為讀者介紹一種基于單片機(jī)的心率計(jì)的軟/硬件設(shè)計(jì)。11.2.1心率的測(cè)量原理

心率是指心臟每分鐘的跳動(dòng)次數(shù)。目前常見的心率測(cè)量原理有以下三種:

(1)提取出心電信號(hào)(ECG)中的R波并將其整形為TTL脈沖,然后對(duì)該脈沖計(jì)數(shù),一分鐘內(nèi)的計(jì)數(shù)脈沖個(gè)數(shù)便為心率(或者計(jì)數(shù)一小段時(shí)間,如6?s,再作乘法,得到心率),或者通過計(jì)算兩個(gè)R波間的時(shí)間間隔(即周期)計(jì)算出心率。

(2)采用光電傳感器檢測(cè)人體組織半透明度隨著心臟波動(dòng)的變化,然后通過電路將該變化轉(zhuǎn)換為脈沖,對(duì)脈沖計(jì)數(shù),一分鐘內(nèi)脈沖的個(gè)數(shù)即為所測(cè)心率。

(3)用壓電陶瓷片檢測(cè)脈搏,再整形為脈沖信號(hào),對(duì)脈沖計(jì)數(shù),一分鐘內(nèi)脈沖的個(gè)數(shù)即為心率。

盡管上述三種方法的前端檢測(cè)電路存在不同,但最終均通過對(duì)脈沖的計(jì)數(shù)完成對(duì)心率的檢測(cè)。本書將采用第一種方法,基于其他方法的心率計(jì)設(shè)計(jì)請(qǐng)讀者參考相關(guān)文獻(xiàn)。11.2.2數(shù)字心率計(jì)的硬件設(shè)計(jì)

通過對(duì)第一種方法的分析容易看出,數(shù)字心率計(jì)中應(yīng)包括R波提取及整形電路、計(jì)時(shí)電路、脈沖計(jì)數(shù)電路和顯示電路。通過前面章節(jié)的學(xué)習(xí)我們知道,MCS-51單片機(jī)內(nèi)包含兩個(gè)可以工作于定時(shí)/計(jì)數(shù)模式的定時(shí)器,并且還能運(yùn)用單片機(jī)做一些計(jì)算及控制顯示電路,因此,可以采用以單片機(jī)為核心的電路來實(shí)現(xiàn)心率計(jì)硬件電路的設(shè)計(jì)。數(shù)字心率計(jì)硬件結(jié)構(gòu)框圖如圖11-24所示。

1.R波提取及整形電路

R波提取電路如圖11-25所示。圖11-24數(shù)字心率計(jì)硬件結(jié)構(gòu)框圖圖11-25R波提取電路該R波提取電路由比較器U1∶A、U1∶B及邏輯電路組成,電位器RV1、RV2組成門檻電平上下限的調(diào)節(jié)器,以便按需設(shè)定門檻電平。U1:B輸出至RS觸發(fā)器的端;U1:A輸出至窄脈沖觸發(fā)器,由U2∶D(11腳)輸出5μs波寬的負(fù)脈沖。該脈沖一路送至反相器進(jìn)行倒相,另一路經(jīng)積分電路R12、C3送至RS觸發(fā)器的端。當(dāng)RS觸發(fā)器的端為高電平時(shí),不論端的電平如何變化,Q端均處于高電平;當(dāng)端為高電平時(shí),不論端的電平如何變化,Q端輸出均為低電平。RS觸發(fā)器Q端輸出的電平(經(jīng)積分電路R11、C2后)與反相器輸出的電平分別控制與非門的輸入端A、B,只有A、B兩端同時(shí)為高電平時(shí),與非門的輸出端才有負(fù)脈沖輸出。其工作過程如下:調(diào)節(jié)RV1、RV2使輸入電位信號(hào)尖峰位于門檻電平上下限之間,輸入信號(hào)的幅度超過下限比較器U1∶A所設(shè)定的門檻電平,U1∶A的輸出端輸出一負(fù)脈沖觸發(fā)窄脈沖觸發(fā)器,窄脈沖觸發(fā)器輸出一波寬5μs的負(fù)窄脈沖。該負(fù)脈沖一路送至倒相器,另一路送至RS觸發(fā)器的端。同時(shí),因?yàn)檩斎胄盘?hào)的幅度未超過上限比較器U1∶B所設(shè)定的門檻電平,所以U1∶B輸出高電平,控制RS觸發(fā)器的端。在這種狀態(tài)下,無(wú)論端電平如何變化,RS觸發(fā)器的Q端始終保持高電平。于是與非門A端也為高電平,其B端被反相器輸出的正脈沖所控制。每當(dāng)一個(gè)正脈沖出現(xiàn),Y端輸出一個(gè)負(fù)脈沖,即輸出端產(chǎn)生一個(gè)與R波的尖峰落于上下限門檻電平間相對(duì)應(yīng)的負(fù)脈沖,這樣就完成了R波的提取。由于該提取電路輸出的脈沖很窄,不便于后續(xù)計(jì)數(shù)電路計(jì)數(shù),因此,在R波提取電路后加一級(jí)整形電路來拓寬脈沖寬度。整形電路如圖11-26所示。圖中的核心元件為555,工作于單穩(wěn)態(tài)模式,當(dāng)TR(Trigger,觸發(fā)端)電壓低于VCC/3時(shí),其輸出端處于高電平,該高電平的持續(xù)時(shí)間約為1.1RaC(Ra、C分別為圖11-26中R13、C5的電阻值和電容值)。因此,只要選擇適當(dāng)?shù)腞a和C便能得到計(jì)數(shù)電路需要的適宜寬度的脈沖。圖11-26整形電路

2.計(jì)時(shí)、計(jì)數(shù)及顯示電路

計(jì)時(shí)、計(jì)數(shù)分別由MCS-51單片機(jī)的定時(shí)器T0和T1承擔(dān),顯示電路采用與圖9-13模擬心電信號(hào)發(fā)生器相同的電路。11.2.3數(shù)字心率計(jì)的軟件設(shè)計(jì)

1.流程圖

從前面的分析中我們知道,數(shù)字心率計(jì)提供給用戶的是每分鐘心跳的次數(shù),而顯示的心率值則是通過提取R波得到脈沖,再計(jì)算每?jī)蓚€(gè)脈沖之間的時(shí)間間隔(即周期)最終得到的。因此,根據(jù)模塊化程序設(shè)計(jì)的原則,軟件包括以下子程序:顯示子程序(需要延時(shí)子程序)、外部中斷0服務(wù)子程序(接收脈沖輸入并啟動(dòng)定時(shí))、定時(shí)器T1中斷服務(wù)子程序(獲得周期)和心率計(jì)算子程序(包括2字節(jié)除以1字節(jié)子程序)。程序流程圖如圖11-27所示。圖11-27程序流程圖(a)主程序流程圖;(b)心率計(jì)算子程序流程圖;(c)外部中斷0服務(wù)子程序流程圖;(d)定時(shí)器T1服務(wù)子程序流程圖

MAIN:

MOV SP, #60H ;初始化

MOV A, #0

MOV R0, #30H

MOV R4, #3

MOV COUNTER, #00H

CLR CNT

LOOPM:MOV @R0,A

INC R0

DJNZ R4, LOOPM

MOV TMOD, #10H

;T1工作于定時(shí)模式,工作方式1

MOV TH1, #0D8H ;定時(shí)10ms

MOV TL1, #0F0H

SETB EA

SETB ET1

SETB EX0

SETB IT0

LOOPT: LCALL DISPLAY

SJMP LOOPT

SUBET1:

PUSHPSW

PUSHACC

CLR RS0

CLR RS1

INC COUNTER

MOVA,COUNTER

ENDET1:

MOVTH1,#0D8H ;定時(shí)10ms

MOVTL1, #0F0H

POP ACC

POP PSW

RETI

SUBEX0:

PUSH PSW

PUSH ACC

CPL CNT

JB CNT,NEXT

CLR TR1

CLR EX0

LCALL CALHR

SJMP ENDEX0

NEXT:

MOV TH1, #0D8H ;定時(shí)10ms

MOV TL1,#0F0H

SETB TR1

ENDEX0:

POP ACC

POP PSW

RETI

;*********************************************

;子程序名:心率計(jì)算程序

;參數(shù):輸入為COUNTER

;說明:計(jì)算出心率值并轉(zhuǎn)換為BCD碼存入以30H開始的

;3個(gè)存儲(chǔ)單元,用工作寄存器組2、R4、R5、R6、R7

;*********************************************

CALHR:

PUSH PSW

PUSH ACC

SETB RS1

CLR RS0 LCALL DIVBYTE

MOV A,RESULT

MOV B,#100 ;計(jì)算百位BCD碼

DIV AB

MOV 30H,A

MOV A,B

MOV B,#10 ;計(jì)算十位、個(gè)位

DIV AB

MOV 31H,A

MOV 32H,B

ENDCAL:

POP ACC

POP PSW

SETB TR0

CLR CNT

MOV COUNTER,#0

RET

;*************************************************

;子程序名:雙字節(jié)除法程序

;參數(shù):輸入?yún)?shù)為COUNTER,輸出參數(shù)為RESULT

;說明:用工作寄存器組2、R0、R1、R2、R3

;*************************************************

DIVBYTE:

PUSHPSW

PUSHACC

SETBRS1

CLRRS0

MOVA,COUNTER ;判斷除數(shù)是否為0

JZ ERR

MOV R3,#17H ;被除數(shù)高字節(jié)

MOV R2,#70H ;被除數(shù)低字節(jié)

MOV A,R3

CLR C

SUBB A,COUNTER

JNC ERR

MOV B,#8

LOOPD1:

CLR C

MOV A,R2

RLC A

MOV R2,A

MOV A,R3

RLC A

MOV R3,A

MOV F0,C ;被除數(shù)最高位送F0

CLR C

SUBB A,COUNTER;

MOV R1,A

JB F0,LOOPD2

JC LOOPD3

LOOPD2:

INC R2 ;商加1

MOV A,R1

MOV R3,A ;余數(shù)放入R3中

LOOPD3:

DJNZ B,LOOPD1

CLR F0

MOV RESULT,R2

SJMP ENDDV

ERR: MOV RESULT,#0

ENDDV:

SETB EX0

POP ACC

POP PSW

RET

;************************************************

;子程序名:顯示程序

;參數(shù):40H~43H為一次存放設(shè)置標(biāo)志,表示心率百位、十位、個(gè)位

;說明:用工作寄存器組1、R0、R3、R4

;************************************************

DISPLAY:

PUSH PSW

PUSH ACC

SETB RS0 ;選擇通用寄存器組1

CLR RS1

MOV R3,#01H ;位選初始值

MOV R4,#3 ;循環(huán)次數(shù)

MOV R0,#30H ;顯示緩沖區(qū)首地址

MOV DPTR,#TAB

LOOPDSP:

MOV A,@R0 ;讀待顯示數(shù)據(jù)

MOVC A,@A+DPTR ;查表,取得字段碼

MOV P1,R3 ;發(fā)位選

MOV P0,A ;發(fā)送至端口

LCALL DELAY5

INC R0 ;準(zhǔn)備顯示下一位

MOV A,R3 ;改變位選值

RL A MOV R3,A

LCALL DELAY5

DJNZ R4,LOOPDSP ;顯示3個(gè)數(shù)據(jù)

POP ACC

POP PSW

RET

;子程序名:延時(shí)子程序

;參數(shù):無(wú)

;說明:延時(shí)5ms,用工作寄存器組1、R6、R7

;*************************************************

DELAY5:

PUSH PSW

SETB RS0

CLR RS1

MOV R7,#10

DL:

MOV R6,#100

DL6:DJNZ R6,DL6

DJNZ R7,DL

POP PSW

RET

TAB:DB3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH

END11.3數(shù)字溫度計(jì)的設(shè)計(jì)溫度是一個(gè)重要的物理量,也是與人們的生活息息相關(guān)的參數(shù)。實(shí)驗(yàn)表明,人體在夏天和冬天感到舒適的溫度存在差別,因此本節(jié)將介紹一種可設(shè)置工作模式、帶聲光報(bào)警的數(shù)字溫度計(jì)的設(shè)計(jì)。11.3.1基于單片機(jī)的數(shù)字溫度計(jì)概述相比于傳統(tǒng)的液體溫度計(jì),數(shù)字溫度計(jì)具有讀數(shù)直觀、測(cè)量時(shí)間短等特點(diǎn),其應(yīng)用廣泛。常用于溫度測(cè)量的傳感器有金屬熱電阻、熱敏電阻、熱電偶,基于此類傳感器的溫度計(jì)結(jié)構(gòu)如圖11-28所示,需要選擇適當(dāng)?shù)男盘?hào)調(diào)理電路及A/D轉(zhuǎn)換電路來為單片機(jī)提供數(shù)據(jù)。除此之外,也可以采用直接輸出數(shù)字信號(hào)的溫度傳感器,比如DS18B20能夠直接與單片機(jī)接口,使用方便,控制簡(jiǎn)單。圖11-28數(shù)字溫度計(jì)的一般結(jié)構(gòu)11.3.2數(shù)字溫度計(jì)的硬件設(shè)計(jì)

要設(shè)計(jì)數(shù)字溫度計(jì),傳感器的選擇至關(guān)重要。經(jīng)過認(rèn)真分析,決定采用單線(1-wire)可編程溫度傳感器DS18B20。采用DS18B20的數(shù)字溫度計(jì)結(jié)構(gòu)框圖如圖11-29所示。圖11-29采用DS18B20的數(shù)字溫度計(jì)結(jié)構(gòu)框圖

1.DS18B20簡(jiǎn)介

DS18B20是DALLAS半導(dǎo)體公司生產(chǎn)的單線智能溫度傳感器,屬于新一代智能溫度傳感器,輸出為數(shù)字信號(hào),可直接與單片機(jī)接口,廣泛應(yīng)用于工業(yè)、民用、軍事等領(lǐng)域的溫度測(cè)量及控制儀器、測(cè)控系統(tǒng)和大型設(shè)備中。

1)?DS18B20的性能特點(diǎn)

(1)采用單線技術(shù)(1-Wire),與單片機(jī)通信只需要一個(gè)引腳,無(wú)需經(jīng)過其他變換電路,直接輸出被測(cè)溫度值(9位二進(jìn)制數(shù),含符號(hào)位)。

(2)測(cè)溫范圍為-55~+125℃,測(cè)量分辨率可達(dá)0.0625℃,在-10~+85℃范圍內(nèi)誤差為±0.5℃。

(3)內(nèi)含64位經(jīng)過激光修正的只讀存儲(chǔ)器ROM,通過識(shí)別只讀ROM中的唯一序列號(hào)實(shí)現(xiàn)單線多掛接。

(4)用戶可分別設(shè)定各路溫度的告警上、下限。

(5)將12位的溫度值轉(zhuǎn)換為數(shù)字量所需的時(shí)間不超過750ms。

(6)內(nèi)含寄生電源。

2)?DS18B20的引腳分布及結(jié)構(gòu)

DS18B20的引腳排列如圖11-30所示,各引腳說明見表11-12。圖11-30DS18B20的引腳排列

DS18B20主要由四部分組成:64位光刻ROM、溫度傳感器、非易失的溫度報(bào)警觸發(fā)器TH和TL以及高速暫存器。

64位光刻ROM是出廠前被光刻好的,它可以看做是該DS18B20的地址序列號(hào)。64位ROM結(jié)構(gòu)圖如圖11-31所示。圖中,低8位為單線系列編碼(DS18B20的編碼是28H),緊接著的48位是唯一的序列號(hào),最后8位是前56位的CRC校驗(yàn)值。CRC校驗(yàn)值的生成方法請(qǐng)參考DS18B20手冊(cè)。圖11-3164位ROM結(jié)構(gòu)圖

DS18B20的存儲(chǔ)器由一個(gè)暫存RAM和非易失的EEPRAM構(gòu)成。暫存RAM共9個(gè)存儲(chǔ)單元,其結(jié)構(gòu)如圖11-32所示,非易失的EEPRAM結(jié)構(gòu)如圖11-33所示。暫存RAM中的TH、TL和配置字節(jié)是EEPRAM中TH、TL、配置字節(jié)的拷貝。改變TH、TL的值,可改變DS18B20的上、下限告警溫度。通過設(shè)置配置字節(jié)的第6、7位,可完成溫度值分辨率的配置。CRC值為前8個(gè)字節(jié)的校驗(yàn)值。圖11-32DS18B20暫存RAM的結(jié)構(gòu)

圖11-33DS18B20EEPRAM的結(jié)構(gòu)溫度值的低、高位結(jié)構(gòu)如圖11-34(該圖為12位分辨率的情況,如果配置為低的分辨率,則無(wú)意義位為0)所示。其中,低位字節(jié)包括二進(jìn)制小數(shù)部分,高位字節(jié)包括符號(hào)位S(正溫度為0,負(fù)溫度為1)。

注意:溫度為零上時(shí),所測(cè)值便為溫度值;溫度為零下時(shí),所測(cè)值取反加1后再加上符號(hào)才為實(shí)際溫度值。圖11-34DS18B20溫度值的低、高位結(jié)構(gòu)

2.單片機(jī)及顯示

本系統(tǒng)中單片機(jī)采用ATMEL公司的AT89C51,它與MCS-51兼容,配有4?KBFlashROM。

顯示單元采用16×2的字符/數(shù)字型液晶顯示模塊LM016L。

3.電路原理圖

數(shù)字溫度計(jì)的電路原理圖如圖11-35所示。圖中,AT89C51的P0口接LM016L的數(shù)據(jù)接口,P1.0~P1.3作為鍵盤輸入口,P3.5~P3.7與LM016L的控制線相連,DS18B20的數(shù)據(jù)線接P2.2,報(bào)警LED接P2.0、P2.1,蜂鳴器接P2.3。鍵盤工作于中斷模式,由K1鍵觸發(fā)。圖11-35數(shù)字溫度計(jì)的電路原理圖11.3.3數(shù)字溫度計(jì)的軟件設(shè)計(jì)

數(shù)字溫度計(jì)的軟件需完成溫度采集、溫度顯示及報(bào)警、鍵盤處理等功能。根據(jù)模塊化程序設(shè)計(jì)的思想,數(shù)字溫度計(jì)分為以下幾個(gè)模塊:溫度采集模塊、顯示處理模塊和鍵盤處理模塊、報(bào)警處理模塊。

DS18B20是單線器件,而AT89C51無(wú)單線接口,必須采用軟件的方法來模擬單線的協(xié)議時(shí)序。

1.DS18B20的單線協(xié)議

DS18B20有嚴(yán)格的通信協(xié)議,主機(jī)訪問DS18B20需要按照以下順序進(jìn)行。

1)初始化

單總線上的所有操作均從初始化開始。初始化過程如下:主機(jī)通過拉低單線480?μs以上來產(chǎn)生復(fù)位脈沖,然后釋放該線,進(jìn)入RX接收模式。主機(jī)釋放總線時(shí),會(huì)產(chǎn)生一個(gè)上升沿。DS18B20檢測(cè)到該上升沿后,延時(shí)15~60μs,通過拉低總線60~240μs來產(chǎn)生應(yīng)答脈沖。主機(jī)接收到從機(jī)的應(yīng)答脈沖后,說明有單線器件在線,可進(jìn)行后操作;若無(wú)應(yīng)答,則說明器件不存在或連接錯(cuò)誤,給出報(bào)警信息。

2)?ROM操作命令

主機(jī)檢測(cè)到應(yīng)答脈沖后,便可以發(fā)起ROM操作命令。ROM操作命令共有5個(gè),如表11-13所示。

3)內(nèi)存操作命令

成功執(zhí)行了ROM操作命令后,便可以使用內(nèi)存操作命令執(zhí)行相應(yīng)操作。主機(jī)可提供六種操作命令,如表11-14所示。

4)數(shù)據(jù)處理

DS18B20器件要求采用嚴(yán)格的時(shí)序,以保證數(shù)據(jù)的完整性。與DS18B20的通信,是通過操作時(shí)隙來完成單總線上的數(shù)據(jù)傳輸?shù)摹0l(fā)送所有的命令和數(shù)據(jù)時(shí),都是字節(jié)的低位在前,高位在后。

(1)寫時(shí)隙。當(dāng)主機(jī)將單總線DQ從高電平拉到低電平時(shí),便產(chǎn)生一個(gè)寫時(shí)隙,所有的寫時(shí)隙必須在60~120μs完成,且在每個(gè)循環(huán)之間至少需要1μs的恢復(fù)時(shí)間。寫時(shí)隙有兩種類型:寫0和寫1。DS18B20在DQ線變低后的15~60μs的窗口時(shí)間中對(duì)DQ線進(jìn)行采樣。如果為高電平,則為寫1;如果為低電平,則為寫0。對(duì)于主機(jī)產(chǎn)生寫1時(shí)隙的情況,數(shù)據(jù)線必須先被拉低,然后釋放。在寫時(shí)隙開始后的15μs,允許DQ線拉至高電平;對(duì)于主機(jī)產(chǎn)生寫0時(shí)隙的情況,DQ線必須被拉低至低電平且至少保持低電平60μs。

(2)讀時(shí)隙。DS18B20器件僅在主機(jī)發(fā)出讀時(shí)隙時(shí),才向主機(jī)傳輸數(shù)據(jù)。所以在主機(jī)發(fā)出讀數(shù)據(jù)命令后,必須馬上產(chǎn)生讀時(shí)隙,以便DS18B20能夠傳輸數(shù)據(jù)。當(dāng)主機(jī)從DS18B20讀數(shù)據(jù)時(shí),數(shù)據(jù)線從高電平拉至低電平,產(chǎn)生讀時(shí)隙。數(shù)據(jù)線DQ必須保持低電平至少1μs,來自DS18B20的輸出數(shù)據(jù)在讀時(shí)隙下降沿之后15μs內(nèi)有效。在此15μs內(nèi),主機(jī)必須停止將DQ引腳置低。讀時(shí)隙結(jié)束時(shí),DQ引腳將通過外部上拉電阻拉回至高電平。讀時(shí)隙最短必須持續(xù)60μs,各讀時(shí)隙間必須保證1μs的恢復(fù)時(shí)間。

2.流程圖

在主程序中主要完成系統(tǒng)的初始化操作,其流程圖如圖11-36所示。溫度采集及報(bào)警處理程序流程圖如圖11-37所示。圖11-36主程序流程圖圖11-37溫度采集及報(bào)警處理程序流程圖 K4 BITP1.3

RSPIN BITP3.7

RWPIN BITP3.6

EPIN BITP3.5

ORG 0000H

LJMP MAIN

ORG 0003H

LJMP SUBEX0 ;鍵盤處理

MAIN: MOV SP,#60H

SETB BEEP ;蜂鳴器

CLR FLAG1;

CLR FLAG2

CLR FLAG3

CLR FLAG4

CLR FLAG5

CLR FLAG7

CLR FLAG8

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說明,都需要本地電腦安裝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)論