久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 41840|回復: 11
打印 上一主題 下一主題
收起左側

基于51單片機的心率計設計論文與源碼

  [復制鏈接]
跳轉到指定樓層
樓主
ID:319601 發表于 2018-4-30 21:32 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式

目錄

摘要              3

第一章引言              4

    1.1 心率計的研究背景和意義              4

    1.2 心率計的研究現狀及發展動態              4

第二章方案論證及元器件選擇              5

    2.1 研究內容及設計指標              5

    2.2 方案設計與論證              5

      2.2.1 傳感器的選擇與論證              5

      2.2.2 信號處理方案選擇和論證              7

      2.2.3 單片機系統選擇和論證              8

      2.2.4 顯示模塊選擇和論證              9

    2.3元器件選擇及其功能介紹              9

      2.3.1單片機AT89S52              9

      2.3.2紅外傳感器              11

      2.3.3雙運算放大器LM358N              11

      2.3.4 LCD1602              12

第三章硬件系統設計              13

    3.1 系統設計框圖              13

    3.2 信號采集電路              14

    3.3 信號放大電路              15

    3.4 信號比較電路              17

    3.5 LCD顯示電路              18

    3.7 鍵盤電路              19

第四章軟件系統設計              19

4.1 測量計算原理              20

4.2 主程序流程圖              20

4.3 中斷程序流程圖              21

4.4 定時器T0,T1的中斷服務程序              21

第五章系統測試與結果分析              22

5.1 測試方法和儀器              22

5.2 仿真與焊接階段              23

5.2.1 仿真階段              23

5.2.2 焊接與完成階段              23

5.3 測試數據與結果分析              25

5.3.1測量結果與分析              25

5.3.2幾種主要系統干擾和影響              27

結束語              28

參考文獻              29

附錄一:系統仿真圖

附錄二:系統原理圖和PCB

附錄三:源程序




基于單片機的心率計設計

摘要:在社會飛速發展的今天,人們的物質文化生活得到了極大的提高,但同時多種疾病威脅著人們的生命;而心臟病又是人們難以預防的突發致命疾病,所以健康也被越來越多的人所重視。本設計要解決的問題就是可以測量心率、預防心臟病等心臟方面疾病的數字心率計。

便攜式數字人體心率計運用AT89S52單片機作為核心控制處理單元,采用紅外傳感器作為傳感器,運用軟件和硬件雙重濾波技術實現了對人體心率信號的準確檢測。測量范圍限可以用按鍵調節,并進行聲音報警,傳感器可以放在身體脈搏明顯的任何部位,測量結果以數字方式方式顯示,測量精確到2次/分。經過大量實驗,本心率計已經基本達到題目要求部分的全部指標。


1.1 心率計的研究背景和意義

伴隨著全球科技與經濟的飛速發展與進步,關愛生命與健康已成為人類的共同追求。心腦血管疾病是危害人類生命和健康的最主要的疾病。每年因心腦血管疾病致死的人數位居人類死亡總數的首位,耗費的醫療費用居高不下,給家庭和社會造成巨大負擔[1]。近年來,由于飲食習慣不合理、生活節奏加快等原因,心腦血管疾病的發病率更是呈逐年上升的趨勢。如何科學的降低心腦血管疾病的發病率和死亡率,有效的減輕心腦血管疾病帶來的社會和家庭負擔,已經成為全社會所面臨的一個十分嚴峻問題。

今天,越來越多的人已認識到健康生活方式和疾病預防的重要性,對擁有日常家庭化和個性化的健康監測和疾病預防手段的需求也日益增大。在脈搏波研究方面,國內外已經出現了眾多的技術和理論,基于現代醫學技術,利用脈搏波對人體心血管健康進行無創檢測的方法和儀器不斷涌現。現在的任務是既要對脈搏波的檢測分析及對心血管健康檢測應用方面做進一步研究,研制一種面向家庭和社區醫療服務的,能夠對人體動脈硬化的程度和其他心血管健康狀況進行無創檢測的儀器,讓更多的人對自己的心血管健康狀態進行及時的了解,對心血管疾病能夠及早的發現和進行預防。

基于上述現狀和背景,不難發現:心血管功能檢測新技術、新方法的研究以及心血管功能監測類家用電子醫療保健儀器的開發已刻不容緩。它不僅能滿足當前的醫療保健急需,也能為維持和發展我國家用數字醫療事業,為推行實施國家“家庭醫療保健工程”做出積極和長久的貢獻[2]。

1.2 心率計的研究現狀及發展動態

  自上世紀80年代以來,基于血流動力流變學和彈性腔理論的無創傷血管功能檢測方法的研究逐漸受到廣泛的關注。很多不同學科的研究員與醫學家合作,研究出各種應用型人體心率傳感器,有單部、三部、液態水、子母式單點,多點,氣壓式、硅杯式、軟性接觸式、剛性接觸式等,組成脈搏傳感器的主要部件有壓電晶體、單晶硅、陶瓷應變片、光敏組件、pvdf壓電薄膜等,其中以單部單點應變片式應用最為廣泛。

到目前,用于評價大動脈的結構和方法已有很多。血管造影和其他造影技術等有創方法可精確評價動脈管腔或分心動脈壁結構。但是這些方法操作復雜,費用高昂,需要非常精密的技術設備,限制了其只能在大型臨床研究中應用,另外,還有一些其他的無創方法,這些主要根據超聲技術和計算機分析圖像和超聲信號,來研究某些動脈軸和位點的功能和結構,這些相對復雜的技術僅用于某些臨床研究實驗室。在無創方法中,脈搏波速度的檢測已經在較長時間內廣泛應用于評價動脈壁擴張性和硬度。該方法無創傷,操作簡單、結果準確、重復性好,因此被廣泛應用于大型治療和流行病學研究當中,并且,該方法非常適合于向家庭和社區醫療服務推廣。國外,諸如法國研制生產的康普樂儀、日本科林公司的動脈硬化檢測儀等就是利用此種方法,并在歐美國家得到廣泛的普及,國內也有醫院引進了這種設備,但是價格昂貴[7][8]。國內也有多家單位開始了此類設備的研究,在2007年,也有類似的產品相繼上市。但是,這些儀器均被應用在大型醫療機構中,成本高,檢測費用高,功能局限于檢測,不能滿足患者隨時隨地的檢測的需要。


第二章  方案論證及元器件選擇

2.1  研究內容及設計指標

研究內容:

便攜式數字人體心率計運用AT89S52單片機作為核心控制處理單元,采用紅外傳感器作為傳感器,運用軟件和硬件雙重濾波技術實現了對人體心率信號的準確檢測,最終以數值形式顯示在LCD上。

本課題開發一款低功耗、便攜式數字心率計,具體要求如下:

   (1)實時顯示被測者心率值,并顯示;


2.2  方案設計與論證

2.2.1  傳感器的選擇與論證

(1)壓電式

