找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3135|回复: 2
打印 上一主题 下一主题
收起左侧

nRF24L01+51单片机无线语音点滴报警系统源程序+PCB源文件

[复制链接]
跳转到指定楼层
楼主
使用的51单片机作为主控芯片,两个51单片机通过24L01通信,一个检测吊瓶滴液的速度,如果太快太慢或者不滴液都会报警,并发送到主机,输液者也可以主动通过按键呼叫主机,丛机用1602显示,主机用12864显示。
主机.7z (63.93 KB, 下载次数: 75) 无线语音点滴系统 从机.7z (76.39 KB, 下载次数: 66)

Altium Designer画的原理图和PCB图如下:(51hei附件中可下载工程文件)


单片机源程序如下:
  1. #include <reg52.h>
  2. #include <intrins.h>
  3. #include "keys.h"
  4. #include "24L01.h"
  5. #include "LCD1602.h"
  6. #define uint unsigned int
  7. #define uchar unsigned char
  8. sbit YeDi=P2^0;//红外信号采集口
  9. sbit Speaker=P2^4;//蜂鸣器

  10. uchar TX_buf[32]=0;
  11. uchar View_Con=0;
  12. uchar View_Change=1;
  13. uchar View_Con_Change=1;
  14. uint  Cap_Data=100;
  15. uint  Cap_View=0;

  16. uchar View_Data[8];

  17. uint YeDi_Num=0;

  18. void InitTimer0(void)
  19. {
  20.     TMOD |= 0x01;
  21.     TH0 = 0x0D8;         //10000us
  22.     TL0 = 0x0F0;
  23.     EA = 1;
  24.     ET0 = 1;
  25.     TR0 = 1;
  26. }

  27. void InitTimer1(void)
  28. {
  29.     TMOD |= 0x10;
  30.     TH1 = 0x0FC;   //1000us
  31.     TL1 = 0x18;
  32.     EA = 1;
  33.     ET1 = 1;
  34.    
  35. }


  36. void main()
  37. {
  38. TX_buf[1]=0;
  39. TX_buf[2]=2;
  40. TX_buf[3]=5;
  41. TX_buf[4]=4;
  42. InitLcd();
  43. Lcd_1602_word(0x80,16,"    NRF24L01    ");      //1602第一行显示      NRF24L01
  44. //Lcd_1602_word(0xc0,16,"   Connecting   ");       //1602第二行显示       Connecting
  45. while(NRF24L01_Check());     //检查24L01是否存在
  46. NRF24L01_Init();    //开机的时候需要初始化24l01
  47. InitTimer0();        //定时计数器0初始化
  48. InitTimer1();        //定时计数器1初始化
  49.     Lcd_1602_word(0xc0,16,"   Connecting   ");
  50. while(1)
  51.   {
  52.    if(Key_Change)     //如果Key_Change为真
  53.     {
  54.      Key_Change=0;
  55.      View_Change=1;
  56.      switch(Key_Value)    //选择键值
  57.       {
  58.        case 1:
  59.               {
  60.                View_Con_Change=1;
  61.                if(View_Con==0)
  62.                 {
  63.                  View_Con=1;
  64.                  TR1 = 1;
  65.                  Cap_View=Cap_Data*100;
  66.                 }
  67.                if(View_Con==2)
  68.                 {
  69.                  View_Con=1;
  70.                  TR1 = 1;
  71.                 }
  72.                break;
  73.               }
  74.        case 2:
  75.                  {
  76.                if(View_Con==0)               //液滴加
  77.                 {
  78.                  if(Cap_Data<=500)
  79.                   Cap_Data+=10;
  80.                 }
  81.                break;
  82.               }
  83.        case 3:
  84.                  {
  85.                if(View_Con==0)
  86.                 {
  87.                  if(Cap_Data>10)              //液滴减
  88.                   Cap_Data-=10;
  89.                 }
  90.                break;
  91.               }
  92.        case 4:
  93.                  {
  94.                if(View_Con==1)
  95.                 {
  96.                  TR1 = 0;
  97.                  YeDi_Num=0;
  98.                  View_Con=2;
  99.                  View_Con_Change=1;
  100.                  TX_buf[0]=0xf5;//蜂鸣器响
  101.                  TX_buf[5]=4;//用户呼叫
  102.                NRF24L01_TxPacket(TX_buf);
  103.                  NRF24L01_TxPacket(TX_buf);
  104.         
  105.                 }
  106.                break;
  107.               }
  108.       }
  109.     }
  110.    if(View_Change)
  111.     {
  112.       View_Change=0;
  113.       if(View_Con_Change)
  114.        {
  115.            View_Con_Change=0;
  116.         switch(View_Con)
  117.          {
  118.           case 0:Lcd_1602_word(0x80,16,"Infusion Set:   ");Lcd_1602_word(0xc0,16,"                ");break;
  119.            case 1:Lcd_1602_word(0x80,16,"In The Infusion ");Lcd_1602_word(0xc0,16,"                ");Speaker=1;break;
  120.           case 2:
  121.                   {
  122.                  Lcd_1602_word(0x80,16,"****Warning*****");Lcd_1602_word(0xc0,16,"****Warning*****");Speaker=0;
  123.                  if(TX_buf[5]<4)
  124.                   while(1);
  125.                  break;
  126.                 }
  127.          }
  128.        }
  129.      switch(View_Con)
  130.          {
  131.           case 0:
  132.                   {
  133.                  View_Data[0]=Cap_Data/100+0x30;
  134.                  View_Data[1]=Cap_Data%100/10+0x30;
  135.                  View_Data[2]=Cap_Data%10+0x30;
  136.                  View_Data[3]='m';
  137.                  View_Data[4]='l';
  138.                  if(View_Data[0]==0x30)
  139.                   View_Data[0]=' ';
  140.                  Lcd_1602_word(0xcb,5,View_Data);
  141.                  break;
  142.                 }
  143.            case 1:
  144.                   {
  145.                  View_Data[0]=Cap_View/10000+0x30;
  146.                  View_Data[1]=Cap_View%10000/1000+0x30;
  147.                  View_Data[2]=Cap_View%1000/100+0x30;
  148.                  View_Data[3]='.';
  149.                  View_Data[4]=Cap_View%100/10+0x30;
  150.                  View_Data[5]=Cap_View%10+0x30;
  151.                  View_Data[6]='m';
  152.                  View_Data[7]='l';
  153.                  if(View_Data[0]==0x30)
  154.                   {
  155.                    View_Data[0]=' ';
  156.                    if(View_Data[1]==0x30)
  157.                     {
  158.                      View_Data[1]=' ';
  159.                     }
  160.                   }
  161.                  Lcd_1602_word(0xc8,8,View_Data);
  162.                  break;
  163.                 }
  164.          }
  165.     }
  166.   }
  167. }

  168. void Timer0Interrupt(void) interrupt 1
  169. {
  170.     static     uchar YeDi_Con;
  171.     static  uchar Key_Time0_Con;
  172.     TH0 = 0xfc;
  173.     TL0 = 0x18;
  174.     Key_Time0_Con++;
  175.     switch(YeDi_Con)
  176.      {
  177.       case 0:
  178.               {
  179.              if(YeDi==1)
  180.               YeDi_Con++;
  181.              break;
  182.             }
  183.       case 1:
  184.               {
  185.              if(YeDi==0)
  186.               {
  187.                YeDi_Con=2;
  188.                YeDi_Num=0;
  189.                TR1 = 1;
  190.               }
  191.              break;
  192.             }
  193.       case 2:
  194.               {
  195.              if(YeDi==1)
  196.               {
  197.                TR1 = 0;
  198.                YeDi_Con=0;
  199.                if(View_Con==1)
  200.                 {
  201.                  View_Change=1;
  202.                  Cap_View=Cap_View-4;
  203.                  if(YeDi_Num<500)     //小于0.5s则报警
  204.                   {
  205.                    View_Con=2;
  206.                    View_Con_Change=1;
  207.                    TX_buf[0]=0xf5;
  208.                    TX_buf[5]=1;
  209.                    NRF24L01_TxPacket(TX_buf);
  210.                    NRF24L01_TxPacket(TX_buf);
  211.                
  212.                   }
  213.                  if(Cap_View<100)    //小于1毫升,报警
  214.                   {
  215.                    View_Con=2;
  216.                    View_Con_Change=1;
  217.                    TX_buf[0]=0xf5;
  218.                    TX_buf[5]=3;
  219.                    NRF24L01_TxPacket(TX_buf);
  220.                    NRF24L01_TxPacket(TX_buf);
  221.         
  222.                   }
  223.                 }
  224.                TR1 = 1;
  225.                YeDi_Num=0;
  226.               }
  227.              break;
  228.             }
  229.      }
  230.     if(Key_Time0_Con==10)
  231.      {
  232.       Key_Time0_Con=0;
  233.       Key_Acquisition();
  234.      }
  235.    
  236. }

  237. void Timer1Interrupt(void) interrupt 3
  238. {
  239.     TH1 = 0x0FC;
  240.     TL1 = 0x18;
  241.     YeDi_Num++;
  242.     if(YeDi_Num>5000&&View_Con==1)    //大于5s则报警,
  243.      {
  244.       View_Con=2;
  245.       View_Change=1;
  246.       View_Con_Change=1;
  247.       TX_buf[0]=0xf5;
  248.       TX_buf[5]=2;
  249.       NRF24L01_TxPacket(TX_buf);
  250.       NRF24L01_TxPacket(TX_buf);
  251.          Lcd_1602_word(0x80,16,"    ok    ");
  252.      }
  253. }
复制代码

Fl0Gz7ZJ9F4r2FF-dLTyLMHqeDsS.png (18.11 KB, 下载次数: 109)

Fl0Gz7ZJ9F4r2FF-dLTyLMHqeDsS.png
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏5 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:58110 发表于 2020-1-2 08:30 | 只看该作者
学习学习,谢谢分享
回复

使用道具 举报

板凳
ID:947971 发表于 2023-4-24 23:23 | 只看该作者
你好,这个报警电路在哪里呀
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表