[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('\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闪烁。

 

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

 



本文转自beautifulzzzz博客园博客,原文链接:http://www.cnblogs.com/zjutlitao/p/3840488.html,如需转载请自行联系原作者

相关文章
|
3月前
|
传感器 物联网 芯片
毕业设计 基于STM32单片机无线ZIGBEE智能大棚土壤湿度光照检测
毕业设计 基于STM32单片机无线ZIGBEE智能大棚土壤湿度光照检测
|
4月前
|
数据处理
基于51单片机的无线充电器设计与实现
基于51单片机的无线充电器设计与实现
|
7月前
|
内存技术
单片机(MCU)如何才能不死机之串口Overrun
单片机(MCU)如何才能不死机之串口Overrun
|
6月前
|
数据处理
基于51单片机的无线充电器设计与实现
无线电能传输技术是一种新的能量传输技术,其主要功能是共振耦合的无线电能传输,其传输效率高,适合中等传输距离,基于磁场与共振耦合原理,可有效地将电能传输至负荷,从而解决了传统电力传输模式存在的诸多弊端。本论文以单片机为核心,利用无线充电线圈的电磁感应原理,对移动电话进行充电。首先,在参考国内外有关资料的基础上,对整个无线充电设备的总体设计进行了研究,确定了各模块的功能,并对其进行了硬件电路的设计和构建。在此基础上,编写了单片机的控制软件,完成了各部分的控制,并完成了实际的焊接和试验,并完成了以单片机为核心的无线充电设备的系统设计。
193 0
|
3月前
|
网络协议 Linux
嵌入式单片机开源的串口示波器实现方法
嵌入式单片机开源的串口示波器实现方法
23 0
|
4月前
|
人工智能 前端开发 JavaScript
基于51单片机的无线充电器设计与实现
无线电能传输技术是一种新的能量传输技术,其主要功能是共振耦合的无线电能传输,其传输效率高,适合中等传输距离,基于磁场与共振耦合原理,可有效地将电能传输至负荷,从而解决了传统电力传输模式存在的诸多弊端。本论文以单片机为核心,利用无线充电线圈的电磁感应原理,对移动电话进行充电。首先,在参考国内外有关资料的基础上,对整个无线充电设备的总体设计进行了研究,确定了各模块的功能,并对其进行了硬件电路的设计和构建。在此基础上,编写了单片机的控制软件,完成了各部分的控制,并完成了实际的焊接和试验,并完成了以单片机为核心的无线充电设备的系统设计
|
7月前
STM32F0单片机快速入门七 串口(UART)操作从轮询到中断
STM32F0单片机快速入门七 串口(UART)操作从轮询到中断
STM32F0单片机快速入门七 串口(UART)操作从轮询到中断
|
7月前
|
芯片
STM32F0单片机快速入门六 用库操作串口(UART)原来如此简单
STM32F0单片机快速入门六 用库操作串口(UART)原来如此简单
|
7月前
|
C语言
简单的C语言宏定义结合全局变量的方法实现单片机串口实现透传模式
简单的C语言宏定义结合全局变量的方法实现单片机串口实现透传模式
61 0
|
8月前
【单片机期中测试】13.串口通信的应用(2)—— 超声波通过串口返回数据
【单片机期中测试】13.串口通信的应用(2)—— 超声波通过串口返回数据
78 0