码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2014-07-13 23:07:23      阅读:608      评论:0      收藏:0      [点我收藏+]

标签:style   blog   http   color   strong   数据   

 

 

>_<!概述:

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

>_<!发送端电路:

bubuko.com,布布扣

>_<!接收电路图:

bubuko.com,布布扣

>_<!代码:

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

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

bubuko.com,布布扣

 

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

 

 

 

 

 

 

 

 

 

 

 

[51单片机] nRF24L01 无线模块 串口法命令 通过无线控制另一个的灯,布布扣,bubuko.com

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

标签:style   blog   http   color   strong   数据   

原文地址:http://www.cnblogs.com/zjutlitao/p/3840488.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!