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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2018|回復: 3
收起左側

基于單片機的脈搏計程序與電路原理圖設計

[復制鏈接]
ID:830592 發表于 2022-11-28 12:18 | 顯示全部樓層 |閱讀模式
        本系統由STC89C52、按鍵、LCD1602、光電傳感器、運放等構成,脈搏測量的時候需要人把手輕輕的按在光電傳感器上面,由于人脈搏跳動的時候,血液的透光性不一樣會導致接收器那邊接收的信號強弱不一樣,間接的把人脈搏信號傳回,通過運放對其進行放大、整形后連接到單片機的IO口,單片機利用外部中斷對其進行計數,最終換算成人一分鐘脈搏的跳動次數,最終顯示在液晶屏上。
脈搏計電路原理圖如下:
原理圖.png 傳感器的引腳圖.png 脈博 1602.png


元件清單:
元件型號    元件名稱    元件標號    數量
10uF    電解電容    C1,C4    2
20PF    瓷片電容    C2, C3    2
1uF    電解電容    C5, C6    2
發光二極管    指示燈    D1    1
LCD1602    液晶    LCD1    1
2K    電阻    R1    1
10K    電阻    R2    1
330歐    電阻    R3, R4, R13    3
20K    電阻    R5, R6    2
10K    電阻    R7, R8    2
56k    電阻    R9    1
6.8K    電阻    R10    1
24K    電阻    R11    1
100K    電阻    R12    1
SW-PB    按鍵    S1    1
STC89C52    單片機    U1    1
ST188    光電開關    U2    1
LM358    放大器    U3    1
12M    晶振    Y1    1

制作出來的脈搏計實物圖如下:
脈搏計 照片 (3).jpg 脈搏計 照片 (2).jpg 脈搏計 照片 (1).jpg 照片 PCB板 (1).jpg 照片 PCB板 (2).jpg
單片機源程序如下:
  1. #include <reg52.h>                 //調用單片機頭文件
  2. #define uchar unsigned char  //無符號字符型 宏定義        變量范圍0~255
  3. #define uint  unsigned int         //無符號整型 宏定義        變量范圍0~65535

  4. sbit rs=P1^0;         //寄存器選擇信號 H:數據寄存器          L:指令寄存器
  5. sbit rw=P1^1;         //寄存器選擇信號 H:數據寄存器          L:指令寄存器
  6. sbit e =P1^2;         //片選信號   下降沿觸發

  7. unsigned char i=0,timecount=0,rate=0;
  8. unsigned int time[6]={0};


  9. /***********************1ms延時函數*****************************/
  10. void delay_1ms(uint q)
  11. {
  12.         uint i,j;
  13.         for(i=0;i<q;i++)
  14.                 for(j=0;j<110;j++);
  15. }


  16. /********************************************************************
  17. * 名稱 : delay_uint()
  18. * 功能 : 小延時。
  19. * 輸入 : 無
  20. * 輸出 : 無
  21. ***********************************************************************/
  22. void delay_uint(uint q)
  23. {
  24.         while(q--);
  25. }

  26. /********************************************************************
  27. * 名稱 : write_com(uchar com)
  28. * 功能 : 1602命令函數
  29. * 輸入 : 輸入的命令值
  30. * 輸出 : 無
  31. ***********************************************************************/
  32. void write_com(uchar com)
  33. {
  34.         e=0;
  35.         rs=0;
  36.         rw=0;
  37.         P0=com;
  38.         delay_uint(25);
  39.         e=1;
  40.         delay_uint(100);
  41.         e=0;
  42. }

  43. /********************************************************************
  44. * 名稱 : write_data(uchar dat)
  45. * 功能 : 1602寫數據函數
  46. * 輸入 : 需要寫入1602的數據
  47. * 輸出 : 無
  48. ***********************************************************************/
  49. void write_data(uchar dat)
  50. {
  51.         e=0;
  52.         rs=1;
  53.         rw=0;
  54.         P0=dat;
  55.         delay_uint(25);
  56.         e=1;
  57.         delay_uint(100);
  58.         e=0;       
  59. }

  60. /********************************************************************
  61. * 名稱 : write_string(uchar hang,uchar add,uchar *p)
  62. * 功能 : 改變液晶中某位的值,如果要讓第一行,第五個字符開始顯示"ab cd ef" ,調用該函數如下
  63.                   write_string(1,5,"ab cd ef;")
  64. * 輸入 : 行,列,需要輸入1602的數據
  65. * 輸出 : 無
  66. ***********************************************************************/
  67. void write_string(uchar hang,uchar add,uchar *p)
  68. {
  69.         if(hang==1)   
  70.                 write_com(0x80+add);
  71.         else
  72.                 write_com(0x80+0x40+add);
  73.         while(1)
  74.         {
  75.                 if(*p == '\0')  break;
  76.                 write_data(*p);
  77.                 p++;
  78.         }       
  79. }

  80. /***********************lcd1602上顯示兩位十進制數************************/
  81. void write_sfm3(uchar hang,uchar add,uint date)
  82. {
  83.         if(hang==1)   
  84.                 write_com(0x80+add);
  85.         else
  86.                 write_com(0x80+0x40+add);
  87.         write_data(0x30+date/100%10);
  88.         write_data(0x30+date/10%10);
  89.         write_data(0x30+date%10);       
  90. }

  91. /***********************lcd1602初始化設置************************/
  92. void init_1602()
  93. {
  94.         write_com(0x38);        //
  95.         write_com(0x0c);
  96.         write_com(0x06);
  97.         delay_uint(1000);
  98.         write_string(1,0,"   Heart Rate     ");       
  99.         write_string(2,0,"     000/min       ");
  100. }

  101. /*************定時器0初始化程序***************/
  102. void time_init()          
  103. {
  104.         EA   = 1;                   //開總中斷
  105.         TMOD = 0X01;          //定時器0、定時器1工作方式1
  106.         ET0  = 1;                  //開定時器0中斷
  107.         TR0  = 1;                  //允許定時器0定時
  108. }


  109. /***********外部中斷0初始化程序****************/
  110. void init_int0()          //外部中斷0初始化程序
  111. {
  112.         EX0=1;                          //允許外部中斷0中斷
  113.         EA=1;                           //開總中斷
  114.         IT0 = 1;                   //外部中斷0負跳變中斷
  115. }

  116. /****************主函數***************/
  117. void main()
  118. {       
  119.         init_1602();                    //1602初始化
  120.         time_init();                    //初始化定時器
  121.         init_int0();          //外部中斷0初始化程序
  122.         while(1)
  123.         {                       
  124.                 rate=60000/(time[1]+time[2]+time[3]+time[4]+time[5])/5;
  125.                 write_sfm3(2,5,rate);

  126.                 delay_1ms(300);
  127.         }
  128. }

  129. void int0() interrupt 0
  130. {
  131.         time[i]=timecount*50+TH0+TL0;//算出間隔時間
  132.         timecount=0;//50ms計數清零
  133.         i++;
  134.         if(i==6)//記錄到超過等于6次時間
  135.         {
  136.                 i=1;//計數從1開始
  137.         }                                                               
  138. }

  139. /*************定時器0中斷服務程序***************/
  140. void time0_int() interrupt 1
  141. {       
  142.         TH0 = 0x3c;
  143.         TL0 = 0xb0;     // 50ms         12M
  144.         timecount++;//每50ms一次計數
  145.         if(timecount>25)     //當超過25*50ms=1.5s沒有檢測到信號停止顯示
  146.         {
  147.                         timecount=0;//50ms計數清零
  148.                         TR0=0;//定時器關
  149.         }
  150. }

