📄 具备跳号跳频和跳址的nrf905的c51演示程序 (ourdev_cn 我们的电子开发社区).htm
字号:
<BR> SystemBuffers.nRFRxBuff[2] = RX_ADDRESS_2;
<BR> SystemBuffers.nRFRxBuff[3] = RX_ADDRESS_3;
<BR> SystemBuffers.nRFRxBuff[8] = CH_NO_BYTE;
<BR> SystemBuffers.nRFTxBuff[8] = CH_NO_BYTE;
<BR> SystemBuffers.RamTest = 0x55aa;
<BR> } <BR> else { <BR> } <BR>}
<BR><BR>void SystemSetup(void) using 0//系统设置 <BR>{
<BR> TimeInit();
<BR> IP = 0x05;//中断优先级EX0>EX1>ET0>ET1
<BR> SystemBuffers.TestTime = 0;
<BR> SystemBuffers.WaitTime = 0; <BR>}
<BR><BR>void TimeInit() using 0 <BR>{
<BR>// TCON = 0x55;//启动定时器
<BR>/*----------------------------------
<BR> 定时器0定时参数设置
<BR>----------------------------------*/
<BR> TL0 = 0; <BR> TH0 = 0;
<BR> TR0 = 1;//启动定时器0
<BR>/*----------------------------------
<BR> 定时器1定时参数设置
<BR>----------------------------------*/
<BR> TMOD = 0x20; //timer1 working mode 1
<BR> TL1 = 0xfd; //f7=9600 for 16mhz Fosc,and ...
<BR> TH1 = 0xfd; //...fd=19200 for 11.0592mhz Fosc
<BR> SCON = 0xd8; //uart mode 3,ren==1
<BR> PCON = 0x80;
<BR> SioBuffers.SioTXCount = 0;//无发送数据
<BR> SioBuffers.SioRXCount = 32;//允许接收串口数据
<BR> TR1 = 1;//启动定时器1
<BR>/*----------------------------------
<BR> 定时器2定时参数设置
<BR>----------------------------------*/
<BR> TIMEER2 = T2_5mS;
<BR> RCAP = T2_5mS;
<BR> TR2 = 1;//启动定时器2 <BR>}
<BR><BR>void nRFInit(void) using 0//无线模块初始化 <BR>{
<BR> do{
<BR> WritenRFConfig(SystemBuffers.nRFRxBuff);//配置nRF905
<BR> } <BR> while(VerifynRFConfig());
<BR> SetRxMode();//设置接收模式
<BR> SystemBuffers.nRFTxCount = 0;//清空无线发送数据缓冲区
<BR> SystemBuffers.nRFRxCount = 0;//清空无线接收数据缓冲区 <BR>}
<BR><BR>void ReadnRFConfig(unsigned char rxaddr[]) using 0//读配置nRF905
<BR>{ <BR>unsigned char i;
<BR> TRX_CE = 0;//设置nRF905为待机方式
<BR> _nop_();
<BR> CSN = 0; // Spi enable for write a spi command
<BR> SpiReadWrite(RC); // Read config command
<BR> for (i = 10; i < 20; i ++) rxaddr[i] = SpiReadWrite(0xff);
<BR> CSN = 1; // Disable Spi
<BR> TRX_CE = !TX_EN;// <BR>}
<BR><BR>void WritenRFConfig(unsigned char rxaddr[]) using 0//配置nRF905
<BR>{ <BR> TRX_CE = 0;//设置nRF905为待机方式
<BR> _nop_();
<BR> CSN = 0; // Spi enable for write a spi command
<BR> SpiReadWrite(WC); // Write config command
<BR> SpiReadWrite(rxaddr[8]); //中心频率低8位
<BR> SpiReadWrite(PA_PWR_10dBm | HFREQ_PLL_433MHz); //发射+10dBm,发射频率433MHz,中心频率第9位=0
<BR> SpiReadWrite(TX_AFW_4BYTE | RX_AFW_4BYTE); //接收地址宽度4字节,发送地址宽度4字节
<BR> SpiReadWrite(RX_PW_32BYTE); //接收数据宽度32字节
<BR> SpiReadWrite(TX_PW_32BYTE); //发送数据宽度32字节
<BR> SpiReadWrite(rxaddr[0]); //接收有效地址第1字节
<BR> SpiReadWrite(rxaddr[1]); //接收有效地址第2字节
<BR> SpiReadWrite(rxaddr[2]); //接收有效地址第3字节
<BR> SpiReadWrite(rxaddr[3]); //接收有效地址第4字节
<BR> SpiReadWrite(CRC16_EN | XOF_16MHz); //CRC16模式使能,晶体振荡器频率16MHz
<BR> CSN = 1; // Disable Spi
<BR> TRX_CE = !TX_EN;// <BR>}
<BR><BR>unsigned char VerifynRFConfig(void) using 0//校验配置nRF905
<BR>{ <BR>unsigned char error = 0;
<BR> TRX_CE = 0;//设置nRF905为待机方式
<BR> _nop_();
<BR> CSN = 0; // Spi enable for write a spi command
<BR> SpiReadWrite(RC); // Read config command
<BR> SpiReadWrite(0xff); //中心频率低8位
<BR> if (SpiReadWrite(0xff) != (PA_PWR_10dBm | HFREQ_PLL_433MHz)) error ++; //发射+10dBm,发射频率433MHz,中心频率第9位=0
<BR> if (SpiReadWrite(0xff) != (TX_AFW_4BYTE | RX_AFW_4BYTE)) error ++; //接收地址宽度4字节,发送地址宽度4字节
<BR> if (SpiReadWrite(0xff) != (RX_PW_32BYTE)) error ++; //接收数据宽度32字节
<BR> if (SpiReadWrite(0xff) != (TX_PW_32BYTE)) error ++; //发送数据宽度32字节
<BR> SpiReadWrite(0xff); //接收有效地址第1字节
<BR> SpiReadWrite(0xff); //接收有效地址第2字节
<BR> SpiReadWrite(0xff); //接收有效地址第3字节
<BR> SpiReadWrite(0xff); //接收有效地址第4字节
<BR> if (SpiReadWrite(0xff) != (CRC16_EN | XOF_16MHz)) error ++; //CRC16模式使能,晶体振荡器频率16MHz
<BR> CSN = 1; // Disable Spi
<BR> TRX_CE = !TX_EN;//
<BR> return error; <BR>}
<BR><BR>/*******************************************************************************************/
<BR>//function SetTxMode();
<BR>/*******************************************************************************************/
<BR>void SetTxMode(void) using 0
<BR>{ <BR> _nop_(); <BR> _nop_();
<BR> _nop_(); <BR> TX_EN=1; <BR> _nop_();
<BR> TRX_CE=0; <BR> _nop_();
<BR> _nop_(); <BR> _nop_();
<BR>}
<BR>/*******************************************************************************************/
<BR>//function SetRxMode();
<BR>/*******************************************************************************************/
<BR>void SetRxMode(void) using 0 <BR>{
<BR> _nop_(); <BR> _nop_(); <BR> _nop_();
<BR> TX_EN=0; <BR> _nop_();
<BR> TRX_CE=1; <BR>//650uS <BR> _nop_();
<BR> _nop_(); <BR> _nop_(); <BR>}
<BR><BR>void SystemIoInit(void) using 0 <BR>{
<BR> IE = 0x00;//关闭中断
<BR> P2 = 0x9d;//P2口初始化
<BR> P0 = 0xff;//P0口初始化
<BR> P1 = 0xff;//P1口初始化
<BR> P3 = 0xff;//P3口初始化
<BR>// nRFPowerUP(); <BR>}
<BR><BR>void UserSetup(void) using 0//用户运行环境设置 <BR>{
<BR> KeyInit();//键盘初始化 <BR> nRFInit();//无线模块初始化
<BR> SystemBuffers.TimeCount = 0; <BR>}
<BR><BR>void ClrWdt(void) using 0//喂狗 <BR>{
<BR> WDTRST = 0x1e;//89s52内狗
<BR> WDTRST = 0xe1;//89s52内狗 <BR>} <BR><BR>
<BR><BR>/*------------------------------------
<BR> 定时器T0中断服务程序
<BR>------------------------------------*/
<BR>void t0proc() interrupt TF0_VECTOR using 1
<BR>{ <BR>} <BR><BR>/*------------------------------------
<BR> 定时器T1中断服务程序
<BR>------------------------------------*/
<BR>void t1proc() interrupt TF1_VECTOR using 1
<BR>{ <BR>} <BR><BR>/*------------------------------------
<BR> 定时器T2中断服务程序(5mS)
<BR>------------------------------------*/
<BR>void t2proc() interrupt TF2_VECTOR using 0
<BR>{ <BR>unsigned char key;
<BR>code unsigned char KeyPosTab[] = {0x01, 0x02, 0x04, 0x08};
<BR> TF2 = 0;
<BR> if (PCON & GF0_) {//中断是从主循环内跳入的才能喂狗
<BR> ClrWdt();//清除看门狗计数器
<BR> PCON &= ~GF0_;//清除标志
<BR> } <BR> key = ~P0;//接收键盘数据每次可取多键)
<BR> if (key & KeyPosTab[SystemBuffers.TimeCount & 0x03]) {//有键压下(每次只取1键以实现“零耗时消除键盘抖动”)
<BR> SystemBuffers.KeyCount[SystemBuffers.TimeCount & 0x03] ++;//压键计数
<BR> if (SystemBuffers.KeyCount[SystemBuffers.TimeCount & 0x03] == 2) {//短压键
<BR> SystemBuffers.WaitTime = 0;
<BR> KeyCommandExec(0, SystemBuffers.TimeCount & 0x03);//单击键Key00()~Key03()
<BR> }
<BR> else if (SystemBuffers.KeyCount[SystemBuffers.TimeCount & 0x03] >= SysPushKeyTime) {//长压键150 * 20mS = 3。0S
<BR> SystemBuffers.WaitTime = 0;
<BR> KeyCommandExec(2, SystemBuffers.TimeCount & 0x03);//长压键Key20()~Key23()
<BR> SystemBuffers.KeyCount[SystemBuffers.TimeCount & 0x03] = 3;//清除长压键计数器(躲过单击键)
<BR> } <BR> }
<BR> else {//无键压下(包括放键)
<BR> if (SystemBuffers.KeyCount[SystemBuffers.TimeCount & 0x03] >= 2) {//放键事件
<BR> SystemBuffers.WaitTime = 0;
<BR> KeyCommandExec(1, SystemBuffers.TimeCount & 0x03);//键释放Key10()~Key13()
<BR> } <BR> else {
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -