找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2101|回復: 3
打印 上一主題 下一主題
收起左側(cè)

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

[復制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:830592 發(fā)表于 2022-11-28 12:18 | 只看該作者 |只看大圖 回帖獎勵 |正序瀏覽 |閱讀模式
        本系統(tǒng)由STC89C52、按鍵、LCD1602、光電傳感器、運放等構(gòu)成,脈搏測量的時候需要人把手輕輕的按在光電傳感器上面,由于人脈搏跳動的時候,血液的透光性不一樣會導致接收器那邊接收的信號強弱不一樣,間接的把人脈搏信號傳回,通過運放對其進行放大、整形后連接到單片機的IO口,單片機利用外部中斷對其進行計數(shù),最終換算成人一分鐘脈搏的跳動次數(shù),最終顯示在液晶屏上。
脈搏計電路原理圖如下:



元件清單:
元件型號    元件名稱    元件標號    數(shù)量
10uF    電解電容    C1,C4    2
20PF    瓷片電容    C2, C3    2
1uF    電解電容    C5, C6    2
發(fā)光二極管    指示燈    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

制作出來的脈搏計實物圖如下:

單片機源程序如下:
  1. #include <reg52.h>                 //調(diào)用單片機頭文件
  2. #define uchar unsigned char  //無符號字符型 宏定義        變量范圍0~255
  3. #define uint  unsigned int         //無符號整型 宏定義        變量范圍0~65535

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

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


  9. /***********************1ms延時函數(shù)*****************************/
  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命令函數(shù)
  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寫數(shù)據(jù)函數(shù)
  46. * 輸入 : 需要寫入1602的數(shù)據(jù)
  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" ,調(diào)用該函數(shù)如下
  63.                   write_string(1,5,"ab cd ef;")
  64. * 輸入 : 行,列,需要輸入1602的數(shù)據(jù)
  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上顯示兩位十進制數(shù)************************/
  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. /****************主函數(shù)***************/
  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計數(shù)清零
  133.         i++;
  134.         if(i==6)//記錄到超過等于6次時間
  135.         {
  136.                 i=1;//計數(shù)從1開始
  137.         }                                                               
  138. }

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

復制代碼

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

使用道具 舉報

地板
ID:1074754 發(fā)表于 2023-5-19 15:10 | 只看該作者
cq995 發(fā)表于 2023-5-12 17:12
這個代碼運行后,lcd心率顯示不對

有沒有仿真圖
回復

使用道具 舉報

板凳
ID:1075720 發(fā)表于 2023-5-12 17:12 | 只看該作者
這個代碼燒錄后,lcd顯示的心率有問題
回復

使用道具 舉報

沙發(fā)
ID:1075720 發(fā)表于 2023-5-12 17:12 | 只看該作者
這個代碼運行后,lcd心率顯示不對
回復

使用道具 舉報

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

本版積分規(guī)則

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

Powered by 單片機教程網(wǎng)

快速回復 返回頂部 返回列表