×
单片机 > 单片机程序设计 > 详情

nRF24L01+51单片机无线语音点滴报警系统

发布时间:2020-06-17 发布时间:
|

使用的51单片机作为主控芯片,两个51单片机通过24L01通信,一个检测吊瓶滴液的速度,如果太快太慢或者不滴液都会报警,并发送到主机,输液者也可以主动通过按键呼叫主机,丛机用1602显示,主机用12864显示。

 

Altium Designer画的原理图和PCB图如下:

 

单片机源程序如下:

#include

#include

#include "keys.h"

#include "24L01.h"

#include "LCD1602.h"

#define uint unsigned int

#define uchar unsigned char

sbit YeDi=P2^0;//红外信号采集口

sbit Speaker=P2^4;//蜂鸣器


uchar TX_buf[32]=0;

uchar View_Con=0;

uchar View_Change=1;

uchar View_Con_Change=1;

uint  Cap_Data=100;

uint  Cap_View=0;


uchar View_Data[8];


uint YeDi_Num=0;


void InitTimer0(void)

{

    TMOD |= 0x01;

    TH0 = 0x0D8;         //10000us

    TL0 = 0x0F0;

    EA = 1;

    ET0 = 1;

    TR0 = 1;

}


void InitTimer1(void)

{

    TMOD |= 0x10;

    TH1 = 0x0FC;   //1000us

    TL1 = 0x18;

    EA = 1;

    ET1 = 1;

    

}



void main()

{

TX_buf[1]=0;

TX_buf[2]=2;

TX_buf[3]=5;

TX_buf[4]=4;

InitLcd();

Lcd_1602_word(0x80,16,"    NRF24L01    ");      //1602第一行显示      NRF24L01

//Lcd_1602_word(0xc0,16,"   Connecting   ");       //1602第二行显示       Connecting

while(NRF24L01_Check());     //检查24L01是否存在

NRF24L01_Init();    //开机的时候需要初始化24l01

InitTimer0();        //定时计数器0初始化

InitTimer1();        //定时计数器1初始化

    Lcd_1602_word(0xc0,16,"   Connecting   ");

while(1)

  {

   if(Key_Change)     //如果Key_Change为真

    {

     Key_Change=0;

     View_Change=1;

     switch(Key_Value)    //选择键值

      {

       case 1:

              {

               View_Con_Change=1;

               if(View_Con==0)

                {

                 View_Con=1;

                 TR1 = 1;

                 Cap_View=Cap_Data*100;

                }

               if(View_Con==2)

                {

                 View_Con=1;

                 TR1 = 1;

                } 

               break;

              }

       case 2:

                 {

               if(View_Con==0)               //液滴加

                {

                 if(Cap_Data<=500)

                  Cap_Data+=10;

                }

               break;

              }

       case 3:

                 {

               if(View_Con==0)

                {

                 if(Cap_Data>10)              //液滴减

                  Cap_Data-=10;

                }

               break;

              }

       case 4:

                 {

               if(View_Con==1)

                {

                 TR1 = 0;

                 YeDi_Num=0;

                 View_Con=2;

                 View_Con_Change=1;

                 TX_buf[0]=0xf5;//蜂鸣器响

                 TX_buf[5]=4;//用户呼叫

               NRF24L01_TxPacket(TX_buf);

                 NRF24L01_TxPacket(TX_buf);

        

                }

               break;

              }

      }

    }

   if(View_Change)

    {

      View_Change=0;

      if(View_Con_Change)

       {

           View_Con_Change=0;

        switch(View_Con)

         {

          case 0:Lcd_1602_word(0x80,16,"Infusion Set:   ");Lcd_1602_word(0xc0,16,"                ");break;

           case 1:Lcd_1602_word(0x80,16,"In The Infusion ");Lcd_1602_word(0xc0,16,"                ");Speaker=1;break;

          case 2:

                  {

                 Lcd_1602_word(0x80,16,"****Warning*****");Lcd_1602_word(0xc0,16,"****Warning*****");Speaker=0;

                 if(TX_buf[5]<4)

                  while(1);

                 break;

                }

         }

       }

     switch(View_Con)

         {

          case 0:

                  {

                 View_Data[0]=Cap_Data/100+0x30;

                 View_Data[1]=Cap_Data%100/10+0x30;

                 View_Data[2]=Cap_Data%10+0x30;

                 View_Data[3]='m';

                 View_Data[4]='l';

                 if(View_Data[0]==0x30)

                  View_Data[0]=' ';

                 Lcd_1602_word(0xcb,5,View_Data);

                 break;

                }

           case 1:

                  {

                 View_Data[0]=Cap_View/10000+0x30;

                 View_Data[1]=Cap_View%10000/1000+0x30;

                 View_Data[2]=Cap_View%1000/100+0x30;

                 View_Data[3]='.';

                 View_Data[4]=Cap_View%100/10+0x30;

                 View_Data[5]=Cap_View%10+0x30;

                 View_Data[6]='m';

                 View_Data[7]='l';

                 if(View_Data[0]==0x30)

                  {

                   View_Data[0]=' ';

                   if(View_Data[1]==0x30)

                    {

                     View_Data[1]=' ';

                    }

                  }

                 Lcd_1602_word(0xc8,8,View_Data);

                 break;

                }

         }

    }

  }

}


void Timer0Interrupt(void) interrupt 1

{

    static     uchar YeDi_Con;

    static  uchar Key_Time0_Con;

    TH0 = 0xfc;

    TL0 = 0x18;

    Key_Time0_Con++;

    switch(YeDi_Con)

     {

      case 0:

              {

if(YeD


『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
如何为单片机选择合适的负载电容