[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

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

时间: 2024-10-29 19:50:10

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

[51单片机] nRF24L01 无线模块 测试 按键-灯-远程控制

哈哈,穷吊死一个,自己做的一个超简单的板还没有电源提供,只得借助我的大开发板啦.其实这2个模块是完全可以分开的,无线嘛,你懂得!进入正题,这个实验的功能就是一个发送模块(大的那个板)连接4个按键,通过按动这4个不同的按键来发送4种不同的命令,来控制接收端(小的板)点亮4个不同的灯. >_<!首先是发送模块: 1 void main() 2 { 3 uchar Tx_Buf1[]={1}; //发送的信息1 4 uchar Rx_Buf[32]; //接收到的数据暂存器,最多32字节数据 5 i

51单片机GPIO口模拟串口通信

51单片机GPIO口模拟串口通信 标签: bytetimer终端存储 2011-08-03 11:06 6387人阅读 评论(2) 收藏 举报 本文章已收录于: 分类: 深入C语言(20) 作者同类文章X 1 #include "reg52.h" 2 #include "intrins.h" 3 #include "math.h" 4 #include "stdio.h" 5 sbit BT_SND =P1^5; 6 sbit

[51单片机]HC-SR04超声波模块与1602液晶显示

一,模块介绍 trig-使能引脚<输出超过10us高电平启动模块> echo-接收引脚<模块启动后在此脚发出8个40khz脉冲并产生高电平,高电平开始到结束的时间就是探测时间> vcc-电源 gnd-接地 二,使用 trig 与 echo 接单片机IO口: vcc 与 gnd 接单片机VCC,GND: 代码: #include<reg52.h>#include<intrins.h>void delay(unsigned char z)//延时 z 个毫秒{ 

51单片机蓝牙模块

51单片机的蓝牙模块,是在蓝牙通讯的基础上,进行蓝牙51模块与外部蓝牙发射接收设备之间,相互收发数据.并且其引脚为VCC,GND,TXD,RXD,可以通过串口通信与外部上位机或单片机通信. 代码如下(注意蓝牙模块是5V供电) #include<reg52.h> void init();void delay(unsigned int ms); unsigned char input;void display(unsigned char num_decimal);unsigned char cod

51单片机对无线模块nRF24L01简单的控制收发程序

它的一些物理特性如工作频段.供电电压.数据传输速率就不详细介绍了,直接上代码. 1.首先是发送端: // Define SPI pins #include <reg51.h> #define uchar unsigned char /***************************************************/ #define TX_ADR_WIDTH 5 // 5字节宽度的发送/接收地址 #define TX_PLOAD_WIDTH 4 // 数据通道有效数据宽度

[51单片机] SPI nRF24L01无线 [可以放在2个单片机里实现通信]

main.c 1 #include<reg51.h> 2 #include"2401.h" 3 4 #define uint unsigned int 5 #define uchar unsigned char 6 7 sbit KEY8=P3^7; //发送按键 8 sbit beep=P2^3;//喇叭 9 sbit LED6=P1^6; ////接收到数据后的功能实现灯 10 11 void delay_ms(uint z) //延时函数 12 { 13 uint x

[51单片机] SPI nRF24L01 无线简单程序 1

main.c 1 #include <reg51.h> 2 #include <api.h> 3 4 #define uchar unsigned char 5 6 /***************************************************/ 7 #define TX_ADR_WIDTH 5 // 5字节宽度的发送/接收地址 8 #define TX_PLOAD_WIDTH 4 // 数据通道有效数据宽度 9 #define LED P2 10 11

nRF2401A/nRF24L01/nRF24L01+无线模块最常见问题汇集(转)

俗话说:每个人一生下来什么都会的,都是通过自己努力和探索出来的,NRF系列芯片,刚开始都好奇心加兴趣才来捣鼓它的,刚开始做硬件和软件,没有收发数据弄得整个人头都快炸开了,所以在此和大家分享一下前辈的经验,希望大家会少走弯路. Q:最近在选型的时候发现基本常见的无线模块都是3V供电,而我使用的单片机是5V的,它们之间要怎么连接呢?直接连接会不会损坏模块? 回答: 如果你使用的51单片机的P0口是高阻引脚,可以直接将无线模块的IO脚连接到P0端口,并在对应的连线与3V电源间放置1K~10K左右的偏置

CB1 驱动NRF24L01 无线模块 通信成功

系统:lubuntu 官方  (喜欢cb官方原版)硬件: cb   NRF24L01*2   51开发板一块   杜邦线若干 CB1 驱动NRF24L01 无线模块与STC51单片机通信成功!!! 1.废话不多说,上图上代码: 2.自制51单片机开发板:(24L01在右下角,有内置接口)   3.来张清晰的图,上面手抖了,      LCD1602显示温度,并实时通过无线发给cubieboard 1   4. 下图,第一位是正负温度指示,0x00代表正 ,0xff代表零下  . 后两位分别代表温