• [51单片机] nRF24L01 无线模块 串口法命令 通过无线控制另一个的灯


    >_<!概述:

    这是在上一个的基础上通过按键发送4种不同命令来控制接收端的LED灯亮的改进版(上一个:http://www.cnblogs.com/zjutlitao/p/3840013.html),这里俺把按键发命令给去掉,然后加入一个串口通信的功能,PC通过串口给发送端发送命令,然后发送端通过无线将命令发给接收端来实现控制,这里接收端和上一个例程中的一样,只是在发送端的代码里去除了按键控制,变成了串口控制。

    >_<!发送端电路:

    >_<!接收电路图:

    >_<!代码:

    由于这里的接收端的代码和上一个一样,所以不做介绍(惜墨如金呀,哈哈~~),下面就发送端进行介绍:

     1 /*------------------------------------------------
     2 定义UART_Init函数
     3 ------------------------------------------------*/
     4 void UART_Init(void)
     5 {
     6     SCON = 0x50;         // 设定串行口工作方式,8位数据位,允许接收
     7     T2CON = 0x34;         //设置定时器2,作为波特率发生器
     8     RCAP2L = 0XDC;      //9600波特率的低8位
     9     RCAP2H = 0XFF;        //9600波特率的高8位    
    10     ES = 1;                 //允许串口中断
    11     EA = 1;                 //允许总中断
    12 }

    这里是串口初始化函数,采用定时器2作为波特率发生器,允许串口中断(我采用发送就是循环发送策略,而接受通过触发中断来改变标志符,在主函数里再判断标志符来判断是否收到数据,预知更多详情,请继续浏览,哈哈)

    1 /*------------------------------------------------
    2 定义UART_Send_Byte函数
    3 ------------------------------------------------*/
    4 void UART_Send_Byte(uchar byte)
    5 {
    6     SBUF=byte;              //缓冲区装载要发送的字节数据
    7     while(TI==0);        //等待发送完毕,TI标志位会置1
    8     TI=0;                //清零发送完成标志位
    9 }

    这是我定义的一个发送一个字符的串口发送函数,大致意思就是把待发送数据给SBUF,然后等待标志位TI为1,即发送完毕,最后别忘清0!

     1 /*------------------------------------------------
     2 串口接收中断服务程序
     3 ------------------------------------------------*/
     4 void UART(void) interrupt 4
     5 {
     6     if(RI)                   //检测接收完成标志位置1
     7     {
     8         RI=0;            //清零接收完成标志位
     9         a=SBUF;            //读取接收到的数据
    10         uart_flag = 1;    //中断标志位置1
    11     }
    12 }

    上一个函数负责发送,这一个是负责接收的函数,对的,这里采用的是串口接收中断,当触发串口中断时,判断是否RI为1,即接收完成与否,如果接收完成就把缓冲SBUF中的数据给全局变量a,然后置接收标志uart_flag为1,并RI清0.

     1 /*------------------------------------------------
     2 main函数
     3 ------------------------------------------------*/
     4 void main()
     5 {
     6      LED6=1;                //初始灯6熄灭   
     7      uart_flag=0;            //串口标志初始为0
     8      init_NRF24L01();        //初始化24L01
     9      UART_Init();            //初始化串口
    10 
    11      while(NRF24L01_Check())                    //检查不到24l01则报警 
    12      {
    13         beep=0;
    14         delay_ms(200);
    15         beep=1;
    16         delay_ms(200);
    17      }
    18      while(1)
    19      {    
    20         RX_Mode();                            //接收模式  
    21         while(!nRF24L01_RxPacket(Rx_Buf))     //等待接收数据,返回1则接收到数据,在等待接收数据期间,可以随时变成发送模式  
    22         {
    23             if(uart_flag==1)                //当串口接受标志为1表示有数据过来
    24             {
    25                 ES=0;                               //关串口中断
    26             
    27                 TX_Mode();                         //发送模式 
    28                 Tx_Buf1[0]=a-'0';                    //将串口数据给发送缓冲区
    29                 nRF24L01_TxPacket(Tx_Buf1);        //发送命令数据24L01
    30                 UART_Send_Byte('O');            //向串口发送已经传送
    31                 UART_Send_Byte('K');
    32                 UART_Send_Byte(':');
    33                 UART_Send_Byte(a);
    34                 UART_Send_Byte('
    ');
    35                 LED6=0;
    36                 delay_ms(300);
    37                 LED6=1;
    38                 delay_ms(300);                    //发送后LED1闪一下 
    39 
    40                 ES=1;                            //允许串口中断
    41                 uart_flag=0;                      //中断标志位置0
    42                 break;                            //退出最近的循环,从而变回接收模式,这句关键
    43             }
    44          }
    45          if(Rx_Buf[0]==1)                               //若接收到对应的数据则实现对应功能 
    46          {
    47              Rx_Buf[0]=0;                //清空数据 
    48              LED6=0;
    49               delay_ms(300);
    50               LED6=1;
    51               delay_ms(300);                //接收到数据 后闪烁      
    52          }
    53      }
    54 }

    主函数初始化串口和24L01,然后检测24L01是否存在,若不存在就响铃,接着进入主循环,设置24L01为接收模式,循环检测是否收到数据,如果收到数据直接跳到第45行对信息处理作出相应动作,如果没有收到数据就一直执行循环体内的代码,循环体内不断检查uart_flag是否为1,即是否收到了数据,当收到了数据就关闭串口中断,将收到的数据发送出去,并回复PC端,并使LED6闪烁一次。【PC端为1,2,3,4】

    >_<!注:

    • l 如果24L01用reg51那么两个设备都要用reg51,如果用reg52就都得用reg52!
    • l PC通过串口发送给单片机命令[相当于协调器],单片机把命令通过24L01无线发送给另一个单片机,另一个单片机控制灯LED1,LED2,LED3,LED4闪烁。

    资源下载链接:http://pan.baidu.com/s/1bntPMFH

  • 相关阅读:
    vue-cli的使用
    修饰模式(Decorator结构型)C#简单例子
    c#继承中的函数调用
    c#桥接模式(bridge结构模式)
    c#浅谈反射内存的处理
    C#中的try catch finally
    C#微信公众号开发系列教程(接收事件推送与消息排重)
    用 C# 读取二进制文件
    c#语言-多线程中的锁系统(一)
    .NET程序内,访问私有或者保护成员的技巧
  • 原文地址:https://www.cnblogs.com/zjutlitao/p/3840488.html
Copyright © 2020-2023  润新知