壓電式傳感器的檢測方法是利用壓力傳感器或振動傳感器將人體脈搏振動轉換成電信號。常見的壓力傳感器可用現有的壓電陶瓷代替。壓電式元件的內阻極高,通常采用兩片相同的元件,使其極性反向相疊,由夾在中間的銅片作為一個電極。這樣,中央電極處于全空狀態,可以用具有良好絕緣性的導線引出。此種方法的優點是傳感器種類多,一般的傳感器輸出信號也比較大,對后面的放大電路要求不高。壓電陶瓷具有成本低、取材方便、易于提高敏感度等特點。

(2)聲電式

聲電式傳感器的作用是將氣體、液體或固體中傳播的機械振動轉換成電信號。因此,它也屬于力學量傳感器。它的制作材料一般由不定性無煙煤顆粒或壓電陶瓷構成。顆粒式聲電傳感器的優點是耐用、成本低和容易制作,缺點是顆粒的機械磨損和接觸表面上的瞬間電弧會使顆粒逐漸老化,從而導致雜音大、性能不穩定和非線性;而壓電陶瓷式的聲電傳感器在檢測聲音信號時卻存在著一定的缺陷。

聲電式檢測方法是利用微音傳感器將人體的振動的聲音轉換成電信號。此種方法的優點是作為傳感器的微音傳感器可利用現有的駐極體或電容式話筒,但其后面的電路要采取一定的措施將環境的聲音干擾信號濾去。

(3)光電式

光電系統通常是指能敏感由紫外光到紅外光的光能量,并將光能量轉換成電信號的器件。通常用的光電器件有光電二極管和光電三極管。光電式傳感器測量微小的位移變化有明顯的效果,但是光電傳感器對材料、電路控制和光電管屬性要求較高:1)吸收紅外光的能力極強2)介電常數小,以便得到大的輸出電壓。3)介電損耗小。

光電式檢測方法是利用光電傳感器檢測人體內血液流動時對光的透過率或反射率不同而將其轉換成電信號的方法。此種方法有兩種方式:一種是對射式,另一種是反射式。對射式是在一個大小合適的環的兩側各放一個發射管和一個接收管,測量時將人的手指伸到環中,由于手指中的血流量的變化而使光電接收管的光電流也隨之變化,反射式是光電發射與光電接收都指向一個方向,當人體內的血流發生變化時其對光的反射率也隨之變化,從而檢測出心率。這種方法的優點是外界干擾信號小,但其最大的難點是傳感器輸出信號小,對后面的放大電路要求較高。此外,對于干擾變化強烈的信號,回路不宜調制,可視光電管的定向角不同,光軸也不宜把握。

綜上所述,從傳感器的制作工藝、材料的選取、受外界的干擾信號的干擾程度和制作過程中前級電路的處理難易程度上考慮,就選用一對紅外對射二極管實現。

紅外傳感器的檢測、放大、濾波和整型并傳到單片機工作系統的過程見下圖2-1所示:

圖 2-1信號檢測處理工作流程圖


2.2.2 信號處理方案選擇和論證


   (1)小規模數字電路:采用小規模數字電路也可完成此方案的基本功能,

電路框圖如圖2-2所示。

圖2-2小規模數字電路心率計

這種方案是采用一個二進制計數器,將處理后的脈波信號進行計數,在1分鐘內將計數值顯示。此方案的不足是電路結構復雜,實現一個相對簡單一些的過程控制功能都要用好多片電路,且數字電路器件功能單一,一旦硬件電路定型就難以改動,尤其在題目要求中,要實現心率測量并顯示,還要超限報警等等,則顯得力不從心。

    (2) PLD:可編程邏輯器件(PLD)突破了小規模數字電路功能單一的缺點,可以按照設計者設計分析出來的邏輯要求去編程定義,應用起來確實方便,設計也比較靈活。針對題目要求,該方案應該至少由傳感器電路、閘門電路、計數器電路、數字鎖存電路、顯示電路、數據存儲電路、PC接口電路七部分構成,在閘門信號允許時間內對被測信號計數,閘門寬度為單位時間。顯然電路復雜,一旦涉及到數據處理、數據分析、數據記憶、數據通信等功能要求時,其實現難度可想而知。      

   (3)單片機:單片機的發展和應用大家有目共睹,其體積小、重量輕、價格低、可靠性高、耗電少和靈活機動等許多優點已經被默認。在科學計算、數據處理及信息管理、CAD、CAM、CAA、CAI、過程控制和儀表智能化、軍事領域、多媒體系統和信息高速公路甚至家用電器和家庭自動化等方面都可以看到單片機的影子,可謂立下了汗馬功勞。

    單片機內部包含了CPU、RAM、ROM、I/O口、總線甚至A/D及D/A轉換電路,功能十分強大。許多在數字電路、模擬電路中的難題都在單片機的程序設計中得到了出乎意料的解決效果,通過對程序和外部少許電路的修改即可以改變整個設計系統的功能。可移植性和可維護性得到極大的改善。在數據分析、處理、記憶、通訊等方面表現相當出色。根據題目提出的要求,單片機控制當為首選。以單片機為主外設顯示器、鍵盤、通訊、打印接口等硬件電路,完成脈波計數、數據運算、顯示、通訊、記憶等功能。

    根據以上方案比較,本課題決定采用以紅外傳感器為傳感器,以單片機為主控芯片外輔少量硬件電路完成數據處理、記憶、顯示、通訊等功能。硬件框圖如圖2-3所示。

圖 2-3單片機心率計


2.2.3 單片機系統選擇

AT89C2051、AT89C51單片機是最常用的單片機,是一種高性能、低損耗、CMOS八位微處理器。AT89C2051與MCS-51系列的單片機在指令系統和引腳上完全兼容,而且能使系統具有許多新的功能,功能強、靈活性高而且價格低廉。AT89S52可構成真正的單片機最小應用系統,增加系統可靠性,縮小系統體積,降低了系統成本。程序長度只要不大于4K,四個I/O口全部提供給用戶。系統運行中需要存放的中間變量較少,可不必再擴充外部RAM。采用AT89S52單片機,其內部有8KB單元的程序存儲器。而且具有三個定時器,正好滿足系統多機通信時所用。 比較以上方案,綜合考慮單片機的各部分資源,因此此次設計選用AT89S52。


2.2.4顯示模塊選擇和論證

   (1)液晶顯示

    液晶單元是容性負載,液晶的電阻在大多數情況下可以忽略不計,是無極性的,即正壓和負壓的作用效果是一樣的。液晶顯示器件在直流電壓作用下會發生電解作用,故必須用交流驅動,并且限定交流成分中的直流分量不大于幾十mv;由于液晶在電場作用下光學性能的改變是依靠液晶作為彈性連續體的彈性變形,響應時間長,所以交變驅動電壓的作用效果不取決于其峰值,在頻率小于1000Hz情況下,液晶透光率的改變只與外電壓的有效值相關。液晶顯示信息量大、長壽命、低壓驅動等優點。

    (2)LED動態顯示

    數碼管是一類顯示屏 通過對其不同的管腳輸入相對的電流,會使其發亮,從而顯示出數字能夠顯示 時間、日期、溫度等所有可用數字表示的參數。由于它的價格便宜 使用簡單 在電器 特別是家電領域應用極為廣泛,空調、熱水器、冰箱等等。絕大多數熱水器用的都是數碼管,其他家電也用液晶屏與熒光屏。

