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

標題: 通過光電對管測量脈搏的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.zg4o1577.cn/bbs/) Powered by Discuz! X3.1
主站蜘蛛池模板: 福利片在线观看 | 在线视频国产一区 | 97色伦网| 波多野结衣精品在线 | 91精品在线看 | 亚洲成人福利视频 | 99re6在线视频精品免费 | 国产91久久久久 | 精品亚洲一区二区三区 | 亚洲综合二区 | 国产精品成人一区二区三区 | 一区二区三区亚洲精品国 | 毛片99 | 精品一区二区在线视频 | 亚洲午夜精品一区二区三区他趣 | 国精产品一区二区三区 | 成人精品视频在线观看 | 国产欧美一级 | 日韩精品一区二区三区四区视频 | 亚洲精品一区二区三区蜜桃久 | 欧美中文字幕一区 | 成人妇女免费播放久久久 | 中文字幕在线观看一区二区 | 精品自拍视频在线观看 | 美女一区 | 91精品中文字幕一区二区三区 | 免费观看av | 国产一区二区日韩 | 日韩中文一区二区三区 | 91视视频在线观看入口直接观看 | 在线色网 | 自拍偷拍亚洲视频 | 国产精品视频一区二区三区四蜜臂 | 中文字幕日韩一区 | 欧美亚洲另类丝袜综合网动图 | 亚洲视频 欧美视频 | 97成人在线 | 亚洲一区国产 | 丁香五月缴情综合网 | 午夜精品久久久久久久久久久久久 | 欧美成ee人免费视频 |