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

nRF24L01 无线模块 串口法命令 通过无线控制另一个的灯

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

>_

这是在上一个的基础上通过按键发送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('\n');

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闪烁。


关键字:nRF24L01  无线模块  无线控制 

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

热门文章 更多
基于STM32单片机秒中断源和闹钟中断源的解决方案