由于仿真中沒有紅外,手指也模擬不了,其實(shí)就是單片機(jī)的IO口檢測脈沖信號,那樣用個(gè)方波信號模擬就行了
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
一、設(shè)計(jì)要求 本設(shè)計(jì)利用紅外光電傳感器產(chǎn)生脈沖信號,經(jīng)過放大整形后,輸入單片機(jī)內(nèi)進(jìn)行相應(yīng)的控制,從而測量出一分鐘內(nèi)的脈搏跳動次數(shù),快捷方便。測量范圍限可以用按鍵調(diào)節(jié),并進(jìn)行聲音報(bào)警,測量結(jié)果以數(shù)字方式顯示,測量精確到2次/分。同時(shí)還可以設(shè)定上限次數(shù)和下限次數(shù),當(dāng)測量的范圍超過設(shè)定的范圍則驅(qū)動蜂鳴器報(bào)警提醒,結(jié)果最終可以把采集到的脈搏信號顯示在LCD1602上。 二、方案論證 系統(tǒng)框圖如下: 
2.1主控模塊的選型和論證 方案一: 采用MSP430系列單片機(jī),該單片機(jī)是TI公司1996年開始推向市場的一種16位超低功耗的混合信號處理器。其內(nèi)部集成了很多模擬電路、數(shù)字電路和微處理器,提供強(qiáng)大的功能。不過該芯片昂貴不適合一般的設(shè)計(jì)開發(fā)[3]。 方案二: 采用51系列的單片機(jī),該單片機(jī)是一個(gè)高可靠性,超低價(jià),無法解密,高性能的8位單片機(jī),32個(gè)IO口,且STC系列的單片機(jī)可以在線編程、調(diào)試,方便地實(shí)現(xiàn)程序的下載與整機(jī)的調(diào)試。 因此選用方案二中的51系列單片機(jī)作為主控芯片。 2.2顯示模塊的選型和論證 方案一: 采用LED數(shù)碼管動態(tài)掃描,LED數(shù)碼管價(jià)格雖適中,對于顯示數(shù)字也最合適,而且采用動態(tài)掃描法與單片機(jī)連接時(shí),占用單片機(jī)口線少。但是由于數(shù)碼管動態(tài)掃描需要借助74LS164移位寄存器進(jìn)行移位,該芯片在電路調(diào)試時(shí)往往有很多障礙,所以不采用LED數(shù)碼管作為顯示。 方案二: 采用LCD液晶顯示屏,液晶顯示屏的顯示功能強(qiáng)大,可顯示大量文字,圖形,顯示多樣,清晰可見,對于本設(shè)計(jì)而言一個(gè)LCD1602的液晶屏即可,價(jià)格也還能接受,需要的接口線較多,但會給調(diào)試帶來諸多方便。 所以本設(shè)計(jì)中方案二中的LCD1602液顯示屏作為顯示模塊。 2.3脈搏檢測傳感器的選型和論證 方案一:壓電式 壓電式傳感器的檢測方法是利用壓力傳感器或振動傳感器將人體脈搏振動轉(zhuǎn)換成電信號。常見的壓力傳感器可用現(xiàn)有的壓電陶瓷代替。壓電式元件的內(nèi)阻極高,通常采用兩片相同的元件,使其極性反向相疊,由夾在中間的銅片作為一個(gè)電極。這樣,中央電極處于全空狀態(tài),可以用具有良好絕緣性的導(dǎo)線引出。此種方法的優(yōu)點(diǎn)是傳感器種類多,一般的傳感器輸出信號也比較大,對后面的放大電路要求不高。壓電陶瓷具有成本低、取材方便、易于提高敏感度等特點(diǎn)。 方案二:聲電式 聲電式傳感器的作用是將氣體、液體或固體中傳播的機(jī)械振動轉(zhuǎn)換成電信號。因此,它也屬于力學(xué)量傳感器。它的制作材料一般由不定性無煙煤顆粒或壓電陶瓷構(gòu)成。顆粒式聲電傳感器的優(yōu)點(diǎn)是耐用、成本低和容易制作,缺點(diǎn)是顆粒的機(jī)械磨損和接觸表面上的瞬間電弧會使顆粒逐漸老化,從而導(dǎo)致雜音大、性能不穩(wěn)定和非線性;而壓電陶瓷式的聲電傳感器在檢測聲音信號時(shí)卻存在著一定的缺陷。 聲電式檢測方法是利用微音傳感器將人體的振動的聲音轉(zhuǎn)換成電信號。此種方法的優(yōu)點(diǎn)是作為傳感器的微音傳感器可利用現(xiàn)有的駐極體或電容式話筒,但其后面的電路要采取一定的措施將環(huán)境的聲音干擾信號濾去。 方案三:光電式 光電系統(tǒng)通常是指能敏感由紫外光到紅外光的光能量,并將光能量轉(zhuǎn)換成電信號的器件。通常用的光電器件有光電二極管和光電三極管。光電式傳感器測量微小的位移變化有明顯的效果,但是光電傳感器對材料、電路控制和光電管屬性要求較高:1)吸收紅外光的能力極強(qiáng)2)介電常數(shù)小,以便得到大的輸出電壓。3)介電損耗小。 光電式檢測方法是利用光電傳感器檢測人體內(nèi)血液流動時(shí)對光的透過率或反射率不同而將其轉(zhuǎn)換成電信號的方法。此種方法有兩種方式:一種是對射式,另一種是反射式。對射式是在一個(gè)大小合適的環(huán)的兩側(cè)各放一個(gè)發(fā)射管和一個(gè)接收管,測量時(shí)將人的手指伸到環(huán)中,由于手指中的血流量的變化而使光電接收管的光電流也隨之變化,反射式是光電發(fā)射與光電接收都指向一個(gè)方向,當(dāng)人體內(nèi)的血流發(fā)生變化時(shí)其對光的反射率也隨之變化,從而檢測出心率。這種方法的優(yōu)點(diǎn)是外界干擾信號小,但其最大的難點(diǎn)是傳感器輸出信號小,對后面的放大電路要求較高。此外,對于干擾變化強(qiáng)烈的信號,回路不宜調(diào)制,可視光電管的定向角不同,光軸也不宜把握。 綜上所述,從傳感器的制作工藝、材料的選取、受外界的干擾信號的干擾程度和制作過程中前級電路的處理難易程度上考慮,就選用一對紅外對射二極管實(shí)現(xiàn)。
2.4溫度傳感器的選型 方案一: 由于本設(shè)計(jì)是測溫電路,可以使用熱敏電阻之類的器件,將隨被測溫度變化的電壓或電流采樣,進(jìn)行A/D轉(zhuǎn)換后就可以用單片機(jī)進(jìn)行數(shù)據(jù)處理,實(shí)現(xiàn)溫度顯示。這種設(shè)計(jì)需要用到A/D轉(zhuǎn)換電路,增大了電路的復(fù)雜性,而且要做到高精度也比較困難。
方案二 考慮到在單片機(jī)屬于數(shù)字系統(tǒng),容易想到數(shù)字溫度傳感器,可選用DS18B20數(shù)字溫度傳感器,此傳感器為單總線數(shù)字溫度傳感器,起體積小、構(gòu)成的系統(tǒng)結(jié)構(gòu)簡單,它可直接將溫度轉(zhuǎn)化成串行數(shù)字信號給單片機(jī)處理,即可實(shí)現(xiàn)溫度顯示。另外DS18B20具有3引腳的小體積封裝,測溫范圍為-55~+125攝氏度,測溫分辨率可達(dá)0.0625攝氏度,其測量范圍與精度都能符合設(shè)計(jì)要求。 以上兩種方案相比較,第二種方案的電路、軟件設(shè)計(jì)更簡單,此方案設(shè)計(jì)的系統(tǒng)在功耗、測量精度、范圍等方面都能很好地達(dá)到要求,故本設(shè)計(jì)采用方案二。 2.5系統(tǒng)整體設(shè)計(jì)概述 系統(tǒng)總體設(shè)計(jì)由STC89C52、按鍵、LCD1602、光電傳感器、時(shí)鐘模塊、運(yùn)放等構(gòu)成,系統(tǒng)設(shè)有四個(gè)按鍵,可以設(shè)置上下限脈搏數(shù),當(dāng)超過范圍的時(shí)候單片機(jī)會驅(qū)動蜂鳴器發(fā)響,脈搏測量的時(shí)候需要人把手輕輕的按在光電傳感器上面,由于人脈搏跳動的時(shí)候,血液的透光性不一樣會導(dǎo)致接收器那邊接收的信號強(qiáng)弱不一樣,間接的把人脈搏信號傳回,通過運(yùn)放對其進(jìn)行放大、整形后連接到單片機(jī)的IO口,單片機(jī)利用外部中斷對其進(jìn)行計(jì)數(shù),最終換算成人一分鐘脈搏的跳動次數(shù),最終顯示在液晶屏上。
三、理論設(shè)計(jì) 硬件設(shè)計(jì) 1、硬件原理圖 
2、工作原理 本設(shè)計(jì)利用紅外光電傳感器產(chǎn)生脈沖信號,經(jīng)過放大整形后,輸入單片機(jī)內(nèi)進(jìn)行相應(yīng)的控制,從而測量出一分鐘內(nèi)的脈搏跳動次數(shù),當(dāng)測量的范圍超過設(shè)定的范圍則驅(qū)動蜂鳴器報(bào)警提醒,當(dāng)檢測的體溫超過設(shè)置的溫度上下限也會蜂鳴器報(bào)警提醒,結(jié)果最終可以把采集到的脈搏信號顯示在LCD1602上。 3.1.1單片機(jī)最小系統(tǒng)設(shè)計(jì) 圖3.1 單片機(jī)最小系統(tǒng)電路圖 圖3.1為單片機(jī)最小系統(tǒng)電路圖,單片機(jī)最小系統(tǒng)有單片機(jī)、時(shí)鐘電路、復(fù)位電路組成,時(shí)鐘電路選用了12MHZ的晶振提供時(shí)鐘,作用為給單片機(jī)提供一個(gè)時(shí)間基準(zhǔn),其中執(zhí)行一條基本指令需要的時(shí)間為一個(gè)機(jī)器周期,單片機(jī)的復(fù)位電路,按下復(fù)位按鍵之后可以使單片機(jī)進(jìn)入剛上電的起始狀態(tài)。圖中10K排阻為P0口的上拉電阻,由于P0口跟其他IO結(jié)構(gòu)不一樣為漏極開路的結(jié)構(gòu),因此要加上拉電阻才能正常使用。
3.1.2 液晶原理介紹 液晶顯示器(LCD)英文全稱為Liquid Crystal Display,它一種是采用了液晶控制透光度技術(shù)來實(shí)現(xiàn)色彩的顯示器。和CRT顯示器相比,LCD的優(yōu)點(diǎn)是很明顯的。由于通過控制是否透光來控制亮和暗,當(dāng)色彩不變時(shí),液晶也保持不變,這樣就無須考慮刷新率的問題。 顯示接口用來顯示系統(tǒng)的狀態(tài),命令或采集的電壓數(shù)據(jù)。本系統(tǒng)顯示部分用的是LCD液晶模塊,采用一個(gè)16×2的字符型液晶顯示模塊。 LCD1602引腳圖 液晶寄存器選擇控制如表3.1。 表3.1寄存器選擇控制 | | | | | | | | 讀busy flag(DB7),以及讀取位址計(jì)數(shù)器(DB0~DB6)值 | | | | | | 從數(shù)據(jù)寄存器讀取數(shù)據(jù) |
LCD1602與單片機(jī)接口電路如下:
3.1.3信號采集電路 信號采集電路如圖3-2所示。5MM紅外對管D1與D3組成紅外傳感器。因紅外傳感器輸出的脈沖信號是非常微弱的信號,而且頻率很低(如脈搏50次/分鐘為0.78Hz,200次/分鐘為3.33Hz),并且還伴有各種噪聲干擾,故該信號要經(jīng)過R7、C5低通濾波,去除高頻干擾。當(dāng)傳感器檢測到較強(qiáng)的干擾噪音時(shí),其輸出端的直流電壓信號會有很大變化 圖3.2 信號采集電路 3.1.4信號放大電路 如圖3-3所示,R3與R8的電阻之比為放大器的放大倍數(shù),經(jīng)過計(jì)算所得該放大器的理論值為200倍,但由于8號接口上5V供壓不足再加上材料限制和人為的因素,該放大倍數(shù)只有20倍左右。 圖中C7為耦合電容,作用為隔直流通交流,之所以使用1uF的電容,是為了讓所有的信號通過。 圖3.3 信號放大電路 3.1.5信號比較電路 電壓比較器是一種常用的集成電路。它可用于報(bào)警器電路、自動控制電路、測量技術(shù),也可用于V/F 變換電路、A/D 變換電路、高速采樣電路、電源電壓監(jiān)測電路、振蕩器及壓控振蕩器電路、過零檢測電路等。我們主要介紹其基本概念、工作原理及典型工作電路,電壓比較器是對兩個(gè)模擬電壓比較其大小并判斷出其中哪一個(gè)電壓高,接到的信號電壓小于該值時(shí)顯示0V,當(dāng)大于該值時(shí)顯示5V,這就形成了0和5V的方波。如圖3.4 所示。 圖3.4 放大濾波電路 軟件設(shè)計(jì) 3.2系統(tǒng)軟件總體設(shè)計(jì) 圖3.2系統(tǒng)流程圖 主程序流程圖如圖3.2所示,單片機(jī)上電后先進(jìn)行初始化,清楚一些參數(shù)的初值,然后等待用戶按下對應(yīng)的按鍵并進(jìn)入對應(yīng)的功能,當(dāng)用戶按下測量按鍵的時(shí)候流程如圖3.2(c)所示,單片機(jī)通過定時(shí)15s測量人體的脈搏次數(shù)流程如圖3.2(b)所示,然后再換算出對應(yīng)的真實(shí)的脈搏次數(shù)再在液晶屏幕上顯示流程如圖3.2(a)所示,當(dāng)用戶按下設(shè)置脈搏范圍設(shè)定按鍵后,單片機(jī)根據(jù)用戶按下的按鍵進(jìn)行增加或減少范圍。 延時(shí)子程序:
四、測試方案、測試結(jié)果及分析 4.1軟件調(diào)試 當(dāng)模塊設(shè)計(jì)完成并在ISIS 7 protues中仿真成功后,電路基本確定,但那只是理論值,需要對這些仿真電路進(jìn)行試驗(yàn),以確保這些電路是否適用與該設(shè)計(jì)。 4.2硬件調(diào)試 準(zhǔn)備施焊;加熱焊件;送入焊絲;焊接元件。在焊接過程中要注意假焊,虛焊,焊接不規(guī)則等等問題,盡量避免不必要的錯(cuò)誤。器件安裝焊接完后,就要焊接電線,一定要保證連接端口的正確連接,管腳的位置及所代表的含義不能搞錯(cuò),這樣才能避免電路板出現(xiàn)問題,將裝置供電后,將已寫好的程序下載到單片機(jī)里面,觀察板子的現(xiàn)象。 測試結(jié)果:程序下載好并供電后,LCD顯示屏上顯示14.4°,手指放在紅外燈管上,顯示屏顯示脈搏次數(shù)93,如果脈搏超過預(yù)先設(shè)定的范圍,裝置中的蜂鳴器報(bào)警,測量的脈搏在正常范圍內(nèi),警報(bào)停止報(bào)警。按下功能鍵,可以修改設(shè)置的警告上下限。在測量時(shí),紅外傳感器檢測到的人體信號很微弱,手指的一點(diǎn)抖動都會引起測量心率值的大幅變化,手指盡量別亂動,以免測量數(shù)據(jù)不準(zhǔn)確,導(dǎo)致蜂鳴器一直報(bào)警。 分析:設(shè)計(jì)要求全部實(shí)現(xiàn)。 五、作品功能和使用說明: 作品功能:實(shí)現(xiàn)溫度的測量、脈搏測量。能測出即時(shí)的溫度和脈搏,顯示在LCD屏上。手指放到紅外對管中,2秒內(nèi)讀出心率。同時(shí)還可以設(shè)定上限次數(shù)和下限次數(shù),當(dāng)測量的范圍超過設(shè)定的范圍則驅(qū)動蜂鳴器報(bào)警提醒,當(dāng)檢測的體溫超過設(shè)置的溫度上下限也會蜂鳴器報(bào)警提醒。 使用說明:顯示每分鐘脈搏次數(shù)和溫度。 三個(gè)按鍵:一個(gè)設(shè)置,一個(gè)加,一個(gè)減。 按下設(shè)置的時(shí)候才可以加減。 手指放上去盡量別亂動。 六、心得體會 通過這次課程設(shè)計(jì),學(xué)到了不少課本上沒有的知識,也鍛煉了自己的動手能力,將以前學(xué)過的零散的知識串到一起。經(jīng)過長時(shí)間的設(shè)計(jì)及調(diào)試,軟件仿真基本能實(shí)現(xiàn)基于單片機(jī)的脈搏計(jì)的所有功能。但是硬件的穩(wěn)定性有待進(jìn)一步提高,無法發(fā)現(xiàn)錯(cuò)誤在何處。 綜合設(shè)計(jì)主要涉及硬件和軟件兩方面的內(nèi)容,硬件和軟件開發(fā)能力都獲得了提高。首先硬件方面,基本了解了電子產(chǎn)品的開發(fā)流程和所要做的工作,焊完實(shí)物后,首先是硬件調(diào)試。電路的調(diào)試過程是檢驗(yàn)、修正設(shè)計(jì)方案的實(shí)踐過程,但也是對理論知識的實(shí)際應(yīng)用,解決各種問題的關(guān)鍵環(huán)節(jié),是電路設(shè)計(jì)人員必須掌握的基本技能。基本掌握了Protel99SE原理圖的方法,通過開發(fā)板的設(shè)計(jì)和硬件搭建的過程,對51系單片機(jī)的接口有了更深層次的理解,熟悉了一些單片機(jī)常用的外圍電路引腳和連接方法,如LCD液晶,鍵盤等。并且學(xué)會了分析問題解決問題的能力,加深了對所學(xué)理論知識的理解和運(yùn)用,動手能力得到了很大的提高,創(chuàng)新意識得到了鍛煉。
單片機(jī)源程序如下:
- #include <reg52.h>
- #include <intrins.h>
- #define uint unsigned int
- #define uchar unsigned char
- #define ulong unsigned long //宏定義
- #define LCD_DATA P0 //定義P0口為LCD_DATA
- sbit LCD_RS =P2^5;
- sbit LCD_RW =P2^6;
- sbit LCD_E =P2^7; //定義LCD控制引腳
- sbit Xintiao =P1^0 ; //脈搏檢測輸入端定義
- sbit speaker =P2^4; //蜂鳴器引腳定義
- sbit DQ=P3^7;
- void delay5ms(void); //誤差 0us
- void LCD_WriteData(uchar LCD_1602_DATA); /********LCD1602數(shù)據(jù)寫入***********/
- void LCD_WriteCom(uchar LCD_1602_COM); /********LCD1602命令寫入***********/
- void lcd_1602_word(uchar Adress_Com,uchar Num_Adat,uchar *Adress_Data); /*1602字符顯示函數(shù),變量依次為字符顯示首地址,顯示字符長度,所顯示的字符*/
- void InitLcd();//液晶初始化函數(shù)
- void Tim_Init();
- uchar Xintiao_Change=0; //
- uint Xintiao_Jishu;
- uchar stop;
- uchar View_Data[3];
- uchar View_L[3];
- uchar View_H[3];
- uchar Xintiao_H=100; //脈搏上限
- uchar Xintiao_L=40; //脈搏下限
- uint wendu=0;
- uchar Key_Change;
- uchar Key_Value; //按鍵鍵值
- uchar View_Con; //設(shè)置的位(0正常工作,1設(shè)置上限,2設(shè)置下限)
- uchar View_Change;
- /*****延時(shí)子程序*****/
- void Delay_DS18B20(int num)
- {
- while(num--) ;
- }
- /*****初始化DS18B20*****/
- void Init_DS18B20(void)
- {
- unsigned char x=0;
- DQ = 1; //DQ復(fù)位
- Delay_DS18B20(8); //稍做延時(shí)
- DQ = 0; //單片機(jī)將DQ拉低
- Delay_DS18B20(80); //精確延時(shí),大于480us
- DQ = 1; //拉高總線
- Delay_DS18B20(34);
- }
- /*****讀一個(gè)字節(jié)*****/
- unsigned char ReadOneChar(void)
- {
- unsigned char i=0;
- unsigned char dat = 0;
- for (i=8;i>0;i--)
- {
- DQ = 0; // 給脈沖信號
- dat>>=1;
- DQ = 1; // 給脈沖信號
- if(DQ)
- dat|=0x80;
- Delay_DS18B20(4);
- }
- return(dat);
- }
- void WriteOneChar(unsigned char dat)
- {
- unsigned char i=0;
- for (i=8; i>0; i--)
- {
- DQ = 0;
- DQ = dat&0x01;
- Delay_DS18B20(5);
- DQ = 1;
- dat>>=1;
- }
- }
- /*****讀取溫度*****/
- unsigned int ReadTemperature(void)
- {
- unsigned char a=0;
- unsigned char b=0;
- unsigned int t=0;
- float tt=0;
- Init_DS18B20();
- WriteOneChar(0xCC); //跳過讀序號列號的操作
- WriteOneChar(0x44); //啟動溫度轉(zhuǎn)換
- Init_DS18B20();
- WriteOneChar(0xCC); //跳過讀序號列號的操作
- WriteOneChar(0xBE); //讀取溫度寄存器
- a=ReadOneChar(); //讀低8位
- b=ReadOneChar(); //讀高8位
- t=b;
- t<<=8;
- t=t|a;
- tt=t*0.0625;
- t= tt*10+0.5; //放大10倍輸出并四舍五入
- return(t);
- }
- //=====================================================================================
- //=====================================================================================
- //=====================================================================================
- void main() //主函數(shù)
- {
- InitLcd();
- Tim_Init();
- lcd_1602_word(0x80,16,"Heart Rate: "); //初始化顯示
-
- TR0=1;
- TR1=1; //打開定時(shí)器
- while(1) //進(jìn)入循環(huán)
- {
- if(View_Con==0)
- {
- wendu=ReadTemperature();
- lcd_1602_word(0xc0,10," Temp: ");//顯示第二行數(shù)據(jù)
- LCD_WriteCom(0x80+0x40+10);
- LCD_WriteData(wendu/100+0x30);
- LCD_WriteData(wendu%100/10+0x30);
- LCD_WriteData('.');
- LCD_WriteData(wendu%100%10+0x30);
- LCD_WriteData(0xdf);
- LCD_WriteData('C');
- }
-
- if(Key_Change) //有按鍵按下并已經(jīng)得出鍵值
- {
- Key_Change=0; //將按鍵使能變量清零,等待下次按鍵按下
- View_Change=1;
- switch(Key_Value) //判斷鍵值
- {
- case 1: //設(shè)置鍵按下
- {
- View_Con++; //設(shè)置的位加
- if(View_Con==3) //都設(shè)置好后將此變量清零
- View_Con=0;
- break; //跳出,下同
- }
- case 2: //加鍵按下
- {
- if(View_Con==2) //判斷是設(shè)置上限
- {
- if(Xintiao_H<150) //上限數(shù)值小于150
- Xintiao_H++; //上限+
- }
- if(View_Con==1) //如果是設(shè)置下限
- {
- if(Xintiao_L<Xintiao_H-1)//下限值小于上限-1(下限值不能超過上限)
- Xintiao_L++; //下限值加
- }
- break;
- }
- case 3: //減鍵按下
- {
- if(View_Con==2) //設(shè)置上限
- {
- if(Xintiao_H>Xintiao_L+1)//上限數(shù)據(jù)大于下限+1(同樣上限值不能小于下限)
- Xintiao_H--; //上限數(shù)據(jù)減
- }
- if(View_Con==1) //設(shè)置下限
- {
- if(Xintiao_L>30) //下限數(shù)據(jù)大于30時(shí)
- Xintiao_L--; //下限數(shù)據(jù)減
- }
- break;
- }
- }
- }
- if(View_Change)//開始顯示變量
- {
- View_Change=0;//變量清零
- if(stop==0) //心率正常時(shí)
- {
- if(View_Data[0]==0x30) //最高位為0時(shí)不顯示
- View_Data[0]=' ';
- }
- else //心率不正常(計(jì)數(shù)超過5000,也就是兩次信號時(shí)間超過5s)不顯示數(shù)據(jù)
- {
- View_Data[0]=' ';
- View_Data[1]=' ';
- View_Data[2]=' ';
- }
- switch(View_Con)
- {
- case 0: //正常顯示
- {
- lcd_1602_word(0x80,16,"Heart Rate: ");//顯示一行數(shù)據(jù)
- lcd_1602_word(0x8d,3,View_Data); //第1行顯示心率
- break;
- }
- case 1: //設(shè)置下限時(shí)顯示
- {
- lcd_1602_word(0x80,16,"Heart Rate: ");//第一行顯示心率
- lcd_1602_word(0x8d,3,View_Data);
-
- View_L[0]=Xintiao_L/100+0x30; //將下限數(shù)據(jù)拆字
- View_L[1]=Xintiao_L%100/10+0x30;
- View_L[2]=Xintiao_L%10+0x30;
- if(View_L[0]==0x30) //最高位為0時(shí),不顯示
- View_L[0]=' ';
-
- lcd_1602_word(0xC0,16,"Warning L : ");//第二行顯示下限數(shù)據(jù)
- lcd_1602_word(0xCd,3,View_L);
- break;
- }
- case 2: //設(shè)置上限時(shí)顯示(同上)
- {
- lcd_1602_word(0x80,16,"Heart Rate: ");
- lcd_1602_word(0x8d,3,View_Data);
-
- View_H[0]=Xintiao_H/100+0x30;
- View_H[1]=Xintiao_H%100/10+0x30;
- View_H[2]=Xintiao_H%10+0x30;
- if(View_H[0]==0x30)
- View_H[0]=' ';
-
- lcd_1602_word(0xC0,16,"Warning H : ");
- lcd_1602_word(0xCd,3,View_H);
- break;
- }
- }
- }
- }
- }
- void Time1() interrupt 3 //定時(shí)器1服務(wù)函數(shù)
- {
- static uchar Key_Con,Xintiao_Con;
- TH1=0xd8; //10ms
- TL1=0xf0; //重新賦初值
- switch(Key_Con) //無按鍵按下時(shí)此值為0
- {
- case 0: //每10ms掃描此處
- {
- if((P3&0x07)!=0x07)//掃描按鍵是否有按下
- {
- Key_Con++; //有按下此值加1,值為1
- }
- break;
- }
- case 1: //10ms后二次進(jìn)入中斷后掃描此處(Key_Con為1)
- {
- if((P3&0x07)!=0x07)//第二次進(jìn)入中斷時(shí),按鍵仍然是按下(起到按鍵延時(shí)去抖的作用)
- {
- Key_Con++; //變量加1,值為2
- switch(P3&0x07) //判斷是哪個(gè)按鍵按下
- {
- case 0x06:Key_Value=1;break; //判斷好按鍵后將鍵值賦值給變量Key_Value
- case 0x05:Key_Value=2;break;
- case 0x03:Key_Value=3;break;
- }
- }
- else //如果10ms時(shí)沒有檢測到按鍵按下(按下時(shí)間過短)
- {
- Key_Con=0; //變量清零,重新檢測按鍵
- }
- break;
- }
- case 2: //20ms后檢測按鍵
- {
- if((P3&0x07)==0x07) //檢測按鍵是否還是按下狀態(tài)
- {
- Key_Change=1; //有按鍵按下使能變量,(此變量為1時(shí)才會處理鍵值數(shù)據(jù))
- Key_Con=0; //變量清零,等待下次有按鍵按下
- }
- break;
- }
- }
-
- switch (Xintiao_Con)//此處與上面按鍵的檢測類似
- {
- case 0: //默認(rèn)Xintiao_Con是為0的
- {
- if(!Xintiao)//每10ms(上面的定時(shí)器)檢測一次脈搏是否有信號
- {
- Xintiao_Con++;//如果有信號,變量加一,程序就會往下走了
- }
- break;
- }
- case 1:
- {
- if(!Xintiao) //每過10ms檢測一下信號是否還存在
- {
- Xintiao_Con++;//存在就加一
- }
- else
- {
- Xintiao_Con=0;//如果不存在了,檢測時(shí)間很短,說明檢測到的不是脈搏信號,可能是其他干擾,將變量清零,跳出此次檢測
- }
- break;
- }
- case 2:
- {
- if(!Xintiao)
- {
- Xintiao_Con++;//存在就加一
- }
- else
- {
- Xintiao_Con=0;//如果不存在了,檢測時(shí)間很短,說明檢測到的不是脈搏信號,可能是其他干擾,將變量清零,跳出此次檢測
- }
- break;
- }
- case 3:
- {
- if(!Xintiao)
- {
- Xintiao_Con++;//存在就加一
- }
- else
- {
- Xintiao_Con=0;//如果不存在了,檢測時(shí)間很短,說明檢測到的不是脈搏信號,可能是其他干擾,將變量清零,跳出此次檢測
- }
- break;
- }
- case 4:
- {
- if(Xintiao)//超過30ms一直有信號,判定此次是脈搏信號,執(zhí)行以下程序
- {
- if(Xintiao_Change==1)//心率計(jì)原理為檢測兩次脈沖間隔時(shí)間計(jì)算心率,變量Xintiao_Change第一次脈沖時(shí)為0的,所有走下面的else,第二次走這里
- {
- View_Data[0]=(60000/Xintiao_Jishu)/100+0x30;
- View_Data[1]=(60000/Xintiao_Jishu)%100/10+0x30;
- View_Data[2]=(60000/Xintiao_Jishu)%10+0x30;
-
- if(((60000/Xintiao_Jishu)>=Xintiao_H)||((60000/Xintiao_Jishu)<=Xintiao_L))//心率不在范圍內(nèi)報(bào)警
- speaker=0; //蜂鳴器響
- else
- speaker=1; //不響
-
- View_Change=1; //計(jì)算出心率后啟動顯示
- Xintiao_Jishu=0; //心跳計(jì)數(shù)清零
- Xintiao_Change=0; //計(jì)算出心率后該變量清零,準(zhǔn)備下次檢測心率
- stop=0; //計(jì)算出心率后stop清零
- TR0=0;
- // wendu=ReadTemperature();
- // TR1=0;
- }
- else//第一次脈沖時(shí)Xintiao_Change為0
- {
- Xintiao_Jishu=0; //脈沖計(jì)時(shí)變量清零,開始計(jì)時(shí)
- Xintiao_Change=1;//Xintiao_Change置1,準(zhǔn)備第二次檢測到脈沖時(shí)計(jì)算心率
- TR0=1;
- }
- Xintiao_Con=0; //清零,準(zhǔn)備檢測下一次脈沖
- break;
- }
- }
- }
- }
- /**定時(shí)器T0工作函數(shù)**/
- void Time0() interrupt 1
- {
- TH0=0xfc; //1ms
- TL0=0x18; //重新賦初值
- Xintiao_Jishu++; //心跳計(jì)數(shù)加
- if(Xintiao_Jishu==5000)//心跳計(jì)數(shù)大于5000
- {
- Xintiao_Jishu=0; //數(shù)據(jù)清零
- View_Change=1; //顯示位置1
- Xintiao_Change=0; //置零,準(zhǔn)備再次檢測
- stop=1; //心跳計(jì)數(shù)超過5000后說明心率不正常或者沒有測出,stop置1
- speaker=1; //關(guān)閉蜂鳴器
- }
- }
- /**定時(shí)器初始化函數(shù)**/
- void Tim_Init()
- {
- EA=1; //打開中斷總開關(guān)
- ET0=1; //打開T0中斷允許開關(guān)
- ET1=1; //打開T1中斷允許開關(guān)
- TMOD=0x11; //設(shè)定定時(shí)器狀態(tài)
- TH0=0xfc; //1ms
- TL0=0x18; //賦初值
-
- TH1=0xd8; //10ms
- TL1=0xf0; //賦初值
- }
- /**Adress_Com顯示地址,Num_Adat顯示字符數(shù)量,Adress_Data顯示字符串內(nèi)容**/
- void lcd_1602_word(uchar Adress_Com,uchar Num_Adat,uchar *Adress_Data)
- {
- uchar a=0;
- uchar Data_Word;
- LCD_WriteCom(Adress_Com); //選中地址
- for(a=0;a<Num_Adat;a++) //for循環(huán)決定顯示字符個(gè)數(shù)
- {
- Data_Word=*Adress_Data; //讀取字符串?dāng)?shù)據(jù)
- LCD_WriteData(Data_Word); //顯示字符串
- Adress_Data++; //顯示地址加一
- }
- }
- ……………………
- …………限于本文篇幅 余下代碼請從51黑下載附件…………
復(fù)制代碼
所有資料51hei提供下載:
16 脈搏體溫檢測儀的設(shè)計(jì)與制作2016111435朱波.zip
(731.88 KB, 下載次數(shù): 340)
2019-1-10 21:28 上傳
點(diǎn)擊文件名下載附件
|