數碼管動態顯示接口是單片機中應用最廣泛的顯示方式之一,動態驅動是將所有數碼管的八個顯示筆劃"a,b,c,d,e,f,g,dp"的同名端連起來,另外為每個數碼管的公共極COM增加位選通控制電路,位選通由各自獨立的I/O線控制,當單片機有字形碼輸出時,所有數碼管都接收到相同的字形碼。通過分時輪流控制各個數碼管的COM端,就使各個數碼管輪流受控顯示,這就是動態驅動。在動態顯示過程中,每位數碼管的點亮時間為1~2ms,由于發光二極管的余輝效應及人的視覺暫留現象,實際上盡管數碼管不是同時點亮,但只要掃描的速度很快,給人的印象就是穩定的顯示數據,不會有感覺到閃爍,動態顯示的效果和靜態顯示是一樣的,能夠節省大量的I/O端口,而且功耗更低。

根據以上兩種方案比較,液晶顯示具有其獨特的優越性,顯示效果好,控制簡單等優點。所以就選擇液晶來實現顯示功能。

2.3 元器件選擇及功能介紹

2.3.1單片機AT89S52

   (1)主要性能:

·8KB可改編程序Flash存儲器(可經受1000次的寫入/擦除周期)  

·全靜態工作:0Hz~24MHz

·三級程序存儲器保密

·128×8字節內部RAM

·32條可編程I/O線

·2個16位定時器/計數器

·6個中斷源

·可編程串行通道

·片內時鐘振蕩器

   (2)功能特性描述:

AT89S52是一種低功耗、高性能CMOS8位微控制器,具有8K 在系統可編程Flash 存儲器。使用Atmel 公司高密度非易失性存儲器技術制造,與工業80C51 產品指令和引腳完全兼容。片上Flash允許程序存儲器在系統可編程,亦適于常規編程器。在單芯片上,擁有靈巧的8位CPU 和在系統可編程Flash,使得AT89S52為眾多嵌入式控制應用系統提供高靈活、有效的解決方案。

AT89S52具有以下標準功能: 8k字節Flash,256字節RAM,32 位I/O 口線,看門狗定時器,2個數據指針,三個16 位定時器/計數器,一個6向量2級中斷結構,全雙工串行口,片內晶振及時鐘電路。另外,AT89S52 可降至0Hz 靜態邏輯操作,支持2種軟件可選擇節電模式。空閑模式下,CPU停止工作,允許RAM、定時器/計數器、串口、中斷繼續工作。掉電保護方式下,RAM內容被保存,振蕩器被凍結,單片機一切工作停止,直到下一個中斷或硬件復位為止。AT89S52的引腳結構如圖2-4所示。

   圖2-4  AT89S52的引腳結構

2.3.2紅外傳感器

    紅外技術是在最近幾十年中發展起來的一門新興技術。它在科技,國防,和工農業生產等領域得到廣泛的應用,特別是在科學研究、軍事工程和醫學方面起著極其重要的作用。例如在紅外制導火箭、紅外成像、紅外遙感等。而紅外輻射技術的重要工具就紅外傳感器,紅外傳感器已經在現代化的生產實踐中發揮著它的巨大作用。尤其是在實現遠距離溫度監測與控制方面,紅外溫度傳感器以其優異的性能,滿足了多方面的要求,因而在產品傳感器大顯身手的地方。因此紅外傳感器的發展前景也是不可估量的。本設計的心率計的傳感器采用一對5MM的紅外對管外輔少許電路所組成的紅外傳感器,紅外對管是紅外線發射管與光敏接收管,或者紅外線接收管,或者紅外線接收頭配合在一起使用時候的總稱。

    紅外線發射管在LED封裝行業中主要有三個常用的波段,如下850NM、875NM、940NM。根據波長的特性運用的產品也有很大的差異,850NM波長的主要用于紅外線監控設備,875NM主要用于醫療設備,940NM波段的主要用于紅外線控制設備。EG:紅外線遙控器、光電開關、光電記數設備等。

光敏接收管是一個具有光敏特征的PN結,屬于光敏三極管,具有單向導電性,因此工作時需加上反向電壓。無光照時,有很小的飽和反向漏電流(暗電流)。此時光敏管不導通。當光照時,飽和反向漏電流馬上增加,形成光電流,在一定的范圍內它隨入射光強度的變化而增大。

2.3.3雙運算放大器LM358N

LM358 內部包括有兩個獨立的、高增益、內部頻率補償的雙運算放大器,適合于電源電壓范圍很寬的單電源使用,也適用于雙電源工作模式,在推薦的工作條件下,電源電流與電源電壓無關。它的使用范圍包括傳感放大器、直流增益模塊和其他所有使用運算放大器的可用單電源供電的場合。

   特性:

   ● 低輸入偏流

   ● 內部頻率補償

   ● 直流電壓增益高(約100dB)

   ● 單位增益頻帶寬(約1MHz)

   ● 電源電壓范圍寬:單電源(3—30V);雙電源(±1.5 一±15V)

   ● 低功耗電流,適合于電池供電

   ● 低輸入失調電壓和失調電流

   ● 共模輸入電壓范圍寬,包括接地

   ● 差模輸入電壓范圍寬,等于電源電壓范圍

   ● 輸出電壓擺幅大(0 至Vcc-1.5V)

   LM358的引腳結構如圖2-5所示。

圖2-5 LM358的引腳結構

2.3.4  LCD1602顯示模塊

1602  LCD是指顯示的內容為16X2,即可以顯示兩行,每行16個字符液晶模塊(顯示字符和數字)。

管腳功能
1602采用標準的16腳 接口,其中:

第1腳:VSS為電源地

第2腳:VCC接5V電源正極

第3腳:V0為液晶顯示器對比度調整端,接正電源時對比度最弱,接地電源時對比度最高(對比度過高時會 產生“鬼影”,使用時可以通過一個10K的電位器調整對比度)。

第4腳:RS為寄存器選擇,高電平1時選擇數據寄存器、低電平0時選擇指令寄存器。

第5腳:RW為讀寫信號線,高電平(1)時進行讀操作,低電平(0)時進行寫操作。

第6腳:E(或EN)端為使能(enable)端,高電平(1)時讀取信息,負跳變時執行指令。

第7~14腳:D0~D7為8位雙向數據端。

第15~16腳:空腳或背燈電源。15腳背光正極,16腳背光負極。



第三章  硬件系統設計

3.1 系統設計框圖

心率計的總體設計電路框圖如圖3-1所示,主要包括信號采集電路、放大電路、比較電路和單片機信號處理電路和液晶顯示電路。先用紅外傳感器采集與心跳同頻率的信號,當人體組織半透明度的數值較大時,紅外發射管Dl發射出的透過人體組織的光強度很弱,光敏三極管無法導通,輸出高電平;當人體組織半透明度的數值較小時,紅外發射管Dl發射出的透過人體組織的光強度較強,光敏三極管導通,輸出低電平。這樣就形成了頻率與脈搏次數成正比的低頻信號,它是近似于正弦的波形。

