#include <at892051.h> #include <intrins.h> #include <absacc.h> #include <string.h>
#define uchar unsigned char #define uint unsigned int
#define NOP _nop_() #define FALSE 0 #define TRUE 1 /************************************************ //端口定义 *************************************************/ sbit KEY_start=P3^3; //按键statr sbit KEY_stop=P3^7; //按键stop sbit RF_DR1=P1^1; //数据1准备好 sbit RF_CLK1=P3^2; //时钟输出 sbit RF_DAT=P1^0; //数据输出 sbit RF_CS=P1^2; //片选控制 sbit RF_PM=P1^7; //电源管理控制 sbit RF_CE=P1^6; //使能控制 sbit LED_RX=P3^5; //LED指示灯 sbit LED_TX=P3^4; //LED指示灯控制方向
void DelayX10ms(int count); //延迟时间 void chuankou_int(); void LED_RXRX(uchar ss); void LED_TXTX(uchar sss);
//////////////////////////////////////////////////////////////////////////// //nrf2401a模块程序 //////////////////////////////////////////////////////////////////////////// void delay(uchar h); unsigned char ReadData(void); void WriteData(); void Init2401A(void); void RX_Mode(void); void TX_Mode(void); void PowOffMode(void); void SleepMode(void); void ConfigMode(void); void RunMode(void); unsigned char ReadData(void); void WriteByte2401A(uchar data1); // uchar RF_TX_Buff[10]={0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55}; uchar RF_TX_Buff[10]; uchar RF_RX_Buff[10];
uchar j=0; /****************************************** 2401A单字节数据传输写入函数WriteByte2401A() 作用:向2401A写入单字节数据 入口:待写入的一字节数据 出口:无 *******************************************/ void WriteByte2401A(uchar data1) { uchar cnt1; // RF_DAT_T=0; //数据端口方向设置 for(cnt1=8;cnt1>0;cnt1--) { if(data1&0x80) {RF_DAT=1;} else {RF_DAT=0;} NOP; RF_CLK1=1; NOP; RF_CLK1=0; data1<<=1; } }
/****************************************** 2401A单字节数据读取函数ReadByte2401A() 作用:从2401A中读取单字节数据 入口:无 出口:读取的单字节数据 *******************************************/ unsigned char ReadByte2401A(void) { uchar cnt,data1; // RF_DAT_T=1; //数据端口方向设置 data1=0; for(cnt=8;cnt>0;cnt--) { data1<<=1; if(RF_DAT) {data1|=0x01;} else {data1&=0xfe;} NOP; RF_CLK1=1; NOP; RF_CLK1=0; } return(data1); }
/****************************************** 2401A运行模式设置函数RunMode() 作用:设置芯片为工作(接收/发射)模式 入口:无 出口:无 *******************************************/ void RunMode(void) { RF_PM=1; RF_CS=0; RF_CE=1; }
/****************************************** 2401A配置模式设置函数ConfigMode() 作用:设置芯片为配置模式 入口:无 出口:无 *******************************************/ void ConfigMode(void) { RF_PM=1; RF_CE=0; RF_CS=1; }
/****************************************** 2401A睡眠模式设置函数SleepMode() 作用:设置芯片为睡眠模式 入口:无 出口:无 *******************************************/ void SleepMode(void) { RF_PM=1; RF_CE=0; RF_CS=0; }
/****************************************** 2401A关机模式设置函数PowOffMode() 作用:设置芯片为关机模式 入口:无 出口:无 *******************************************/ void PowOffMode(void) { RF_PM=0; RF_CE=0; RF_CS=0; }
/****************************************** 2401A发送模式设置函数TX_Mode() 作用:设置芯片为发送模式 入口:无 出口:无 *******************************************/ void TX_Mode(void) { //进入配置模式 ConfigMode(); //配置参数 WriteByte2401A(0X64); //进入收发模式 RunMode(); }
/****************************************** 2401A接收模式设置函数RX_Mode() 作用:设置芯片为发送模式 入口:无 出口:无 *******************************************/ void RX_Mode(void) { //进入配置模式 ConfigMode(); //配置参数 WriteByte2401A(0X65); //进入收发模式 RunMode(); }
/****************************************** 2401A初始化函数Init2401A() 作用:初始化2401A 入口:无 出口:无 *******************************************/ void Init2401A(void) { uint cnt; //设置端口 RF_CLK1=0; RF_DAT=0; SleepMode(); // for(cnt=320;cnt>0;cnt--); //延时等待上电 4mhz for(cnt=2;cnt>0;cnt--); //32khz ConfigMode(); //进入配置模式 for(cnt=2;cnt>0;cnt--); //32khz // for(cnt=320;cnt>0;cnt--); //延时等待上电 4mhz WriteByte2401A(0X50); WriteByte2401A(0X50); WriteByte2401A(0XAA); WriteByte2401A(0XBB); WriteByte2401A(0XCC); WriteByte2401A(0XDD); WriteByte2401A(0XEE); WriteByte2401A(0XAA); WriteByte2401A(0XBB); WriteByte2401A(0XCC); WriteByte2401A(0XDD); WriteByte2401A(0XEE); WriteByte2401A(0XA3); WriteByte2401A(0X6F); WriteByte2401A(0X64); SleepMode(); }
/****************************************** 2401A 数据写入函数WriteData() 作用:向2401A写入发射数据 入口:无 出口:无 *******************************************/ void WriteData() { uchar cnt; TX_Mode(); RF_CE=1; //发送地址 WriteByte2401A(0XAA); WriteByte2401A(0XBB); WriteByte2401A(0XCC); WriteByte2401A(0XDD); WriteByte2401A(0XEE); //发送数据 for(cnt=0;cnt<10;cnt++) {WriteByte2401A(RF_TX_Buff[cnt]);} //启动发送 RF_CE=0; DelayX10ms(1); SleepMode(); }
/****************************************** 2401A 数据读入读取函数ReadData() 作用:从2401A中读出接收数据 入口:无 出口:1.接收的数据存放于接收缓冲区 2.返回非0接收正常,0接收错误 *******************************************/ unsigned char ReadData(void) { uchar cnt; if(RF_DR1) { for(cnt=0;cnt<10;cnt++) {RF_RX_Buff[cnt]=ReadByte2401A();} return(1); } else return(0); }
//////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////////
//初始化串行口 void chuankou_int() { SCON = 0x50; // Mode 1, 1 star bit, 8 data bit, 1,stop bit UART, enable receive TMOD = 0x20; // Timer 1, mode 2, 8-bit auto reload, PCON=0x80; //SMOD位清0, 波特率不加倍 TH1=0x0FD; //串口波特率赋值 TL1=0X0FD; ET1=0; //定时器记数器中断益出允许标志 ES=1; //串口中断允许位 TR1=1; //使能定时器1 EA=1; //开总中断 }
void intrr() interrupt 4 { uchar i; ES=0; RF_TX_Buff[j]=SBUF; j++; //关串口中断允许位 while(!RI); RI=0; if(j==10) { WriteData(); for(i=0;i<10;i++) { SBUF=RF_TX_Buff; while(!TI); TI=0; } LED_TX=0; DelayX10ms(2); LED_TX=1; DelayX10ms(2); j=0; } ES=1; //串口中断允许位 RI=0; }
void DelayX10ms(int count) //延迟时间 { int i,j,k; for(i=0;i<count;i++) for(j=0;j<10;j++) for(k=0;k<120;k++) {;} }
void LED_RXRX(uchar ss) { while(ss--) { LED_RX=0; DelayX10ms(10); LED_RX=1; DelayX10ms(10); } }
void LED_TXTX(uchar sss) { while(sss--) { LED_TX=0; DelayX10ms(10); LED_TX=1; DelayX10ms(10); } } void main(void) { uchar i; LED_RXRX(3); LED_TXTX(3); Init2401A(); chuankou_int(); TX_Mode(); // RX_Mode(); while(1) { ; /* TX_Mode(); DelayX10ms(1); WriteData(); LED_TXTX(1); PowOffMode(); DelayX10ms(300); /* if(ReadData()) { for(i=0;i<10;i++) { if(RF_TX_Buff==RF_RX_Buff) { SBUF=RF_RX_Buff; RF_RX_Buff=0; LED_RX=0; DelayX10ms(2); LED_RX=1; DelayX10ms(2); } } } */ } }
qq:174231959欢迎感兴趣的朋友一起讨论
|