找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 6875|回復(fù): 2
打印 上一主題 下一主題
收起左側(cè)

基于51單片機'ST188心率脈搏檢測程序與原理圖分享

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:274459 發(fā)表于 2021-1-9 20:02 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
內(nèi)含完整原理圖設(shè)計、文檔等


元件清單:

元件型號    元件名稱    元件標號
10uF    電容    C1
20PF    電容    C2, C3
10uF    電容    C4
1uF    電容    C5, C6
LED-R-3mm    指示燈    D1
LCD12864    液晶    LCD1
10K    可調(diào)電阻    RV1
10K    電阻    R2
330歐    電阻    R3, R4, R13
20K    電阻    R5, R6
10K    電阻    R7, R8
56k    電阻    R9
6.8K    電阻    R10
24K    電阻    R11
100K    電阻    R12
SW-PB    按鍵    S1
STC89C52    單片機    U1
ST188    光電開關(guān)    U2
LM358    放大器    U3
12M    晶振    Y1


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



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

  7. unsigned char i=0,timecount=0,displayOK=0,rate=0,aa=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<120;j++);
  15. }

  16.                                           
  17. /************ 延時函數(shù)  *****************/
  18. void delay_uint(uint z)
  19. {
  20.    while(z--);
  21. }


  22. /************ 寫命令函數(shù)  *****************/
  23. void write_com(uchar com)
  24. {

  25.    P0=com;
  26.    rw=0;
  27.    rs=0;
  28.    delay_uint(25);
  29.    e=1;
  30.    delay_uint(50);
  31.    e=0;
  32. }
  33. /************ 寫數(shù)據(jù)函數(shù)  *****************/
  34. void write_data(uchar dat)
  35. {

  36.    P0=dat;;
  37.    rw=0;
  38.    rs=1;
  39.    delay_uint(25);
  40.    e=1;
  41.    delay_uint(50);
  42.    e=0;
  43. }

  44. /**********************************************************
  45. *函數(shù)名: addr_12864
  46. *功能:寫地址
  47. *說明:寫漢字時要寫個地址
  48. *輸入:無
  49. *返回:無
  50. **********************************************************/
  51. void addr_12864(uchar hang,uchar lie)          //地址轉(zhuǎn)換
  52. {
  53.         uchar address;
  54.         switch(hang)
  55.         {
  56.                 case 1: address=0x80 + lie ;
  57.                                 break;
  58.                 case 2: address=0x90 + lie ;
  59.                                 break;
  60.                 case 3: address=0x88 + lie ;
  61.                                 break;
  62.                 case 4: address=0x98 + lie ;
  63.                                 break;
  64.                 default :
  65.                                 break;
  66.         }        
  67.         write_com(address);
  68. }

  69. /***********************lcd1602上顯示兩位十進制數(shù)************************/
  70. void write_sfm3(uchar hang,uchar add,uint date)
  71. {
  72.         addr_12864(hang,add);         
  73.         write_data(':');
  74.         write_data(0x30+date/100%10);
  75.         write_data(0x30+date/10%10);
  76.         write_data(0x30+date%10);        
  77. }


  78. /**********************************************************
  79. *函數(shù)名: write_string
  80. *功能:在12864上顯示字符數(shù)據(jù)
  81. *說明:
  82. *輸入:無
  83. *返回:無
  84. **********************************************************/

  85. void write_string(uchar hang,uchar lie,uchar *p)
  86. {
  87.         addr_12864(hang,lie);          //地址轉(zhuǎn)換
  88.         while(*p != '\0')
  89.         {
  90.                 write_data(*p);
  91.                 p++;
  92.                 delay_uint(50);
  93.         }
  94. }

  95. /********************************************************************
  96. * 名稱 : init_12864()
  97. * 功能 : 初始化函數(shù)
  98. * 輸入 : cmdcode
  99. * 輸出 : 無
  100. ***********************************************************************/
  101. void init_12864()
  102. {  
  103.     write_com(0x30);
  104.     write_com(0x0c);
  105.     write_com(0x01);
  106.     delay_uint(5000);
  107.         write_string(1,0,"               ");
  108.         write_string(2,0," 心率:000/min  ");
  109.         write_string(3,0,"               ");
  110.         write_string(4,0,"               ");
  111. }

  112. /*************定時器0初始化程序***************/
  113. void time_init()         
  114. {
  115.         EA   = 1;                   //開總中斷
  116.         TMOD = 0X01;          //定時器0、定時器1工作方式1
  117.         ET0  = 1;                  //開定時器0中斷
  118.         TR0  = 1;                  //允許定時器0定時
  119. }


  120. /***********外部中斷0初始化程序****************/
  121. void init_int0()          //外部中斷0初始化程序
  122. {
  123.         EX0=1;                          //允許外部中斷0中斷
  124.         EA=1;                           //開總中斷
  125.         IT0 = 1;                   //外部中斷0負跳變中斷
  126. }

  127. /****************主函數(shù)***************/
  128. void main()
  129. {        
  130.         init_12864();     //12864初始化        
  131.         time_init();      //初始化定時器
  132.         init_int0();          //外部中斷0初始化程序
  133.         while(1)
  134.         {                        
  135.                 if(displayOK==0)//如果顯示關(guān)
  136.                 {
  137.                          rate = 0;
  138.                 }
  139.                 else//如果顯示開
  140.                 {
  141.                         rate=60000/(time[1]/5+time[2]/5+time[3]/5+time[4]/5+time[5]/5);
  142.                 }
  143.                 write_sfm3(2,5,rate);

  144.                 delay_1ms(300);
  145.         }
  146. }

  147. void int0() interrupt 0
  148. {
  149.         if(timecount<8)   //當(dāng)連續(xù)兩次檢測時間間隔小于8*50ms=400ms不處理
  150.         {
  151.                         TR0=1;//開定時器
  152.         }
  153.         else
  154.         {
  155.                 time[i]=timecount*50+TH0+TL0;//算出間隔時間
  156.                 TH0 = 0x3c;
  157.                 TL0 = 0xb0;     // 50ms         12M
  158.                 timecount=0;//50ms計數(shù)清零
  159.                 i++;
  160.                 if(i==6)//記錄到超過等于6次時間
  161.                 {
  162.                         i=1;//計數(shù)從1開始
  163.                         displayOK=1;    //測得5次開始顯示?
  164.                 }                                                               
  165.         }
  166. }

  167. /*************定時器0中斷服務(wù)程序***************/
  168. void time0_int() interrupt 1
  169. {        
  170.         TH0 = 0x3c;
  171.         TL0 = 0xb0;     // 50ms         12M
  172.         timecount++;//每50ms一次計數(shù)
  173.         if(timecount>25)     //當(dāng)超過25*50ms=1.5s沒有檢測到信號停止顯示
  174.         {
  175.                         i=0;//數(shù)據(jù)個數(shù)清零
  176.                         timecount=0;//50ms計數(shù)清零
  177.                         displayOK=0;//顯示關(guān)
  178.                         TR0=0;//定時器關(guān)
  179.                         TH0 = 0x3c;
  180.                         TL0 = 0xb0;     // 50ms         12M
  181.         }
  182. }
復(fù)制代碼

所有資料51hei提供下載:
單片機脈搏計 12864.7z (1.45 MB, 下載次數(shù): 81)

評分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

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

使用道具 舉報

沙發(fā)
ID:1144925 發(fā)表于 2025-3-6 16:07 | 只看該作者
電源模塊的p1是什么元件啊
回復(fù)

使用道具 舉報

板凳
ID:136013 發(fā)表于 2025-3-7 12:15 | 只看該作者
safoji 發(fā)表于 2025-3-6 16:07
電源模塊的p1是什么元件啊

DC座唄
回復(fù)

使用道具 舉報

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

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表