當脈搏為40次/分時,檢測到的頻率是0.78Hz,當脈搏為40次/分時,檢測到的頻率是3.33Hz,從傳感器過來的是低頻信號。該低頻信號首先經RC振蕩器濾波以消除高頻干擾,經無極性隔直流電容C3、C5加到線性放大器的輸入端。運算放大器將此信號放大100倍,并與R3、R4、C6組成的低通T型濾波器濾除殘留的干擾。正弦信號經微分形成尖脈沖信號,單穩態振蕩電路將尖脈沖信號轉化為同頻率的長脈沖信號,該脈沖信號通過R12送到單片機后,經過軟件對信號的處理,最后在以數值形式顯示在液晶上。

   

圖 3-1 系統設計原理框圖

3.2 信號采集電路

信號采集電路如圖3-2所示。5MM紅外對管D1與D3組成紅外傳感器。因紅外傳感器輸出的脈沖信號是非常微弱的信號,而且頻率很低(如脈搏50次/分鐘為0.78Hz,200次/分鐘為3.33Hz),并且還伴有各種噪聲干擾,故該信號要經過R7、C5低通濾波,去除高頻干擾。當傳感器檢測到較強的干擾噪音時,其輸出端的直流電壓信號會有很大變化。

圖3-2 信號采集電路

3.3信號放大電路

如圖3-3所示,R3與R8的電阻之比為放大器的放大倍數,經過計算所得該放大器的理論值為200倍,但由于8號接口上5V供壓不足再加上材料限制和人為的因素,該放大倍數只有20倍左右。

  圖中C7為耦合電容,作用為隔直流通交流,之所以使用1uF的電容,是為了讓所有的信號通過。信號放大電路仿真圖如圖3-4所示。


圖 3-3 信號放大電路



3.4信號比較電路

電壓比較器是一種常用的集成電路。它可用于報警器電路、自動控制電路、測量技術,也可用于V/F 變換電路、A/D 變換電路、高速采樣電路、電源電壓監測電路、振蕩器及壓控振蕩器電路、過零檢測電路等。我們主要介紹其基本概念、工作原理及典型工作電路,電壓比較器是對兩個模擬電壓比較其大小并判斷出其中哪一個電壓高,接到的信號電壓小于該值時顯示0V,當大于該值時顯示5V,這就形成了0和5V的方波。如圖3-7 所示。

圖3-7 電壓比較器


3.5  LCD1602顯示電路

LCD1602與單片機接口電路如下:

3.6 鍵盤電路

    因為I/O口足夠用,鍵盤設計采用線性鍵盤。三個引腳通過按鍵接地。有程序控制掃描。3個按鍵分別接到CPU的P12、P13、P14上,正常心率范圍的設置,以便在超出限制時報警提示。


圖 3-10鍵盤電路


第四章 系統軟件設計

基于單片機心率計的軟件設計主要由主程序流程圖、中斷程序流程圖及顯示子程序組成。C語言程序有利于實現較復雜的算法,匯編語言程序則具有較高的效率且容易精細計算程序運行的時間,而心率計的程序既有較復雜的計算(時間t內的平均值),又要求精細計算程序運行時間(動脈搏動時間),所以控制程序可采用C語言和匯編語言混合編程。


4.1測量計算原理

設K個連續的動脈搏動所用時間為t(秒),在時間 t 內心率的平均值為n(次/分),則:

         n = 60K/t                                               (4-1)

為了能夠控制用單片機計算機測定t值,我們利用脈動信號控制(在K個連續的脈搏周期內)單片機的定時/計數器T0定時(定時1ms中斷一次),工作寄存器對中斷次數進行計數,然后讀取計數值。設該計數值為N,于是有:

         t = 0.001N                                              (4-2)

把(2)帶入(1)得到:

         n = 60k/0.001N =60000K/N                                (4-3)

式(3)就是利用單片計算機測定心率值的數學模型(誤差小于0.4%)。在該單片機系統中,K = 1~~9(用戶可通過按鍵自行設置)。可測心率范圍20次/分~~200次/分(N的范圍:300~~30000)。

4.2主程序流程圖

程序流程圖如圖4-1所示。程序初始化是單片機程序必需的,它的主要任務是確定中斷入口地址和程序入口。然后顯示全零,目的是為了區分是否有信號送入,當沒有信號送入時,顯示全零,則說明心率計沒有正常工作,反之,則正常工作。

設計中比較重要的一部分是定時l00ms,它主要是為采樣6s建立基礎。系統運用定時器T1定時來實現100ms的定時,中斷等待占用程序執行的絕大部分時間,是一個死循環語句,只有當中斷滿足條件時,才執行中斷服務子程序,進行累加計數的結果,累加之后,判斷采樣的次數,如果采樣未滿60次,說明不到6 s,返回繼續采樣、等待中斷,直到采樣60次為止,之后把6s內采樣得到的次數由二進制數轉化為十進制數,送到液晶進行顯示。


圖 4-1 程序流程圖                           圖 4-2 中斷程序流程圖


4.3中斷程序流程圖

心率的有效測量范圍為40次—120次/分鐘,為了消除外界信號的干擾,在定時器中斷程序中加入了對頻率大小的判斷,濾除掉小于40次/分鐘和大于120次/分鐘的脈沖信號,中斷程序如圖4-2所示。

4.4定時器T0和T1中斷服務程序

定時器T0的中斷流程圖如圖4-3所示,定時器T1的中斷服務流程圖如圖4-4所示。


圖 4-3  定時器T0的中斷                 圖 4-4  定時器T1的中斷

服務程序流程圖                        服務程序流程圖


第五章 系統測試與結果分析

5.1 測試方法和儀器

(1) 時基測量:心率測量儀的精度在很大程度上取決于系統的時間基準,因而對1MS時間定時要用儀器校準,我們用的是TDS210數字示波器。在T0定時中斷服務程序中首先對外部的某一端口的狀態不斷取反,用示波器測端口的周期,如有誤差可在程序中改變TL0的值,直到時間滿足要求為止。

(2) 測量精度測試:用信號發生器產生一方波,其頻率與測量范圍相符,(40~120次/分)分別測量40次/分、80次/分、100次/分、120次/分,觀察心率儀的測量結果與與信號發生器輸出的頻率是否相符,如誤差大于±2次/分時可再細調TL0的值,如不能滿足要求可用軟件與TL0的值同時調節,直到滿足要求為止。

使用儀器:

示波器TDS210

信號發生器GFG-8015G

萬用表FLUKE73

+-5V電源YB1711B

單片機仿真器E2000/S

編程器kile


5.2仿真與焊接階段5.2.1仿真階段

    當模塊設計完成并在ISIS 7 protues中仿真成功后,電路基本確定,但那只是理論值,需要對這些仿真電路進行試驗,以確保這些電路是否適用與該設計。

5.2.2焊接與完成階段

在完成實驗階段測試后,這時電路的元器件及各種電阻電容的值就已經確定。可以實物的焊接。

(1)焊前處理

焊接前,應對元件引腳或電路板的焊接部位進行焊前處理。

①焊接位置氧化層的清除