復制代碼

回復

使用道具 舉報

ID:1075720 發表于 2023-5-12 17:12 | 顯示全部樓層
這個代碼運行后,lcd心率顯示不對
回復

使用道具 舉報

ID:1075720 發表于 2023-5-12 17:12 | 顯示全部樓層
這個代碼燒錄后,lcd顯示的心率有問題
回復

使用道具 舉報

ID:1074754 發表于 2023-5-19 15:10 | 顯示全部樓層
cq995 發表于 2023-5-12 17:12
這個代碼運行后,lcd心率顯示不對

有沒有仿真圖
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 欧美一级黄带 | 精品欧美激情在线观看 | 国产精品久久久久久久久久久久 | 亚洲欧美国产精品久久 | 男插女下体视频 | 老牛嫩草一区二区三区av | 中国美女撒尿txxxxx视频 | 亚洲国产精品成人综合久久久 | 免费在线观看黄色av | 色播视频在线观看 | 在线观看免费av网 | 亚洲福利视频网 | 三级黄色片在线播放 | 精品视频一区二区三区 | 欧美精品综合在线 | 亚洲男人天堂2024 | 欧美精品日韩精品 | 性色av香蕉一区二区 | 国产亚洲精品美女久久久久久久久久 | 91一区二区三区在线观看 | 91精品久久久久久久久99蜜臂 | 天堂久久av | 欧美亚洲另类丝袜综合网动图 | av网站免费 | av在线播放不卡 | 韩国av一区二区 | 欧美一区二区大片 | 在线中文字幕av | 精品国产18久久久久久二百 | 亚洲精品色| 免费人成在线观看网站 | 国产精品成人一区 | 中文字幕av网站 | 一级片av| 亚洲毛片网站 | 视频在线日韩 | 91av在线免费 | 成人高清网站 | 日韩电影免费在线观看中文字幕 | 影音先锋中文字幕在线观看 | 欧美一区免费 |