基于單片機的脈搏測量儀設計
摘要: 脈搏測量儀在我們的日常生活中已經得到了非常廣泛的應用,通過觀測脈搏信號,可以對人體的健康進行檢查,通常被用于保健中心和醫院。為了提高脈搏測量儀的簡便性和精確度,本課題設計了一種基于51單片機的脈搏測量儀。系統以STC89C52單片機為核心,以光電傳感器利用單片機系統內部定時器來計算時間,由光電傳感器感應產生信號,單片機通過對信號累加得到脈搏跳動次數,時間由定時器定時而得。系統運行中可以通過觀察指示燈閃爍,若均勻閃爍說明測量值準確。系統停止運行時,能夠顯示總的脈搏次數和時間。經測試,系統工作正常,達到設計要求。
本設計利用紅外光電傳感器產生脈沖信號,經過放大整形后,輸入單片機內進行相應的控制,從而測量出一分鐘內的脈搏跳動次數,快捷方便。系統可以供用戶測量當時的脈搏次數,同時還可以設定上限次數和下限次數,當測量的范圍超過設定的范圍則驅動蜂鳴器報警提醒,除此外用戶還可以設定每天鬧鐘提醒測量,時間可以自行設定,結果最終可以把采集到的脈搏信號顯示在LCD1602上。
引 言
脈搏測量在有脈搏時遮擋光線,無脈搏時透光強,所采用的傳感器是紅外接收二極管和紅外發射二極管。通過觀測脈搏信號,可以對人體的健康進行檢查,通常被用于保健中心和醫院。系統可以供用戶測量當時的脈搏次數,同時還可以設定上限次數和下限次數,當測量的范圍超過設定的范圍則驅動蜂鳴器報警提醒,除此外用戶還可以設定每天鬧鐘提醒測量,時間可以自行設定[1]。
從脈搏波中提取人體的生理病理信息作為臨床診斷和治療的依據,歷來都受到中外醫學界的重視。系統以STC89C52單片機為核心,以光電傳感器利用單片機系統內部定時器來計算時間,由光電傳感器感應產生信號,單片機通過對信號累加得到脈搏跳動次數,時間由定時器定時而得。系統運行中可以通過觀察指示燈閃爍,若均勻閃爍說明測量值準確。幾乎世界上所有的民族都用過“摸脈”作為診斷疾病的手段。脈搏波所呈現出的形態(波形)、強度(波幅)、速率(波速)和節律(周期)等方面的綜合信息,在很大程度上反映出人體心血管系統中許多生理病理的血流特征,但人體的生物信號多屬于強噪聲背景下的低頻的弱信號, 脈搏波信號更是低頻微弱的非電生理信號, 必需經過放大和后級濾波以滿足采集的要求。
第一章 概述
1.1 選題的背景和意義
脈搏攜帶有豐富的人體健康狀況的信息,自公元三世紀我國最早的脈學專著《脈經》問世以來,脈學理論得到不斷的發展和提高。在中醫四診(望、聞、問、切)中,脈診占有非常重要的位置。脈診是我國傳統醫學中最具特色的一項診斷方法,其歷史悠久,內容豐富,是中醫“整體觀念”、“辨證論證”的基本精神的體現與應用。脈診作為“綠色無創”診斷的手段和方法,得到了中外人士的關注。但由于中醫是靠手指獲取脈搏信息,雖然脈診具有簡便、無創、無痛的特點易為患者接受,然而在長期的醫療實踐中也暴露出一些缺陷。首先,切脈單憑醫生手指感覺辨別脈象的特征,受到感覺、經驗和表述的限制,并且難免存在許多主觀臆斷因素,影響了對脈象判斷的規范化;其次,這種用手指切脈的技巧很難掌握;再則,感知的脈象無法記錄和保存影響了對脈象機理的研究。脈診的這種定性化和主觀性,大大影響了其精度與可行性,成為中醫脈診應用、發展和交流中的制約因素。為了將傳統的中醫藥學發揚光大,促進脈診的應用和發展,必須與現代科技相結合,實現更科學、客觀的診斷[1]。
醫院的護士每天都要給住院的病人把脈記錄病人每分鐘脈搏數,方法是用手按在病人腕部的動脈上,根據脈搏的跳動進行計數。為了節省時間,一般不會作1分鐘的測量,通常是測量10秒鐘時間內心跳的數,再把結果乘以6即得到每分鐘的心跳數,即使這樣做還是比較費時,而且精度也不高。為了提高脈搏測量的精確與速度,多種脈搏測量儀被運用到醫學上來,從而開辟了一條全新的醫學診斷方法。
早在1860年Vierordt 創建了第一臺杠桿式脈搏描記儀,國內20世紀50年代初朱顏將脈搏儀引用到中醫脈診的客觀化研究方面。此后隨著機械及電子技術的發展,國內外在研制中醫脈象儀方面進展很快,尤其是70年代中期,國內天津、上海、江西等地相繼成立了跨學科的脈象研究協作組,多學科共同合作促使中醫脈象研究工作進入了一個新的境界。脈象探頭式樣很多,有單部、三部、單點、多點、剛性接觸式、軟性接觸式、氣壓式、硅杯式、液態汞、液態水、子母式等組成,脈象探頭的主要原件有應變片、壓電晶體、單晶硅、光敏元件、PVDF壓電薄膜等,其中以單部單點應變片式為最廣泛,不過近年來正在向三部多點式方向設計[2]。
目前脈搏測量儀在多個領域被廣泛應用,除了應用于醫學領域,如無創心血管功能檢測、妊高癥檢測、中醫脈象、脈率檢測等等,商業應用也不斷拓展,如運動、健身器材中的心率測試都用到了技術先進的脈搏測量儀。
1.2 脈搏測量儀的發展與應用
隨著科學技術的發展,脈搏測量技術也越來越先進,對脈搏的測量精度也越來越高,國內外先后研制了不同類型的脈搏測量儀,而其中關鍵是對脈搏傳感器的研究。起初用于體育測量的脈搏測試集中在對接觸式傳感器的研究,利用此類傳感器所研制的指脈、耳脈等測量儀各有其優缺點。指脈測量比較方便、簡單,但因為手指上的汗腺較多,指夾常年使用,污染可能會使測量靈敏度下降:耳脈測量比較干凈,傳感器使用環境污染少,容易維護。但因耳脈較弱,尤其是當季節變化時,所測信號受環境溫度影響明顯,造成測量結果不準確。過去在醫院臨床監護和日常中老年保健中出現的日常監護儀器,如便攜式電子血壓計,可以完成脈搏的測量,但是這種便攜式電子血壓計利用微型氣泵加壓橡膠氣囊,每次測量都需要一個加壓和減壓的過程,存在體積龐大、加減壓過程會有不適、脈搏檢測的精確度低等缺點。
近年來國內外致力于開發無創非接觸式的傳感器,這類傳感器的重要特征是測量的探測部分不侵入機體,不造成機體創傷,能夠自動消除儀表自身系統的誤差,測量精度高,通常在體外,尤其是在體表間接測量人體的生理和生化參數。
其中光電式脈搏傳感器是根據光電容積法制成的脈搏傳感器,通過對手指末端透光度的監測,間接檢測出脈搏信號。具有結構簡單、無損傷、精度高、可重復使用等優點。通過光電式脈搏傳感器所研制的脈搏測量儀已經應用到臨床醫學等各個方面并收到了理想效果。
人體心室周期性的收縮和舒張導致主動脈的收縮和舒張,是血流壓力以波的形式從主動脈根部開始沿著整個動脈系統傳播,這種波成為脈搏波。從脈搏波中提取人體的心理病理信息作為臨床診斷和治療的依據,歷來都受到中外醫學界的重視。脈搏波所呈現出的形態(波形)、強度(波幅)、速率(波速)和節律(周期)等方面的綜合信息,在很大程度上反映出人體心血管系統中許多生理病理的血流特征,因此對脈搏波采集和處理具有很高的醫學價值和應用前景。但人體的生物信號多屬于強噪聲背景下的低頻的弱信號, 脈搏波信號更是低頻微弱的非電生理信號,因此必需經過放大和后級濾波以滿足采集的要求。
第二章 總體方案的論證與設計
2.1主控模塊的選型和論證
方案一:
采用MSP430系列單片機,該單片機是TI公司1996年開始推向市場的一種16位超低功耗的混合信號處理器。其內部集成了很多模擬電路、數字電路和微處理器,提供強大的功能。不過該芯片昂貴不適合一般的設計開發[3]。
方案二
采用51系列的單片機,該單片機是一個高可靠性,超低價,無法解密,高性能的8位單片機,32個IO口,且STC系列的單片機可以在線編程、調試,方便地實現程序的下載與整機的調試。
因此選用方案二中的51系列單片機作為主控芯片。
2.2顯示模塊的選型和論證
方案一:
采用點陣式數碼管顯示,點陣式數碼管是由八行八列的發光二極管組成,對于顯示文字比較合適,如采用在顯示數字顯得太浪費,且價格也相對較高,所以不用此種作為顯示。
方案二:
采用LED數碼管動態掃描,LED數碼管價格雖適中,對于顯示數字也最合適,而且采用動態掃描法與單片機連接時,占用單片機口線少。但是由于數碼管動態掃描需要借助74LS164移位寄存器進行移位,該芯片在電路調試時往往有很多障礙,所以不采用LED數碼管作為顯示。
方案三:
采用LCD液晶顯示屏,液晶顯示屏的顯示功能強大,可顯示大量文字,圖形,顯示多樣,清晰可見,對于本設計而言一個LCD1602的液晶屏即可,價格也還能接受,需要的借口線較多,但會給調試帶來諸多方便。
所以本設計中方案三中的LCD1602液顯示屏作為顯示模塊。
2.3傳感器的選型和論證
方案一:
采用壓電傳感器用來提取人的脈搏信號,壓電傳感器是利用某些電介質受力后產生的壓電效應制成的傳感器。所謂壓電效應是指某些電介質在受到某一方向的外力作用而發生形變(包括彎曲和伸縮形變)時,由于內部電荷的極化現象,會在其表面產生電荷的現象。通過此現象可以提取出人的脈搏信號。
方案二:
采用光電傳感器提取人體脈搏信號,授予手指組織可以分成皮膚、肌肉、骨骼等非血液組織和血液組織,其中非血液組織的光吸收量是恒定的,而在血液中,靜脈血的搏動相對動脈血是十分微弱的,可以忽略,因此可以認為光透過手指后的變化僅由動脈血的充盈而引起,那么在恒定波長的光源的照射下,通過檢測透過手指的光強將可以間接測量到人體的脈搏信號[4]。
由于光電傳感器較壓電傳感器容易在一般的地方可以買得到,因此這里選用光電傳感器來提取人體脈搏信號。
2.5系統整體設計概述
系統總體設計由STC89C52、按鍵、LCD1602、光電傳感器、時鐘模塊、運放等構成,如圖2.1所示,系統設有四個按鍵,可以設置上下限脈搏數,當超過范圍的時候單片機會驅動蜂鳴器發響,脈搏測量的時候需要人把手輕輕的按在光電傳感器上面,由于人脈搏跳動的時候,血液的透光性不一樣會導致接收器那邊接收的信號強弱不一樣,間接的把人脈搏信號傳回,通過運放對其進行放大、整形后連接到單片機的IO口,單片機利用外部中斷對其進行計數,最終換算成人一分鐘脈搏的跳動次數,最終顯示在液晶屏上。
第三章 系統硬件電路設計
3.1主控模塊
主控模塊模塊在整個系統中起著統籌的作用,需要檢測鍵盤等各種參數,同時驅動液晶顯示相關參數,在這里我們選用了51系列單片機中的STC89C52單片機作為系統的主控芯片。
51系列單片機最初是由Intel 公司開發設計的,但后來Intel 公司把51 核的設計方案賣給了幾家大的電子設計生產商,譬如SST、Philip、Atmel 等大公司。因此市面上出現了各式各樣的均以51 為內核的單片機[6]。這些各大電子生產商推出的單片機都兼容51 指令、并在51 的基礎上擴展一些功能而內部結構是與51一致的。
STC89C52有40個引腳,4個8位并行I/O口,1個全雙工異步串行口,同時內含5個中斷源,2個優先級,2個16位定時/計數器。STC89C52的存儲器系統由4K的程序存儲器(掩膜ROM),和128B的數據存儲器(RAM)組成。
STC89C52單片機的基本組成框圖見圖3.1所示。
圖3.1 STC89C52單片機結構圖
3.1.3單片機最小系統設計
圖3.3 單片機最小系統電路圖
圖3.3為單片機最小系統電路圖,單片機最小系統有單片機、時鐘電路、復位電路組成,時鐘電路選用了12MHZ的晶振提供時鐘,作用為給單片機提供一個時間基準,其中執行一條基本指令需要的時間為一個機器周期,單片機的復位電路,按下復位按鍵之后可以使單片機進入剛上電的起始狀態。圖中10K排阻為P0口的上拉電阻,由于P0口跟其他IO結構不一樣為漏極開路的結構,因此要加上拉電阻才能正常使用。
3.2 LCD液晶顯示器簡介
由于本設計中要求顯示界面顯示一些參數,因此這里選用了LCD1602作為界面顯示,可以把一些相關的參數進行顯示。
3.2.1 液晶原理介紹
液晶顯示器(LCD)英文全稱為Liquid Crystal Display,它一種是采用了液晶控制透光度技術來實現色彩的顯示器。和CRT顯示器相比,LCD的優點是很明顯的。由于通過控制是否透光來控制亮和暗,當色彩不變時,液晶也保持不變,這樣就無須考慮刷新率的問題。
顯示接口用來顯示系統的狀態,命令或采集的電壓數據。本系統顯示部分用的是LCD液晶模塊,采用一個16×2的字符型液晶顯示模塊。
點陣圖形式液晶由 M 行×N 列個顯示單元組成,假設 LCD 顯示屏有64行,每行有 128列,每 8列對應 1 個字節的 8 個位,即每行由 16 字節,共 16×8=128個點組成,屏上 64×16 個顯示單元和顯示 RAM 區 1024 個字節相對應,每一字節的內容和屏上相應位置的亮暗對應。一個字符由 6×8 或 8×8點陣組成,即要找到和屏上某幾個位置對應的顯示 RAM區的 8 個字節,并且要使每個字節的不同的位為‘1’,其它的為‘0’,為‘1’的點亮,為‘0’的點暗,這樣一來就組成某個字符。但對于內帶字符發生器的控制器來說,顯示字符就比較簡單了,可讓控制器工作在文本方式,根據在LCD 上開始顯示的行列號及每行的列數找出顯示 RAM對應的地址,設立光標,在此送上該字符對應的代碼即可。
3.2.2液晶模塊簡介
LCD1602液晶模塊采用HD44780控制器,hd44780具有簡單而功能較強的指令集,可以實現字符移動,閃爍等功能,LM016L與單片機MCU通訊可采用8位或4位并行傳輸兩種方式,hd44780控制器由兩個8位寄存器,指令寄存器(IR)和數據寄存器(DR)忙標志(BF),顯示數RAM(DDRAM),字符發生器ROMA(CGOROM)字符發生器RAM(CGRAM),地址計數器RAM(AC)。IR用于寄存指令碼,只能寫入不能讀出,DR用于寄存數據,數據由內部操作自動寫入DDRAM和CGRAM,或者暫存從DDRAM和CGRAM讀出的數據,BF為1時,液晶模塊處于內部模式,不響應外部操作指令和接受數據,DDTAM用來存儲顯示的字符,能存儲80個字符碼,CGROM由8位字符碼生成5*7點陣字符160中和5*10點陣字符32種.8位字符編碼和字符的對應關系, CGRAM是為用戶編寫特殊字符留用的,它的容量僅64字節,可以自定義8個5*7點陣字符或者4個5*10點陣字符,AC可以存儲DDRAM和CGRAM的地址,如果地址碼隨指令寫入IR,則IR自動把地址碼裝入AC,同時選擇DDRAM或CGRAM,LCD1602液晶模塊的引腳圖如圖3.4所示。
圖3.4 LCD1602引腳圖
液晶寄存器選擇控制如表3.1。
表3.1寄存器選擇控制
| | |
| | |
| | 讀busy flag(DB7),以及讀取位址計數器(DB0~DB6)值 |
| | |
| | |
3.2.3液晶顯示部分與STC89C52的接口
如圖3.5所示。用STC89C52的P0口作為數據線,用P1.2、P1.1、P1.0分別作為LCD的EN、R/W、RS。其中EN是下降沿觸發的片選信號,R/W是讀寫信號,RS是寄存器選擇信號本模塊設計要點如下:顯示模塊初始化:首先清屏,再設置接口數據位為8位,顯示行數為1行,字型為5×7點陣,然后設置為整體顯示,取消光標和字體閃爍,最后設置為正向增量方式且不移位[10]。向LCD的顯示緩沖區中送字符,程序中采用2個字符數組,一個顯示字符,另一個顯示電壓數據,要顯示的字符或數據被送到相應的數組中,完成后再統一顯示.首先取一個要顯示的字符或數據送到LCD的顯示緩沖區,程序延時2.5ms,判斷是否夠顯示的個數,不夠則地址加一取下一個要顯示的字符或數據。
圖3.5 LCD1602與STC89C52的引腳連接圖
3.3信號采集電路設計
此部分電路的功能是由傳感器將脈搏信號轉換為電信號,一般為幾十毫伏,必須加以放大,以達到整形電路所需的電壓,一般為幾伏。放大后的信號波形是不規則的脈沖信號,因此必須加以濾波整形,整形電路的輸出電壓應滿足計數器的要求。選擇電路:所選放大整形電路框圖如圖3.8所示。
圖3.8 放大整形電路框圖
3.4.1傳感器簡介
傳感器采用了紅外光電轉換器,作用是通過紅外光照射人的手指的血脈流動情況,把脈搏跳動轉換為電信號,其原理電路如圖3.9所示。
圖3.9 傳感器信號調節原理電路
如圖3.9中,紅外管VD采用ST188。用+5V電源供電,R1取150Ω,R2取33kΩ,當人把手指放在發光二極管和光電二極管之間的時候,光電二極管接收到的信號會隨人脈搏強度的變化而變化[11]。
3.4.2濾波電路
圖3.10 放大濾波電路
圖3.10為脈搏計的放大濾波信號,由于脈搏信號輸出的信號十分微弱,一般在uV級別,除此外輸出的信號一般會伴隨很大的噪聲干擾,因此在這里用LM358搭建起一個放大和濾波電路。
3.4.3放大整形電路
經過放大濾波后的脈搏信號仍是不規則的脈沖信號,且有低頻干擾,仍不滿足計數器的要求,必須采用整形電路,這里選用了滯回電壓比較器,如圖3.11所示,其目的是為了提高抗干擾能力。集成運放采用了LM358,除此外LM358還接上了一個LED用作指示脈搏跳動的狀態。
圖3.11波形整形電路
第四章 系統軟件設計
4.1系統軟件總體設計
圖4.1系統流程圖
主程序流程圖如圖4.1所示,單片機上電后先進行初始化,清楚一些參數的初值,然后等待用戶按下對應的按鍵并進入對應的功能,當用戶按下測量按鍵的時候流程如圖4.1(c)所示,單片機通過定時15s測量人體的脈搏次數流程如圖4.1(b)所示,然后再換算出對應的真實的脈搏次數再在液晶屏幕上顯示流程如圖4.1(a)所示,當用戶按下設置脈搏范圍設定按鍵后,單片機根據用戶按下的按鍵進行增加或減少范圍。
首先先調用液晶自定義的字庫,設置好DDRAM地址后在第一行顯示,根據程序中的數據設置顯示數據的首地址并設置循環量,在循環過程中不斷的取字符代碼直到終止,第二行的顯示過程同一行的顯示過程一樣,兩行顯示完畢后便結束子程序,如圖4.2所示[15]。
圖4.2 LCD1602初始化子函數流程圖
4.2程序設計原理
軟件任務分析和硬件電路設計結合進行,哪些功能由硬件完成,哪些任務由軟件完成,在硬件電路設計基本定型后,也就基本上決定下來了。
軟件任務分析環節是為軟件設計做一個總體規劃。從軟件的功能來看可分為兩大類:一類是執行軟件,它能完成各種實質性的功能,如測量,計算,顯示,打印,輸出控制和通信等,另一類是監控軟件,它是專門用來協調各執行模塊和操作者的關系,在系統軟件中充當組織調度角色的軟件。這兩類軟件的設計方法各有特色,執行軟件的設計偏重算法效率,與硬件關系密切,千變萬化。
軟件任務分析時,應將各執行模塊一一列出,并為每一個執行模塊進行功能定義和接口定義(輸入輸出定義)。在各執行模塊進行定義時,將要牽扯到的數據結構和數據類型問題也一并規劃好。
各執行模塊規劃好后,就可以監控程序了。首先根據系統功能和鍵盤設置選擇一種最適合的監控程序結構。相對來講,執行模塊任務明確單純,比較容易編程,而監控程序較易出問題。這如同當一名操作工人比較容易,而當一個廠長就比較難了。
軟件任務分析的另一個內容是如何安排監控軟件和各執行模塊。整個系統軟件可分為后臺程序(背景程序)和前臺程序。后臺程序指主程序及其調用的子程序,這類程序對實時性要求不是太高,延誤幾十ms甚至幾百ms也沒關系,故通常將監控程序(鍵盤解釋程序),顯示程序和打印程序等與操作者打交道的程序放在后臺程序中執行;而前臺程序安排一些實時性要求較高的內容,如定時系統和外部中斷(如掉電中斷)。也可以將全部程序均安排在前臺,后臺程序為“使系統進入睡眠狀態”,以利于系統節電和抗干擾。
第五章 系統調試
5.1軟件調試
基于單片機的脈搏計系統是多功能的數字型設計,,所以對于它的程序也較為復雜,所以在編寫程序和調試時出現了相對較多的問題。最后經過多次的模塊子程序的修改,一步一步的完成,最終解決了軟件。在軟件的調試過程中主要遇到的問題如下:
問題1:燒入程序后,LCD液晶顯示閃動,而且亮度不均勻。
解決:首先對調用的延時進行逐漸修改,可以解決顯示閃動問題。其次,由于本作品使作動態掃描方式顯示的數字,動態掃描很快,人的肉眼是無法看出,但是調用的顯示程序時,如果不在反回時屏蔽掉最后的附值,則會出現很亮的現象,所以在顯示的后面加了屏蔽子令,最后解決了此問題。
問題2:當用戶按下按鍵的時候,單片機讀取的數值跟設定的數值不對。
解決:重新檢查矩陣鍵盤電路的連接,重新建立一個新的對應關系。
5.2硬件調試
基于單片機的脈搏計系統的電路較大,對于焊接方面更是不可輕視,龐大的電路系統中只要出于一處的錯誤,則會對檢測造成很大的不便,而且電路的交線較多,對于各種鋒利的引腳要注意處理,否則會刺破帶有包皮的導線,則會對電路造成短路現象[14]。
在本脈搏計的設計調試中遇到了很多的問題;叵脒@些問題只要認真多思考都是可以避免的,以下為主要的問題:
問題1:最開始的時候以為單片機IO口直接可以驅動蜂鳴器發聲,后來調試的時候久久不能出聲音(見附錄C)。
解決:經過查找相關資料,知道揚聲器需要三極管來驅動,后來把三極管放大器加上系統便可以正常工作。
問題2:開始的時候由于沒想到脈搏信號十分微弱大概在uV級別,因此沒有放大足夠的倍數,單片機最后沒有檢測到脈搏的信號(見附錄C)。
解決:經過查找相關資料,確定脈搏信號的幅值范圍后,增加放大器的放大倍數就解決問題。
5.3調試結果
1.放大倍數的增加
傳感器的輸出端經示波器觀察有幅度很小的正弦波,但經整形輸出后檢測到的脈沖還是很弱,在確定電路沒有問題的情況下,加強信號的放大倍數,調整電阻R23和R27的阻值。
2.時鐘的調試
根據晶體振蕩頻率計算出內部定時器的基本參數,通過運行一段時間可通過秒表來校正后,看時間誤差的量,以這個量為依據改變程序中的內部定時器基本參數,就可使時鐘調準確。
3.開機后無顯示
首先檢查交流電源部分,有無交流,若無則可能保險管或變壓器燒壞,如有繼續查直流有無,如無則電源已燒壞,可更換解決。
4.顯示正常但經適當運動后測量,脈搏次數沒有增加
可能是前置放大級有問題,可采用更換的辦法判斷并排除。
5.進人測量狀態, 但測量值不穩定
主要是光電傳感器受到電磁波等干擾,其次是損壞或有虛焊。
6.開機后顯示不正;虬存I失靈
可查手指擺放的位置或按鍵電路,若無故障則是硬件損壞。
經過一系列的問題查找后系統最終能正常工作,并完成所有的功能。
5.4誤差分析
表5.1誤差分析表
注:實際的脈搏次數以聽診器測出的脈搏次數為參考值。
表3.1列出了測量值,但存在誤差,由于傳感器和其他器件本身并非理想線性,實測數據進行了線性補償。
由均方差公式得:
=0.59
誤差分析:經校準,非線性補償后,誤差以基本達到要求。
結 論
通過這次畢業設計,我學到了不少課本上沒有的知識,也鍛煉了自己的動手能力,將以前學過的零散的知識串到一起。經過我長時間的設計及調試,本系統基本能實現基于單片機的脈搏計的所有功能。不足之處有:1.硬件的穩定性有待進一步提高2.系統人性化還不足。
我的綜合設計主要涉及硬件和軟件兩方面的內容,通過這些我的硬件和軟件開發能力都獲得了提高。首先硬件方面,基本了解了電子產品的開發流程和所要做的工作;菊莆樟薖rotel99SE原理圖的方法,并設計了一個單片機最小系統。通過開發板的設計和硬件搭建的過程,使我對51系單片機的接口有了更深層次的理解,熟悉了一些單片機常用的外圍電路引腳和連接方法,如LCD液晶,鍵盤等。并且我學會了分析問題解決問題的能力,加深了對所學理論知識的理解和運用。我的動手能力得到了很大的提高,創新意識得到了鍛煉。
致 謝
在這次課程設計的過程中,我的指導老師11111老師給予了我很大的幫助,提供了相關的資料,對我的課程設計作品給予了指導和支持。使我順利圓滿的完成了此次課稱設計設計。在此,向1111老師表示衷心的感謝!同時,也要感謝學院提供制板等設施,使我的設計得以順利完成。
古人云:預則立,不預則廢。祖先曾經教導我們:一年之計在于春,一日之計在于晨。作為即將走向社會的我們又何嘗不是如此?一個沒有規劃的人生,就像一場沒有球門的足球賽,滿場亂踢;一個沒有規劃的人生,就像一葉在茫茫大海上漫無目標的小舟,隨波飄蕩。在我們即將走向社會的時候,我們必須對自己的職業生涯進行規劃。羅素曾說:選擇職業就是選擇你自己的將來。因此我們要針對社會需要,結合自身的情況及早做好相應準備,為我們走向社會打下堅實的基礎。俗話說:磨刀不誤砍柴功。為適應社會需要,促進自我發展,我們除了學好本專業外,還應輔修相關專業知識,積極參加社會實踐活動,培養工作能力,努力提高綜合素質,同時努力培養特長,形成自身競爭優勢。
最后,再次感謝學院給了我們機會,以及電子信息與電氣工程學院的各位老師和許多的朋友、同學在各個方面給予了我很多的幫助和支持,讓我堅持到了最后,謝謝你們!
單片機源程序如下:
- #include <reg52.h> //調用單片機頭文件
- #define uchar unsigned char //無符號字符型 宏定義 變量范圍0~255
- #define uint unsigned int //無符號整型 宏定義 變量范圍0~65535
- #include <intrins.h>
-
- sbit dq = P1^5; //18b20 IO口的定義
- sbit beep = P1^4; //蜂鳴器IO口定義
-
- bit flag_300ms ;
-
-
-
- uchar code table_num[]="0123456789abcdefg";
-
- sbit rs=P1^0; //寄存器選擇信號 H:數據寄存器 L:指令寄存器
- sbit rw=P1^1; //寄存器選擇信號 H:數據寄存器 L:指令寄存器
- sbit e =P1^2; //片選信號 下降沿觸發
-
- unsigned char i=0,timecount=0,displayOK=0,rate=0,aa=0;
- unsigned int time[6]={0};
-
-
- /***********************1ms延時函數*****************************/
- void delay_1ms(uint q)
- {
- uint i,j;
- for(i=0;i<q;i++)
- for(j=0;j<110;j++);
- }
-
-
- /********************************************************************
- * 名稱 : delay_uint()
- * 功能 : 小延時。
- * 輸入 : 無
- * 輸出 : 無
- ***********************************************************************/
- void delay_uint(uint q)
- {
- while(q--);
- }
-
- /********************************************************************
- * 名稱 : write_com(uchar com)
- * 功能 : 1602命令函數
- * 輸入 : 輸入的命令值
- * 輸出 : 無
- ***********************************************************************/
- void write_com(uchar com)
- {
- e=0;
- rs=0;
- rw=0;
- P0=com;
- delay_uint(25);
- e=1;
- delay_uint(100);
- e=0;
- }
-
- /********************************************************************
- * 名稱 : write_data(uchar dat)
- * 功能 : 1602寫數據函數
- * 輸入 : 需要寫入1602的數據
- * 輸出 : 無
- ***********************************************************************/
- void write_data(uchar dat)
- {
- e=0;
- rs=1;
- rw=1;
- P0=dat;
- delay_uint(25);
- e=1;
- delay_uint(100);
- e=0;
- }
-
- /********************************************************************
- * 名稱 : write_string(uchar hang,uchar add,uchar *p)
- * 功能 : 改變液晶中某位的值,如果要讓第一行,第五個字符開始顯示"ab cd ef" ,調用該函數如下
- write_string(1,5,"ab cd ef;")
- * 輸入 : 行,列,需要輸入1602的數據
- * 輸出 : 無
- ***********************************************************************/
- void write_string(uchar hang,uchar add,uchar *p)
- {
- if(hang==1)
- write_com(0x80+add);
- else
- write_com(0x80+0x40+add);
- while(1)
- {
- if(*p == '\0') break;
- write_data(*p);
- p++;
- }
- }
-
- /***********************lcd1602上顯示特定的字符************************/
- void write_zifu(uchar hang,uchar add,uchar date)
- {
- if(hang==1)
- write_com(0x80+add);
- else
- write_com(0x80+0x40+add);
- write_data(date);
- }
-
- /***********************lcd1602上顯示兩位十進制數************************/
- void write_sfm3(uchar hang,uchar add,uint date)
- {
- if(hang==1)
- write_com(0x80+add);
- else
- write_com(0x80+0x40+add);
- write_data(0x30+date/100%10);
- write_data(0x30+date/10%10);
- write_data(0x30+date%10);
- }
-
- /***********************lcd1602初始化設置************************/
- void init_1602()
- {
- write_com(0x38); //
- write_com(0x0c);
- write_com(0x06);
- delay_uint(1000);
- write_string(1,0," Heart Rate ");
- write_string(2,0," 000/min ");
- }
-
- /*************定時器0初始化程序***************/
- void time_init()
- {
- EA = 1; //開總中斷
- TMOD = 0X01; //定時器0、定時器1工作方式1
- ET0 = 1; //開定時器0中斷
- TR0 = 1; //允許定時器0定時
- }
-
-
- /***********外部中斷0初始化程序****************/
- void init_int0() //外部中斷0初始化程序
- {
- EX0=1; //允許外部中斷0中斷
- EA=1; //開總中斷
- IT0 = 1; //外部中斷0負跳變中斷
- }
-
- /****************主函數***************/
- void main()
- {
- init_1602(); //1602初始化
- time_init(); //初始化定時器
- init_int0(); //外部中斷0初始化程序
- while(1)
- {
- if(displayOK==0)//如果顯示關
- {
- rate = 0;
- }
- else//如果顯示開
- {
- rate=60000/(time[1]/5+time[2]/5+time[3]/5+time[4]/5+time[5]/5);
- }
- write_sfm3(2,5,rate);
-
- delay_1ms(300);
- }
- }
-
- void int0() interrupt 0
- {
- EX0=0;//暫時關外部中斷
- if(timecount<8) //當連續兩次檢測時間間隔小于8*50ms=400ms不處理
- {
- TR0=1;//開定時器
- }
- else
- {
- time[i]=timecount*50+TH0*0.256+TL0/1000;//算出間隔時間
- TH0 = 0x3c;
- TL0 = 0xb0; // 50ms 12M
- timecount=0;//50ms計數清零
- i++;
- ……………………
- …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼
所有資料51hei提供下載:
論文.doc
(578.5 KB, 下載次數: 45)
2018-7-4 17:48 上傳
點擊文件名下載附件
下載積分: 黑幣 -5