用小刀刮去金屬引線表面的氧化層,使引腳部分具有金屬光澤。轉印電路板可用細紗紙將銅箔打光后,均勻涂上一層松香。

②元件鍍錫

在處理過引線上鍍錫。可將引線沾上松香后,將帶錫的烙鐵頭壓在引線上,轉動引線。即可使引線均勻地鍍上一層很薄的錫層。焊接前,用剝線鉗剝去絕緣外皮,再經過以上處理,才能正式焊接。若是多股金屬絲的導線,打光后應先擰在一起,然后再鍍錫。

(2) 焊接技

做好焊前處理之后,就可正式進行焊接。

①焊接方法:焊接,檢查,剪短。

a.右手持電烙鐵。左手用鑷子夾持元件或導線。焊接前,電烙鐵要充分預熱5分鐘。烙鐵頭刃面上要鍍錫,即帶上一層薄薄的焊錫。

b.將烙鐵頭刃面緊貼在焊點處。電烙鐵與水平面大約成45度角。以便于熔化的錫從烙鐵頭上覆蓋到焊點上。將烙鐵頭停留在焊點處2~3秒鐘。

C.移開烙鐵頭。左手仍持元件不動。等焊點上的錫冷卻凝固后,才可松開左手。

d.用鑷子轉動引線,確認不松動,然后可用偏口鉗剪去多余的引線。

②焊接質量

焊接時,要保證每個焊點焊接牢固、接觸良好。要保證焊接質量。應是錫點光亮,圓滑而無毛刺,錫量適中。錫和被焊物融合牢固。不應有虛焊和假焊。虛焊是焊點處只有少量錫焊住,造成接觸不良,時通時斷。假焊是指表面上好像焊住了,但實際上并沒有焊上,有時用手一拔,引線就可以從焊點中拔出。這兩種情況將給電子制作的調試和檢修帶來極大的困難。只有經過大量的、認真的焊接實踐,才能避免這兩種情況。

焊接電路板時,一定要控制好時間。太長,電路板將被燒焦,或造成焊點脫落。從電路板上拆卸元件時,可將電烙鐵頭貼在焊點上,待焊點上的錫熔化后,將元件拔出。

由于本次設計采用單片機開發板來焊接,因此最小系統部分只用焊接元件不用另外布線,減輕了焊接部分的工作量,同時是電路板更美觀。雖然用單片機開發板來焊接,但是在焊接過程中也必須認真謹慎,避免虛焊和短路。每焊完一個元器件或者一條線路都要用萬用表檢查焊接是否成功,最終按照附錄一所示仿真圖焊接實物。


5.3 測試數據與結果分析

5.3.1測量結果與分析

   (1)用儀器測量:用信號發生器作信號源,產生一個40~200次/分的方波,觀察心率儀讀數與信號發生器輸出的頻率是否相等。表5-1給出了部分測量結果。

表5-1  信號發生器測量結果

測量序號

信號發生器示值及示波器

心率儀示值

1

40

40(低限報警)

2

80

80

3

150

150

4

120

120(高限報警)

由以上測量結果看,用信號發生器產生的信號用心率儀測量時其測量誤差為0,且在報警的上下限可報警。

   (2)實際測量:對同一同學和不同的同學進行測量,同時由另一同學用聽診器測量脈搏,表5-2給出了部分測量結果。

表5-2實際測量結果比較

測量序號

聽診器測量

心率計值

誤差

1

88

89

1

1

89

88

1

1

90

92

2

2

72

73

1

3

67

65

2

4

94

95

1

在實際測量時人工測量的數值與心率儀測量的數值會有誤差,在測同一人時其誤差只要在允許范圍內,有時也超過測量精度,這是因為人工測量時的計數起始時間與結束時間掌握不準所至。

由信號發生器產生的信號測量時沒有誤差,而實際測量時產生誤差,這是因為信號發生器產生的頻率穩定,而實際測量時被測人的脈波穩定性、強度不穩定。

示波器顯示的方波以及對應的心率計顯示如下圖5-2,5-3所示。


                       

                            圖5-2 示波器顯示方波波形




5.3.2幾種主要系統干擾與影響

   (1) 陽光的干擾。

因為本心率計是通過紅外光線透過手指采集到信號,進而對信號處理得到人體的心率值,光照在本系統中很關鍵。而且在各種不同的環境中,外界光照的強度不一樣,這對實驗的干擾卻大。但是外界光照對于人體是均衡的,即各處光照強度相同,對人體內變化的影響是相同的,即可以相互抵消。

   (2) 測量過程中手指的抖動。

紅外傳感器檢測到的人體信號很微弱,手指的一點抖動都會引起測量心率值的大幅變化。為了解決這個問題,在設計中,把紅外對管相距一定距離(夠放下食指)之后固定死,這樣在測量的時候只要被測者盡量保持手指不動,就可以大大減小手指抖動對試驗的影響。

   (3) 呼吸的影響。

試驗的原理主要是血液中的含氧量的變化進而導致人體組織變化而檢測心率的,這樣就使得均勻呼吸和急促呼吸使人體內的含氧量變化很大。據試驗所得,當人劇烈運動之后呼吸會比較局促,這時他的心率值就會波動很大。正常情況下 ,心率指的是當人心平氣和時的心跳值。


總結和展望

心率指心臟每分鐘搏動的次數,它能夠反映心臟的工作狀態。而心率計是常用的醫學檢查設備,實時準確的心率測量在病人監控臨床治療及體育競賽等方面都有著廣泛的應用。

但在現實生活中,這種儀器可以直接測量心率不是很普遍,在許多小醫院中,醫生仍使用古老的手動式聽診器,大大影響了效率和治療時間。這為心率計的研究和生產奠定了必要的基礎。

這篇文章是基于單片機的心率計設計,現在有一些市場研究和設計為基礎的FPGA設計的心率,無論是原理和過程基本上是一樣的!心率是由身體微弱的傳感器信號接收的原則,因為人體的信號弱,一般放大系數要求高,超過100倍。

心率計的硬件設計,包括微控制器的系統及顯示電路、信號采集和信號放大和濾波電路三部分組成。單片機采用AT89S52或其兼容系列。具有精度高12MHz晶體振蕩器以獲得更穩定的時鐘頻率,減少了測量誤差。單片機的P1.0的輸出端口40kHz的超聲波換能器所需的方波信號,外部中斷0來監測從紅外傳感器輸出信號采集電路的信號。顯示電路采用簡單實用的液晶顯示器,信號用LM358芯片放大。

基于單片機心率計的軟件設計流程由主程序,中斷子程序流程圖和顯示子程序組成。據我所知C語言程序有利于實現更復雜的算法,匯編語言程序則具有較高的效率且容易精細計算程序運行的時間,而心率計的程序既有較復雜的計算(時間t內的平均值),又要求精細計算程序運行時間(動脈搏動時間),所以控制程序可以混合C和匯編語言編程的。

焊完實物后,首先是硬件調試。電路的調試過程是檢驗、修正設計方案的實踐過程,但也是對理論知識的實際應用,解決各種問題的關鍵環節,是電路設計人員必須掌握的基本技能。

