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

基于51单片机的nrf24l01无线的接受和发射程序

发布时间:2021-04-19 发布时间:
|

通过灯的闪烁来判断数据的接受和发射
有接收端和发射段的程序

如果24L01用reg51那么两个设备都要用reg51,如果用reg52就都得用reg52!

PC通过串口发送给单片机命令[相当于协调器],单片机把命令通过24L01无线发送给另一个单片机,另一个单片机控制灯LED1,LED2,LED3,LED4闪烁。

无线发射程序:

#include"2401.h"


#define uint unsigned int

#define uchar unsigned char


//1//sbit KEY1=P0^0;                         //发送按键 

//1//sbit KEY2=P0^1;

//1//sbit KEY3=P0^2;

//1//sbit KEY4=P0^3;

sbit beep=P2^3;                                        //喇叭 

sbit LED6=P1^6;                                         //发送数据时显示灯+接收到数据后的功能实现灯


uchar Tx_Buf1[]={1};                        //发送的信息1 

uchar Rx_Buf[32];                                  //接收到的数据暂存器,最多32字节数据  

uchar uart_flag,a;                        //串口接收标志【收到数据就置1】,a为接收到的数据

/*------------------------------------------------

延时函数

------------------------------------------------*/

void delay_ms(uint z)                        //延时函数 

{

        uint y;

        while(z--)

                for(y=110;y>0;y--);

}

/*------------------------------------------------

定义UART_Init函数

------------------------------------------------*/

void UART_Init(void)

{

        SCON = 0x50;                 // 设定串行口工作方式,8位数据位,允许接收

    T2CON = 0x34;                 //设置定时器2,作为波特率发生器

        RCAP2L = 0XDC;          //9600波特率的低8位

        RCAP2H = 0XFF;                //9600波特率的高8位        

        ES = 1;                                 //允许串口中断

        EA = 1;                                 //允许总中断

}

/*------------------------------------------------

定义UART_Send_Byte函数

------------------------------------------------*/

void UART_Send_Byte(uchar byte)

{

        SBUF=byte;                          //缓冲区装载要发送的字节数据

        while(TI==0);                //等待发送完毕,TI标志位会置1

        TI=0;                                //清零发送完成标志位

}

/*------------------------------------------------

串口接收中断服务程序

------------------------------------------------*/

void UART(void) interrupt 4

{

        if(RI)                                   //检测接收完成标志位置1

        {

                RI=0;                        //清零接收完成标志位

                a=SBUF;                        //读取接收到的数据

                uart_flag = 1;        //中断标志位置1

        }

}

/*------------------------------------------------

main函数

------------------------------------------------*/

void main()

{

         LED6=1;                                //初始灯6熄灭   

         uart_flag=0;                        //串口标志初始为0

         init_NRF24L01();                //初始化24L01

         UART_Init();                    //初始化串口


         while(NRF24L01_Check())                                        //检查不到24l01则报警 

         {

                beep=0;

                delay_ms(200);

                beep=1;

                delay_ms(200);

         }

         while(1)

         {        

                RX_Mode();                                                        //接收模式  

                while(!nRF24L01_RxPacket(Rx_Buf))         //等待接收数据,返回1则接收到数据,在等待接收数据期间,可以随时变成发送模式  

            {

                        if(uart_flag==1)                                //当串口接受标志为1表示有数据过来

                        {

                                ES=0;                                                           //关串口中断

                        

                                TX_Mode();                                                 //发送模式

                                Tx_Buf1[0]=a-'0';                                        //将串口数据给发送缓冲区

                            nRF24L01_TxPacket(Tx_Buf1);                //发送命令数据24L01

                                UART_Send_Byte('O');                        //向串口发送已经传送

                                UART_Send_Byte('K');

                                UART_Send_Byte(':');

                                UART_Send_Byte(a);

                                UART_Send_Byte('n');

                                LED6=0;

                            delay_ms(300);

                                LED6=1;

                            delay_ms(300);                                        //发送后LED1闪一下 


                                ES=1;                                                        //允许串口中断

uart_flag=0; //



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

热门文章 更多
AVR熔丝位操作时的要点和需要注意的相关事项