利用SI4432无线收发模块和51单片机进行无线收发测试实验程序代码.docx
- 文档编号:14640578
- 上传时间:2023-06-25
- 格式:DOCX
- 页数:27
- 大小:20.31KB
利用SI4432无线收发模块和51单片机进行无线收发测试实验程序代码.docx
《利用SI4432无线收发模块和51单片机进行无线收发测试实验程序代码.docx》由会员分享,可在线阅读,更多相关《利用SI4432无线收发模块和51单片机进行无线收发测试实验程序代码.docx(27页珍藏版)》请在冰点文库上搜索。
利用SI4432无线收发模块和51单片机进行无线收发测试实验程序代码
利用SI4432无线收发模块和51单片机进行无线收发测试实验程序代码
(1、发射模块代码)
#include
#defineuintunsignedint
#defineucharunsignedchar
ucharjiewan;//无线接收端数据接收存储完毕的标志变量
ucharwx_rx_cishu;//无线接收端接收数据的次数的标志变量
sbitkey=P1^6;
/************************************************************************************/
//
/************************************************************************************/
sbitSDO=P1^0;//数据输出端口
sbitSDI=P1^1;//数据输入端口
sbitSCLK=P1^2;//数据时钟线
sbitNSEL=P1^3;//片选端口
sbitIRQ=P1^4;//中断信号端口
sbitSDN=P1^5;//内部电源开关端口
unsignedcharITSTATUS;
//存放接收到的无线数据的缓冲数组
ucharxdatajieshou_huanchong[255];
/************************************************************************************/
//延时函数
/************************************************************************************/
voiddelay_ms(uintt)
{
uintx,y;
for(x=0;x for(y=0;y<10;y++); } /************************************************************************************/ //延时函数 /************************************************************************************/ voiddelay_ms2(uintt) { uintx,y; for(x=0;x for(y=0;y<10;y++); } /************************************************************************************/ //SPI初始化函数 /************************************************************************************/ voidspi_init() { NSEL=1; SCLK=0; } /************************************************************************************/ //单个字节的写入函数 /************************************************************************************/ voidspi_write_byte(ucharshuju) { uchari; for(i=0;i<8;i++) { if(shuju&0x80)//先发送最高位 { SDI=1; } else { SDI=0; } SCLK=1; shuju=shuju<<1; delay_ms (2); SCLK=0; } } /************************************************************************************/ //单个字节的读取函数 /************************************************************************************/ ucharspi_read_byte() { ucharrxvalue,i; rxvalue=0x00; for(i=0;i<8;i++) { rxvalue=rxvalue<<1; SCLK=1; SDO=1; if(SDO==1) { rxvalue=rxvalue|0x01; } else { rxvalue=rxvalue&0xfe; } delay_ms (2);//经调试,这里必须要延时 SCLK=0; delay_ms (2);//经调试,这里必须要延时 } returnrxvalue; } /************************************************************************************/ //往某个寄存器写入数据的函数 /************************************************************************************/ voidwrite4432_add_byte(ucharadd,ucharshuju) { NSEL=0; spi_write_byte(add|0x80); spi_write_byte(shuju); NSEL=1; } /************************************************************************************/ //从某个寄存器读取数据的函数 /************************************************************************************/ ucharread4432_add_byte(ucharadd) { ucharvalue; NSEL=0; spi_write_byte(add|0x00); value=spi_read_byte(); NSEL=1; returnvalue; } /************************************************************************************/ //设置接收模式函数 /************************************************************************************/ voidset_rx_mode() { write4432_add_byte(0x0e,0x02);//设置接收使能 write4432_add_byte(0x05,0xff);//使能接收包中断 write4432_add_byte(0x06,0x00); read4432_add_byte(0x03);//清中断 read4432_add_byte(0x04);//清中断 write4432_add_byte(0x07,0x05);//人工接收模式,打开晶振 } /************************************************************************************/ //4432数据包接收标志函数 /************************************************************************************/ bitRX_shujubao() { IRQ=1; if(! IRQ) { ITSTATUS=read4432_add_byte(0x03); //0x03寄存器中的值为0x02的话,表示已经接收一个有效数据包 if((ITSTATUS&0x02)==0x02) { return1; } else { return0; } } else { return0; } } /************************************************************************************/ //4432发射单个数据的发送函数 /************************************************************************************/ voidTX_WX_DS(ucharjiqima,ucharztma) { write4432_add_byte(0x0e,0x01);//发射使能 write4432_add_byte(0x3e,3);//设置发送数据包长度 //要发射出去的数据 write4432_add_byte(0x7f,0xfa);//识别码 write4432_add_byte(0x7f,jiqima);//机器码 write4432_add_byte(0x7f,ztma);//状态码 write4432_add_byte(0x05,0x04);//使能包发送中断 write4432_add_byte(0x06,0x00); read4432_add_byte(0x03);//清中断 read4432_add_byte(0x04);//清中断 write4432_add_byte(0x07,0x09);//人工发射模式,打开晶振 while (1)//等待发送完成,产生中断。 { IRQ=1; if(! IRQ) { ITSTATUS=read4432_add_byte(0x03); //0x03寄存器中的值为0x04的话,表示已经发射一个有效数据包 if((ITSTATUS&0x04)==0x04) { break; }//已经发射一个有效包第2位为1,如果为0则等待 } } read4432_add_byte(0x03);//清中断 read4432_add_byte(0x04);//清中断 } /************************************************************************************/ //射频芯片SI4432初始化的函数 /************************************************************************************/ voidinit_4432() { IRQ=1; SDO=1;//讲SPI数据设置为输出 SDN=0;//允许该芯片电源工作 delay_ms(60);delay_ms(60); //读0x03和0x04中断状态寄存器,当读这个地址时,中断标志位将被自动清除。 read4432_add_byte(0x03); read4432_add_byte(0x04); //软件复位所有的内部寄存器。 //0x07寄存器,可设置成挂机,待机,关闭,发射,接收模式 write4432_add_byte(0x07,0x80);//寄存器0x07工作模式和功能控制1。 delay_ms(50); //等待power_on_reset(POR)中断,连续两次0x03,0x04。 while(IRQ==1);//等待软复位完成,当软复位完成后有中断发生。 //读0x03和0x04中断状态寄存器,当读这个地址时,中断标志位将被自动清除。 read4432_add_byte(0x03); read4432_add_byte(0x04); //********************************************************** write4432_add_byte(0x06|0x80,0x2d);//关闭不需要的中断 write4432_add_byte(0x07|0x80,1);//进入Ready模式 write4432_add_byte(0x09|0x80,0x7f);//负载电容=12P write4432_add_byte(0x0a|0x80,0x05);//关闭低频输出 write4432_add_byte(0x0b|0x80,0xea);//GPIO0当做普通输出口 write4432_add_byte(0x0c|0x80,0xea);//GPIO1当做普通输出口 write4432_add_byte(0x0d|0x80,0xf4);//GPIO2输出收到的数据 write4432_add_byte(0x70|0x80,0x2c);//下面的设置根据Silabs的Excel write4432_add_byte(0x1d|0x80,0x40);//使能afc //设置4.8Kbps,50kHZ,带宽102.2khz//*************************** write4432_add_byte(0x1c|0x80,0x16);//IF中频滤波器带宽寄存器 write4432_add_byte(0x20|0x80,0x83);//时钟恢复过抽样率 write4432_add_byte(0x21|0x80,0xc0);//时钟恢复偏差2 write4432_add_byte(0x22|0x80,0x13);//时钟恢复偏差1 write4432_add_byte(0x23|0x80,0xa9);//时钟恢复偏差0 write4432_add_byte(0x24|0x80,0x00);//时钟恢复定时循环增益1 write4432_add_byte(0x25|0x80,0x04);//时钟恢复定时循环增益0 write4432_add_byte(0x2a|0x80,0x14); write4432_add_byte(0x6e|0x80,0x09);//发射波特率1 write4432_add_byte(0x6f|0x80,0xd5);//发射波特率0 //设置发送频率设置 write4432_add_byte(0x30|0x80,0x8c);//未使能CRC数据校验 write4432_add_byte(0x32|0x80,0xff);//帧头设置,0x00是禁止帧头的 write4432_add_byte(0x33|0x80,0x42);//帧头控制 write4432_add_byte(0x34|0x80,16);//前导码长度 write4432_add_byte(0x35|0x80,0x20); write4432_add_byte(0x36|0x80,0x2d); write4432_add_byte(0x37|0x80,0xd4); write4432_add_byte(0x38|0x80,0x00); write4432_add_byte(0x39|0x80,0x00); write4432_add_byte(0x3a|0x80,'s'); write4432_add_byte(0x3b|0x80,'w'); write4432_add_byte(0x3c|0x80,'w'); write4432_add_byte(0x3d|0x80,'x'); write4432_add_byte(0x3e|0x80,10); write4432_add_byte(0x3f|0x80,'s'); write4432_add_byte(0x40|0x80,'w'); write4432_add_byte(0x41|0x80,'w'); write4432_add_byte(0x42|0x80,'x'); write4432_add_byte(0x43|0x80,0xff); write4432_add_byte(0x44|0x80,0xff); write4432_add_byte(0x45|0x80,0xff); write4432_add_byte(0x46|0x80,0xff); //发射功率设置 write4432_add_byte(0x6d|0x80,0x07);//设置为最大功率发射//******************* write4432_add_byte(0x71|0x80,0x22);//发射不需要CLK,FiFo,FSK模式 write4432_add_byte(0x72|0x80,0x30);//频率偏差 write4432_add_byte(0x73|0x80,0x00); write4432_add_byte(0x74|0x80,0x00); //**频率设置为400MHZ**********************************************************/ write4432_add_byte(0x75|0x80,0x70);//频段选择 write4432_add_byte(0x76|0x80,0xa2);//基准载波频率1 write4432_add_byte(0x77|0x80,0x80);//基准载波频率0 write4432_add_byte(0x79|0x80,0x00);//不需要跳频 write4432_add_byte(0x7a|0x80,0x00);//不需要跳频 } /************************************************************************************/ //主函数 /************************************************************************************/ voidmain() { ucharkk,queren; spi_init();//初始化spi init_4432();//初始化芯片4432 wx_rx_cishu=0; jiewan=0; while (1) { //如果按键被按下 if(key==0) { delay_ms2(1500); if(key==0) { P2=0x00;//将发射指示灯点亮。 TX_WX_DS(0xc0,0x90);//给无线接收机发送数据 /************************************************************/ //适当延时是为了防止按键被连续频繁按下,发射数据过快,接收端接收不及导致接收模块死机。 P2=0xff;delay_ms(3000); } while(! key); delay_ms2(1500); while(! key); } } } (2、接收模块代码) #include #defineuintunsignedint #defineucharunsignedchar ucharjiewan;//无线接收端数据接收存储完毕的标志变量 ucharwx_rx_cishu;//无线接收端接收数据的次数的标志变量 /************************************************************************************/ // /************************************************************************************/ sbitSDO=P1^0;//数据输出端口 sbitSDI=P1^1;//数据输入端口 sbitSCLK=P1^2;//数据时钟线 sbitNSEL=P1^3;//片选端口 sbitIRQ=P1^4;//中断信号端口 sbitSDN=P1^5;//内部电源开关端口 sbitzhishideng=P2^7; unsignedcharITSTATUS; //存放接收到的无线数据的缓冲数组 ucharxdatajieshou_huanchong[20]; /************************************************************************************/ //延时函数 /************************************************************************************/ voiddelay_ms(uintt) { uintx,y; for(x=0;x for(y=0;y<10;y++); } /************************************************************************************/ //SPI初始化函数 /************************************************************************************/ voidspi_init() { NSEL=1; SCLK=0; } /************************************************************************************/ //单个字节的写入函数 /**************************************************
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 利用 SI4432 无线 收发 模块 51 单片机 进行 测试 实验 程序代码