把電子元器件連接起來,實現特定功能的關鍵一步是調試。調試方法有兩種:分塊調試法和整體調試法。在硬件檢測完之后,在沒有問題的情況下可以輸入程序,調試程序的可行性,并加以修正,配合程序改動系統的原理圖。

文中的心率計使用了脈搏波作為源信號,當然我還可以通過對心電圖的分析來研究心率,它們的后繼電路部分結構都大同小異,主要的區別是前段的信號采集。本心率計適用于4—9V直流電壓,工作電流為100mA左右,心率計通電后,將手指固定在紅外傳感器之間即可檢測到人體的信號,并在液晶上顯示出來!

當然它也存在著一定的問題,但我想在未來的研制和生產中,肯定會大大提高它的性能 ,極力改善它的缺點。


結束語


首先,我要感謝我的指導老師在畢業設計中給予我悉心指導和嚴格要求,正是在許老師您的細心指導和關注之下,我順利完成了畢業論文設計和實物的制作。

接著我要感謝學校和學院給了我們這么一次展示自己能力的機會,大學即將結束,在踏入社會前,學校為我們安排這么一次畢業 度上有助于提高我的學業水平和生活適應能力。

最后,我要感謝和我一起做畢業設計的同學。在短短5個月的畢業設計,你們給了我許多寶貴的意見和很大的幫助,沒有你們我很難完成學業以及畢業設計,真誠的感謝你們。

同時,我還要感謝我的室友和身邊的朋友,是他們給了我自信和力量,在和他們的相互幫助和啟發中,才有我今天的小小收獲。

還有許許多多給予我學業上鼓勵和幫助的朋友,在此也一并表示衷心地感謝!謝謝大家!






參考文獻

[1] 陳文彬, 王友赤. 診斷學[M]. 人民衛生出版社, 2002.45-90.
[2] 王瑞元, 孫學川, 熊開宇. 運動生理學[M]. 人民體育出版社, 2002.76-81.

[3]姜元恩,邢武;基于脈搏波速度測量的動脈硬化檢測系統的設計與實現[J].自動化與儀器儀表,2007.8.12(5).

[4]姜元恩,邢武:半導體應變片式脈搏傳感器在動躲硬純檢測系統中酶應用[Z].安徽省傳感器技術與產業化發展論壇,2007.10.

[5]朱彤、李婉媚.脈搏波傳導速度測定的新認識[J].醫療保健器具,2006.(8).

[6]羅志昌、張松、楊文鳴.脈搏波波形特征信息的研究[N].北京工業大學學報.1996.1.10(11).

[7]趙玉霞等.橈動脈脈圖在心血管血流動力學定量監測中的價值[N].山東醫科大學學報.1994.1.20(1).

[8]陳春曉等.無倉Ⅱ,血管功能測試診斷儀的研究[J].生物醫學工程學雜志,2003.1.15(33).

[9][日].西山一郎,兆十編著. 耿連發,潘維林譯. 自律型機器人制作[J]. 科學出版社OHM社 2002.3.8-102.

[10] [德] WOLFGANG KLOSTERHALFEN University ofDusseldorf, 4000 Dusseldorf, Federal Republic of Germany. A computer-controlled cardiotachometer1 980, Vol. 12 (1), 58-62.

[11]K.D.TAYLOR.Technicalnote--(Keywords---Cardiotachometer,Pulsegenerator)Precision cardiotachometer calibrator .Med. & Biol. Eng. & Comput.1977. 15.476-478.











附錄一:系統原理圖



附錄:系統PCB

