欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

標題: 通過光電對管測量脈搏的51單片機程序設計 [打印本頁]

作者: dllcm222    時間: 2019-12-19 21:39
標題: 通過光電對管測量脈搏的51單片機程序設計
設計采用STC89C51作為主控芯片,采用ST188光電對管對脈搏信號進行采集,再由LM358將信號進行放大后由74HC14將方波信號整形后通過單片機的計數器進行采集,單片機通過定時器和計數器的配合使用,準確的計算出脈搏數后通過LCD1602進行實時顯示脈搏測量信息。當沒有在測量時候系統檢測到會自動的停止測量,在下次檢測到脈搏信號后又自動打開。


原理圖如下:



單片機源程序如下:
  1. /*************************************************************
  2.                       脈搏計

  3. 補充說明:
  4. ***************************************************************/
  5. #include<reg52.h>                //頭文件
  6. #include<INTERRUPT.h>
  7. #include<LCD1602.h>

  8. /************************引腳定義************************/
  9. sbit IN=P3^4;                    //脈搏信號輸入
  10. /********************************************************
  11. 函數名稱:void display()
  12. 函數作用:脈搏顯示程序
  13. 參數說明:
  14. ********************************************************/
  15. void display()
  16. {
  17.         lcd1602_write_character(0,1,"Sphygmus:");  //顯示脈搏數、【0:表示第1列,1:表示第1行,所有關于顯示都一樣】
  18.         LCD_disp_char(9,1,ASCII[maibo/100]);
  19.         LCD_disp_char(10,1,ASCII[maibo%100/10]);
  20.         LCD_disp_char(11,1,ASCII[maibo%10]);
  21.         lcd1602_write_character(12,1,"bpm");

  22.         lcd1602_write_character(0,2,"Time:");           //顯示脈搏檢測時間、【0:表示第1列,2:表示第2行,所有關于顯示都一樣】
  23.         LCD_disp_char(5,2,ASCII[T1_num/1000]);
  24.         LCD_disp_char(6,2,ASCII[T1_num%1000/100]);
  25.         LCD_disp_char(7,2,'s');

  26.         LCD_disp_char(10,2,ASCII[TL0/100]);                   //顯示當前檢測到的脈搏數、【10:表示第11列,2:表示第2行,所有關于顯示都一樣】
  27.         LCD_disp_char(11,2,ASCII[TL0%100/10]);
  28.         LCD_disp_char(12,2,ASCII[TL0%10]);        
  29.         lcd1602_write_character(13,2,"bpm");
  30. }
  31. /********************************************************
  32. 函數名稱:void main()
  33. 函數作用:主函數
  34. 參數說明:
  35. ********************************************************/
  36. void main()
  37. {
  38.         T0_init();    //計數器0、定時器1初始化
  39.         LCD_init();   //LCD1602初始化
  40.         while(1)          //死循環
  41.         {
  42.                 if(IN==0) //檢測到脈搏信號
  43.                         TR1=1;//自動開啟檢測計算脈搏。定時器1開啟        
  44.                 display();//顯示脈搏相關信息
  45.                 //計算脈搏
  46.                 if(TL0>=5)//如果采集到5個脈搏信號
  47.                 {
  48.                         TL0=0;//重置脈搏數量,重新計數
  49.                         if(T1_num<1000&&T1_num>150)//計算脈搏,條件就是滿足5個脈搏信號用時大于1.5S且小于10S,否者都忽略
  50.                         {
  51.                                 if(T1_num<375)                   //脈搏大于80bmp時采用兩次求和取平均方式提高精度
  52.                                         maibo=(maibo+30000/T1_num)/2;
  53.                                 else                                   //否者,直接計算脈搏
  54.                                         maibo=30000/T1_num;//脈搏=(5/(T1_num/100))*60=30000/T1_num;其中T1_num單位是10毫秒30000/375=80
  55.                         }
  56.                         T1_num=0;//重置計時
  57.                 }
  58.         }
  59. }

  60. #ifndef _INTERRUPT_H_
  61. #define _INTERRUPT_H_
  62. #include<reg52.h>
  63. #include<math.h>
  64. #define uchar unsigned char
  65. #define uint unsigned int
  66. #define MAX 6    //檢測結束脈搏數量
  67. /************************引腳定義************************/
  68. sbit IN=P3^2;         //脈搏信號輸入
  69. /************************變量定義************************/
  70. uchar T0_num=0;  //定時計數變量
  71. uint T0_nums=0;  //計時脈搏時間間隔變量
  72. uchar miao=0;         //測量時間秒鐘
  73. uchar maibos=0;  //最終測量脈搏數
  74. uchar maibo=0;   //記錄脈搏

  75. uchar T[MAX]={0};//記錄已采集到的脈搏時間間隔
  76. uchar low=0;         //上一次脈搏時間間隔
  77. /*********************************************************
  78. 函數名稱:void T0_init()
  79. 函數作用:計數器0、定時器1初始化函數
  80. 參數說明:
  81. *********************************************************/
  82. void T0_init()
  83. {
  84.         EA=1;                  //開總中斷
  85.         TMOD=0x01;             //計數器0工作工作方式1  
  86.         ET0=1;                 //定時器T0中斷允許         
  87.         TH0=(65536-10000)/256; //定時器T0的高8位賦初值
  88.         TL0=(65536-10000)%256; //定時器T0的低8位賦初值
  89.         TR0=0;                                   //關閉定時器
  90. }
  91. /*********************************************************
  92. 函數名稱:void Int0_init()
  93. 函數作用:外部中斷0初始化函數
  94. 參數說明:
  95. *********************************************************/
  96. void Int0_init()
  97. {
  98.         EA=1;                  //開放總中斷         
  99.            IT0=1;                 //選擇負跳變來觸發外中斷
  100.         EX0=0;                 //允許使用外中斷         
  101. }
  102. /*********************************************************
  103. 函數名稱:void T0_interrupt(void) interrupt 1
  104. 函數作用:定時器1中斷處理函數
  105. 參數說明:10毫秒定時中斷一次
  106. *********************************************************/
  107. void T0_interrupt(void) interrupt 1
  108. {                  
  109.         TH0=(65536-10000)/256;//定時器T0的高8位重新賦初值
  110.         TL0=(65536-10000)%256;//定時器T0的低8位重新賦初值
  111.         if(EX0==1)                          //開啟脈搏檢測
  112.         {
  113.                 T0_num++;                  //計數變量+1
  114.                 if(T0_num>=100)          //100*10ms=1S
  115.                 {
  116.                         T0_num=0;          //重置計數變量
  117.                         miao++;                  //秒+1
  118.                         if(miao>99)
  119.                                 miao=0;
  120.                 }


  121.                 T0_nums++;            //脈搏時間間隔變量+1
  122.                 if(T0_nums>=500)  //500*10ms=5S
  123.                 {
  124.                         miao=0;              //采集超時,清除所有變量
  125.                         maibo=0;
  126.                         EX0=0;              //關閉脈搏檢測
  127.                         TR0=0;
  128.                 }
  129.         }     
  130. }
  131. /*********************************************************
  132. 函數名稱:void init0(void) interrupt 0
  133. 函數作用:外部中斷0中斷處理函數
  134. 參數說明:
  135. *********************************************************/
  136. void init0(void) interrupt 0
  137. {
  138.         uchar i=0;
  139.         uint TS=0;
  140.         if(IN==0&&T0_nums>39)      //再次確認感應,并且距上一次感應的時間足夠長,如果過短認為是波動放棄處理
復制代碼

全部資料51hei下載地址:
脈搏計源程序代碼(Keil).zip (125.67 KB, 下載次數: 29)

作者: 一顆檸檬x    時間: 2020-4-14 22:55
proteus里只給單獨一個是非門,怎么組成施密特




歡迎光臨 (http://www.raoushi.com/bbs/) Powered by Discuz! X3.1