附錄:源程序




  1. #include<reg52.h>
  2. #include<1602.h>
  3. unsigned int s=0;                //下降沿累加中間計數變量

  4. unsigned int maibo;                //一分鐘的脈搏頻率
  5. unsigned int num;                //中間計數每50ms累加一次
  6. unsigned char mc_num[10];              //用來做中值濾波算法的中間變量
  7. unsigned char t=0;                 //中間變量

  8. void init0(void);                               //中斷初始化


  9. void main(void)
  10. {
  11.                             unsigned int i=0;
  12.                             //lcd 1602 初始化
  13.                             lcd1602_init();

  14.                             //中斷初始化
  15.                             init0();
  16.                             Lcd_ShowSring(1,0,"heart rate:");
  17.                             Lcd_ShowSring(2,6,"   /min");
  18.                             while(1){

  19.                                               Lcd_Display_3Date(2,6,maibo); //顯示每分鐘脈搏的次數

  20.                             }
  21.                                                                                                                              
  22. }
  23. //外部中斷0 下降沿計數
  24. void int0() interrupt 0
  25. {            
  26.                             unsigned char temp,p,g;
  27.                             s++;
  28.             
  29.                             //第一個下降沿清楚定時器
  30.                             //打開定時器
  31.                             //等待第二次中斷的時候 幾下倆次中斷所用的時間
  32.                             //
  33.                             if(s==1){
  34.                                                         TR0 = 1;
  35.                                                         //初始化計數器的值每50ms 進一次中斷
  36.                                                         TH0=(65535-50000)/256;              //定時器0高位裝初值
  37.                                                         TL0=(65535-50000)%256; //定時器0低位裝初?
  38.                                                         num =0;            
  39.                             }
  40.                             if(s==2){
  41.                                                       
  42.                                                         s =0;
  43.                                                         TR0 = 0;

  44.                             //                            TH0 =0;
  45.                             //                            TL0 =0;            
  46.                                           //              maibo              = 1/ (num *5/1000);
  47.                                           //一次脈沖的寬度有 num  個 50ms  num*50ms 轉化一下  num*50/1000 s            
  48.                                           //一秒鐘就有  1/( num*50/1000) 個脈沖數
  49.                                           //一分鐘內就有  60 * 1 /( num*50 /1000)
  50.                                           //化簡得一分鐘內的脈沖數為   1200/num

  51.                                                         mc_num[t]              = 1200/ num ;              //將脈沖寬度的時間 (即倆次下降沿中斷的時間) 對應的頻率給中間變量

  52.                                                         t++;              //一共有10個中間變量


  53.                                             if(t==10){
  54.                                                                         /*                maibo=mc_num[0]+mc_num[1]+mc_num[2]+mc_num[3]+mc_num[4]+mc_num[5]+mc_num[6]+mc_num[7]+mc_num[8]+mc_num[9]+mc_num[10] ;
  55.                                                                                          maibo =maibo/10;
  56.                                                                                       t=0;              */
  57.                                                                                     t=0;
  58.                                                                                     // 中值濾波
  59.                                                                                     //將10次采集到的脈沖的頻率 從小到大的 排列 取中間值
  60.                                                                                     for(p=0;p<10;p++){
  61.                                                                                                                    for(g=0;g<10-p;g++){
  62.                                                                                                                                  if(mc_num[g]>mc_num[g+1] )
  63.                                                                                                                                             {   temp  = mc_num[g];
  64.                                                                                                                                                mc_num[g] =  mc_num[g+1];
  65.                                                                                                                                                mc_num[g+1] = temp ;
  66.                                                                                                                                             }                                                                                                                                                                                 
  67.                                                                                                                    }
  68.                                                                                     }

  69.                                                                                     maibo =              mc_num[5];              //取數組中的第6個數作為一分鐘的脈搏數
  70.                                               }
  71.                             }
  72.                               

  73.                            
  74. }
  75. //////////////////////////////////////////////////////////////////
  76.    //定時器0
  77. void time0()interrupt 1  
  78. {              
  79.                             //每50ms進行一次中斷
  80.                             TH0=(65535-50000)/256;              //定時器0高位裝初值
  81.                             TL0=(65535-50000)%256; //定時器0低位裝初值
  82.                             num++; //每次中斷num 累加

  83. }

  84. void init0(void)
  85. {
  86.                             //打開外部中斷0
  87.                             //設置成外部中斷0,下降沿中斷
  88.                             //開全局中斷
  89.                             EX0=1;              //外部中斷0  使能位            
  90.                             IT0=1;              //下降沿觸發

  91. //                            TR0=1;              //定時器0開始位
  92.                               TMOD=0x11;                            //定時器0和定時器1都是方式1,16位定時器
  93.                             ET0=1;              //定時器0                使能位
  94.                             //  TMOD=0x21;              //定時器0.工作方式1              定時器1.工作方式2自動裝數
  95.                                          
  96.                             //              TR1=0;              //定時器一開始?

  97.                             TH0=(65535-50000)/256;              //定時器0高位裝初值
  98.                             TL0=(65535-50000)%256; //定時器0低位裝初值

  99.                             EA=1;//              總中開
  100. }
  101. ////////////=========LCD1602顯示子函數==========///////////
  102. #define uchar unsigned char
  103. #define uint unsigned int
  104. #define dat              P2
  105. sbit rs=P3^1;
  106. sbit lcden=P3^0;

  107. void delay_ms(uint z)
  108. {
  109.               uint a,b;
  110.               for(a=z;z>0;z--)
  111.               for(b=110;b>0;b--);            
  112. }

  113. void write_com(uchar com)  //寫地址
  114. {
  115.             
  116.               rs=0;
  117.                 dat=com;
  118.               lcden=0;
  119.               delay_ms(1);
  120.               lcden=1;
  121.               delay_ms(1);
  122.               lcden=0;
  123.             
  124. }

  125. void write_date(uchar date)//寫數據
  126. {            
  127.               dat=date;
  128.               rs=1;
  129.               lcden=0;
  130.               delay_ms(1);
  131.               lcden=1;
  132.               delay_ms(1);
  133.               lcden=0;
  134.             
  135. }

  136. void lcd1602_init()// 1602初始化
  137. {            
  138.               lcden=0;
  139.               write_com(0x38);//設置1602顯示模式為5*7點陣
  140.               delay_ms(1);
  141.               write_com(0x01);//清屏            
  142.               delay_ms(1);                                                                                    
  143.               write_com(0x0c);//開顯示,不顯示光標,光標不閃爍
  144.               delay_ms(1);                             
  145.                  write_com(0x06);//設置當讀或寫一個字符后,地址指針加一,且光標加一            
  146.               delay_ms(1);
  147. }
  148. void show_str(uchar  *s)
  149. { while(*s != '\0')
  150.    {
  151.                                write_date(*s);
  152.                     s++;
  153.     //              delay_ms(1);
  154.    }
  155. }                                          
  156. ////////////////////////////////////////////////////////////////////
  157. //函數                Lcd_init(uchar com)
  158. //功能    精確屏幕顯示數據
  159. //參數    line  液晶屏的第幾行  list  第幾個位置開始寫 (最多8個列)  Date要寫的數據

  160. void Lcd_Display_3Date(uchar line,uchar list,uint Date)
  161. {
  162.                             uchar i;
  163.                             uchar ta[]={0,0,0,'\0'};                //用一個數組來裝數
  164.               //  list=list &0x07;                                                 //限制在 0-7列
  165.                  switch(line){
  166.                                                         case 1:   write_com(0x80+list);break;              //第一行
  167.                                                         case 2:   write_com(0xC0+list);break;              //第二行

  168.                                                         default : break;
  169.             
  170.                  }
  171.               for(i=3;i>0;i--)
  172.               {                                                                                                    //循環四次把四個數從高到低裝入ta
  173.                             ta[i-1]=Date%10+48;
  174.                             Date=Date/10;
  175. ……………………

  176. …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼

完整的Word格式文檔51黑下載地址:

基于單片機的心率計脈搏儀設計_參考L文.doc (1.28 MB, 下載次數: 257)




分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏10 分享淘帖 頂1 踩
回復

使用道具 舉報

沙發
ID:324586 發表于 2018-5-20 14:30 | 只看該作者
頂頂,剛好在學
回復

使用道具 舉報

板凳
ID:334209 發表于 2018-5-20 15:31 | 只看該作者
頂頂,剛好在學
回復

使用道具 舉報

地板
ID:263040 發表于 2018-5-30 13:11 | 只看該作者
附件里的文件是空白的?下了兩次都沒用
回復

使用道具 舉報

5#
ID:175323 發表于 2018-9-25 10:45 | 只看該作者
學習學習,參考參考
回復

使用道具 舉報

6#
ID:412517 發表于 2018-10-19 22:54 | 只看該作者
好東西!帶勁
回復

使用道具 舉報

7#
ID:446122 發表于 2018-12-14 08:55 | 只看該作者
贊一個

回復

使用道具 舉報

8#
ID:460703 發表于 2019-1-3 10:28 | 只看該作者
angelfang22 發表于 2018-5-30 13:11
附件里的文件是空白的?下了兩次都沒用

能用嗎
回復

使用道具 舉報

9#
ID:361627 發表于 2019-1-3 15:37 | 只看該作者
程序能用嗎
回復

使用道具 舉報

10#
ID:579794 發表于 2019-7-9 08:52 來自手機 | 只看該作者
有人下載了嗎?怎么樣?
回復

使用道具 舉報

11#
ID:544319 發表于 2019-7-27 17:12 | 只看該作者
附錄三:源程序



#include<reg52.h>
#include<1602.h>
unsigned int s=0;          //下降沿累加中間計數變量

unsigned int maibo;          //一分鐘的脈搏頻率
unsigned int num;          //中間計數每50ms累加一次
unsigned char mc_num[10];        //用來做中值濾波算法的中間變量
unsigned char t=0;           //中間變量
   
void init0(void);                   //中斷初始化


void main(void)
{
                unsigned int i=0;
                 //lcd 1602 初始化
                 lcd1602_init();

                //中斷初始化
                init0();
                Lcd_ShowSring(1,0,"heart rate:");
                Lcd_ShowSring(2,6,"   /min");
                while(1){

                            Lcd_Display_3Date(2,6,maibo); //顯示每分鐘脈搏的次數

                }
                                                                       
}
//外部中斷0 下降沿計數
void int0() interrupt 0
{         
                unsigned char temp,p,g;
                s++;
       
                //第一個下降沿清楚定時器
                //打開定時器
                //等待第二次中斷的時候 幾下倆次中斷所用的時間
                //
                if(s==1){
                                TR0 = 1;
                                //初始化計數器的值每50ms 進一次中斷
                                 TH0=(65535-50000)/256;         //定時器0高位裝初值
                                TL0=(65535-50000)%256; //定時器0低位裝初?
                                num =0;       
                }
                if(s==2){
                               
                                s =0;
                                TR0 = 0;

                //                TH0 =0;
                //                TL0 =0;       
                        //        maibo        = 1/ (num *5/1000);
                        //一次脈沖的寬度有 num  個 50ms  num*50ms 轉化一下  num*50/1000 s         
                        //一秒鐘就有  1/( num*50/1000) 個脈沖數
                        //一分鐘內就有  60 * 1 /( num*50 /1000)
                        //化簡得一分鐘內的脈沖數為   1200/num

                                mc_num[t]        = 1200/ num ;        //將脈沖寬度的時間 (即倆次下降沿中斷的時間) 對應的頻率給中間變量

                                t++;         //一共有10個中間變量


                          if(t==10){
                                          /*          maibo=mc_num[0]+mc_num[1]+mc_num[2]+mc_num[3]+mc_num[4]+mc_num[5]+mc_num[6]+mc_num[7]+mc_num[8]+mc_num[9]+mc_num[10] ;
                                                     maibo =maibo/10;
                                                  t=0;        */
                                                t=0;
                                                // 中值濾波
                                                //將10次采集到的脈沖的頻率 從小到大的 排列 取中間值
                                                for(p=0;p<10;p++){
                                                                   for(g=0;g<10-p;g++){
                                                                           if(mc_num[g]>mc_num[g+1] )
                                                                                {   temp  = mc_num[g];
                                                                                   mc_num[g] =  mc_num[g+1];
                                                                                   mc_num[g+1] = temp ;
                                                                                }                                                                                                                                                   
                                                                   }
                                                 }

                                                maibo =        mc_num[5];        //取數組中的第6個數作為一分鐘的脈搏數
                            }
                }
                  

               
}
//////////////////////////////////////////////////////////////////
   //定時器0
void time0()interrupt 1   
{        
                 //每50ms進行一次中斷
                 TH0=(65535-50000)/256;         //定時器0高位裝初值
                TL0=(65535-50000)%256; //定時器0低位裝初值
                 num++; //每次中斷num 累加

}

void init0(void)
{
                //打開外部中斷0
                //設置成外部中斷0,下降沿中斷
                //開全局中斷
                EX0=1;        //外部中斷0  使能位       
                IT0=1;        //下降沿觸發

//                TR0=1;        //定時器0開始位
                  TMOD=0x11;                //定時器0和定時器1都是方式1,16位定時器
                ET0=1;        //定時器0          使能位
                //  TMOD=0x21;        //定時器0.工作方式1         定時器1.工作方式2自動裝數
                       
                //        TR1=0;        //定時器一開始?

                TH0=(65535-50000)/256;         //定時器0高位裝初值
                TL0=(65535-50000)%256; //定時器0低位裝初值

                EA=1;//        總中開
}
////////////=========LCD1602顯示子函數==========///////////
#define uchar unsigned char
#define uint unsigned int
#define dat        P2
sbit rs=P3^1;
sbit lcden=P3^0;

void delay_ms(uint z)
{
        uint a,b;
        for(a=z;z>0;z--)
        for(b=110;b>0;b--);       
}

void write_com(uchar com)  //寫地址
{
       
        rs=0;
          dat=com;
        lcden=0;
        delay_ms(1);
        lcden=1;
        delay_ms(1);
        lcden=0;
       
}

void write_date(uchar date)//寫數據
{       
        dat=date;
        rs=1;
        lcden=0;
        delay_ms(1);
        lcden=1;
        delay_ms(1);
        lcden=0;
       
}

void lcd1602_init()// 1602初始化
{       
        lcden=0;
        write_com(0x38);//設置1602顯示模式為5*7點陣
        delay_ms(1);
        write_com(0x01);//清屏       
        delay_ms(1);                                                 
        write_com(0x0c);//開顯示,不顯示光標,光標不閃爍
        delay_ms(1);                 
           write_com(0x06);//設置當讀或寫一個字符后,地址指針加一,且光標加一       
        delay_ms(1);
}
void show_str(uchar  *s)
{ while(*s != '\0')
   {
                   write_date(*s);
              s++;
    //        delay_ms(1);
   }
}                        
////////////////////////////////////////////////////////////////////
//函數          Lcd_init(uchar com)
//功能    精確屏幕顯示數據
//參數    line  液晶屏的第幾行  list  第幾個位置開始寫 (最多8個列)  Date要寫的數據

void Lcd_Display_3Date(uchar line,uchar list,uint Date)
{
                uchar i;
                 uchar ta[]={0,0,0,'\0'};          //用一個數組來裝數
         //  list=list &0x07;                               //限制在 0-7列
           switch(line){
                                case 1:   write_com(0x80+list);break;        //第一行
                                case 2:   write_com(0xC0+list);break;        //第二行

                                default : break;
       
           }
         for(i=3;i>0;i--)
         {                                                          //循環四次把四個數從高到低裝入ta
                 ta[i-1]=Date%10+48;
                Date=Date/10;
         }
        show_str(ta);

}

////////////////////////////////////////////////////////////////////
//函數          Lcd_init(uchar com)
//功能    精確屏幕顯示字符串
//參數    line  液晶屏的第幾行  list  第幾個位置開始寫 (最多8個列)  *p要寫的字符串
void  Lcd_ShowSring(uchar line,uchar list,uchar*p)
{
         switch(line){
                                case 1:   write_com(0x80+list);break;        //第一行
                                case 2:   write_com(0xC0+list);break;        //第二行
                                default : break;
       
           }

           while(*p !='\0')
     {
          
                write_date(*p++);
     }

}

回復

使用道具 舉報

12#
ID:587714 發表于 2019-7-28 15:13 | 只看該作者
不斷學習,不斷進步
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 九九热这里只有精品6 | 九九亚洲 | 亚洲久草| 亚洲免费在线 | 99热精品6| 欧美一区二区三区在线播放 | 成人毛片视频在线播放 | 国产精品毛片无码 | 在线视频中文字幕 | 欧美精品一区二区在线观看 | 久久久久久久综合 | 国产在线视频在线观看 | 欧美一级片在线观看 | 久久久久久久久国产成人免费 | 亚洲在线 | 久久在线| 夜夜草导航 | 视频1区2区| 亚洲精品电影 | 国产激情一区二区三区 | 国产91观看 | 黑人中文字幕一区二区三区 | 欧美性视频在线播放 | 夜夜爽夜夜操 | 亚洲精品自在在线观看 | 精品国产91亚洲一区二区三区www | 欧美亚洲另类丝袜综合网动图 | 欧美v在线观看 | 欧美三级电影在线播放 | 日韩欧美国产一区二区 | 亚洲成人免费视频在线观看 | 一区在线观看视频 | 国产亚洲精品美女久久久久久久久久 | 天天久久 | 久久久久久九九九九 | 在线免费观看黄色 | 韩国理论电影在线 | 一级一级毛片免费看 | 午夜不卡福利视频 | 久久久久久九九九九九九 | 天天综合久久 |