温度发送与接收.docx
- 文档编号:10029781
- 上传时间:2023-05-23
- 格式:DOCX
- 页数:40
- 大小:24.31KB
温度发送与接收.docx
《温度发送与接收.docx》由会员分享,可在线阅读,更多相关《温度发送与接收.docx(40页珍藏版)》请在冰点文库上搜索。
温度发送与接收
/*******************************************************
**温度无线发送程序
**时间:
2012.2.3
**——byKeliwen
*******************************************************/
#include
#include
#include
#include
typedefunsignedcharuchar;
typedefunsignedintuint;
/***************************************************/
#defineTX_ADR_WIDTH5//5字节宽度的发送/接收地址
#defineTX_PLOAD_WIDTH4//数据通道有效数据宽度
ucharcodeTX_ADDRESS[TX_ADR_WIDTH]={0x34,0x43,0x10,0x10,0x01};//定义一个
静态发送地址
ucharRX_BUF[TX_PLOAD_WIDTH];
ucharTX_BUF[TX_PLOAD_WIDTH];
sbitCSN=P1^0;//ChipEnablepinsignal(output)
sbitMOSI=P1^1;//SlaveSelectpin,(outputtoCSN,nRF24L01)
sbitIRQ=P1^2;//Interruptsignal,fromnRF24L01(input)
sbitMISO=P1^3;//MasterIn,SlaveOutpin(input)
sbitSCLK=P1^4;//SerialClockpin,(output)
sbitCE=P1^5;//MasterOut,SlaveInpin(output)
//SPI(nRF24L01)commands
#defineREAD_REG0x00//Definereadcommandtoregister
#defineWRITE_REG0x20//Definewritecommandtoregister
#defineRD_RX_PLOAD0x61//DefineRXpayloadregisteraddress
#defineWR_TX_PLOAD0xA0//DefineTXpayloadregisteraddress
#defineFLUSH_TX0xE1//DefineflushTXregistercommand
#defineFLUSH_RX0xE2//DefineflushRXregistercommand
#defineREUSE_TX_PL0xE3//DefinereuseTXpayloadregistercommand
#defineNOP0xFF//DefineNoOperation,mightbeusedtoreadstatusregister
//SPI(nRF24L01)registers(addresses)
#defineCONFIG0x00//'Config'registeraddress
#defineEN_AA0x01//'EnableAutoAcknowledgment'registeraddress
#defineEN_RXADDR0x02//'EnabledRXaddresses'registeraddress
#defineSETUP_AW0x03//'Setupaddresswidth'registeraddress
#defineSETUP_RETR0x04//'SetupAuto.Retrans'registeraddress
#defineRF_CH0x05//'RFchannel'registeraddress
#defineRF_SETUP0x06//'RFsetup'registeraddress
#defineSTATUS0x07//'Status'registeraddress
#defineOBSERVE_TX0x08//'ObserveTX'registeraddress
#defineCD0x09//'CarrierDetect'registeraddress
#defineRX_ADDR_P00x0A//'RXaddresspipe0'registeraddress
#defineRX_ADDR_P10x0B//'RXaddresspipe1'registeraddress
#defineRX_ADDR_P20x0C//'RXaddresspipe2'registeraddress
#defineRX_ADDR_P30x0D//'RXaddresspipe3'registeraddress
#defineRX_ADDR_P40x0E//'RXaddresspipe4'registeraddress
#defineRX_ADDR_P50x0F//'RXaddresspipe5'registeraddress
#defineTX_ADDR0x10//'TXaddress'registeraddress
#defineRX_PW_P00x11//'RXpayloadwidth,pipe0'registeraddress
#defineRX_PW_P10x12//'RXpayloadwidth,pipe1'registeraddress
#defineRX_PW_P20x13//'RXpayloadwidth,pipe2'registeraddress
#defineRX_PW_P30x14//'RXpayloadwidth,pipe3'registeraddress
#defineRX_PW_P40x15//'RXpayloadwidth,pipe4'registeraddress
#defineRX_PW_P50x16//'RXpayloadwidth,pipe5'registeraddress
#defineFIFO_STATUS0x17//'FIFOStatusRegister'registeraddress
ucharbdataSta;
ucharcodeDis[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//共阳数码管花数。
bitflag=0;
sbitDQ=P3^0;
voidDelay(uintt)
{
while(t--)
{}
}
/*初始化IO*/
voidInit_IO(void)
{
CE=0;//待机
CSN=1;//SPI标止
SCLK=0;//SPI时钟置低
IRQ=1;//中断复位
}
/*根据SPI协议,写一字节数据到nRF24L01,同时从nRF24L01读出一字节*/
ucharSPI_Write_Read(ucharByte)
{
uchari;
for(i=0;i<8;i++)//循环8次
{
MOSI=(Byte&0x80);//byte最高位输出到MOSI
Byte<<=1;//低一位移位到最高位
SCLK=1;//拉高SCK,nRF24L01从MOSI读入1位数据,同时从
MISO输出1位数据
Byte|=MISO;//读MISO到byte最低位
SCLK=0;//SCK置低
}
returnByte;//返回读出的一字节
}
/*写数据value到reg寄存器*/
ucharSPI_Write_Read_Register(ucharReg,ucharvalue)
{
ucharStatus;
CSN=0;//CSN置低,开始传输数据
Status=SPI_Write_Read(Reg);//选择寄存器,同时返回状态字
SPI_Write_Read(value);//然后写数据到该寄存器
CSN=1;//CSN拉高,结束数据传输
returnStatus;//返回状态寄存器
}
/*从reg寄存器读一字节*/
/*ucharSPI_Read(ucharReg)
{
ucharresult;
CSN=0;//CSN置低,开始传输数据
SPI_Write_Read(Reg);//选择寄存器
result=SPI_Write_Read(0);//然后从该寄存器读数据
CSN=1;//CSN拉高,结束数据传输
returnresult;//返回寄存器数据
}*/
/*从reg寄存器读出bytes个字节,通常用来读取接收通道数据或接收/发送地址*/
/*ucharSPI_Read_Buffer(ucharReg,uchar*Buf,ucharBytes)
{
ucharStatus,i;
CSN=0;//CSN置低,开始传输数据
Status=SPI_Write_Read(Reg);//选择寄存器,同时返回状态字
for(i=0;i { Buf[i]=SPI_Write_Read(0);//逐个字节从nRF24L01读出 } CSN=1;//CSN拉高,结束数据传输 returnStatus;//返回状态寄存器 }*/ /*把pBuf缓存中的数据写入到nRF24L01,通常用来写入发射通道数据或接收/发送地址*/ ucharSPI_Write_Buffer(ucharReg,uchar*Buf,ucharBytes) { ucharStatus,i; CSN=0;//CSN置低,开始传输数据 Status=SPI_Write_Read(Reg);//选择寄存器,同时返回状态字 for(i=0;i { SPI_Write_Read(Buf[i]);//逐个字节写入nRF24L01 } CSN=1;//CSN拉高,结束数据传输 returnStatus;//返回状态寄存器 } /*设置nRF24L01为接收模式,等待接收发送设备的数据包*/ /*voidRX_Mode(void) { CE=0; SPI_Write_Buffer(WRITE_REG+RX_ADDR_P0,TX_ADDRESS,TX_ADR_WIDTH);// 接收设备接收通道0使用和发送设备相同的发送地址 SPI_Write_Read_Register(WRITE_REG+EN_AA,0x01);//使能接 收通道0自动应答 SPI_Write_Read_Register(WRITE_REG+EN_RXADDR,0x01);//使能 接收通道0 SPI_Write_Read_Register(WRITE_REG+RF_CH,0x00);//选 择射频通道0x00 SPI_Write_Read_Register(WRITE_REG+RX_PW_P0,TX_PLOAD_WIDTH);//接 收通道0选择和发送通道相同有效数据宽度 SPI_Write_Read_Register(WRITE_REG+RF_SETUP,0x07);//数据传 输率1Mbps,发射功率0dBm,低噪声放大器增益 SPI_Write_Read_Register(WRITE_REG+CONFIG,0x0f);//CRC使 能,16位CRC校验,上电,接收模式 CE=1;//拉高 CE启动接收设备 }*/ /*设置nRF24L01为发送模式,(CE=1持续至少10us),130us后启动发射,数据发送结束后, 发送模块自动转入接收模式等待应答信号*/ voidTX_Mode(void) { CE=0; SPI_Write_Buffer(WRITE_REG+TX_ADDR,TX_ADDRESS,TX_ADR_WIDTH);// 写入发送地址 SPI_Write_Buffer(WRITE_REG+RX_ADDR_P0,TX_ADDRESS,TX_ADR_WIDTH);// 为了应答接收设备,接收通道0地址和发送地址相同 //SPI_Write_Buffer(WR_TX_PLOAD,Buffer,TX_PLOAD_WIDTH);//写 数据包到TXFIFO SPI_Write_Read_Register(WRITE_REG+EN_AA,0x01);//使能 接收通道0自动应答 SPI_Write_Read_Register(WRITE_REG+EN_RXADDR,0x01);//使能 接收通道0 SPI_Write_Read_Register(WRITE_REG+SETUP_RETR,0x0a);//自动 重发延时等待250us+86us,自动重发10次 SPI_Write_Read_Register(WRITE_REG+RF_CH,0x00);//选 择射频通道0x00 SPI_Write_Read_Register(WRITE_REG+RF_SETUP,0x07);//数据传 输率1Mbps,发射功率0dBm,低噪声放大器增益 SPI_Write_Read_Register(WRITE_REG+CONFIG,0x0e);//CRC使 能,16位CRC校验,上电 CE=1; } /*检查接收设备有无接收到数据包,设定没有收到应答信号是否重发*/ ucharCheck_Ack(bitClear) { while(IRQ); Sta=SPI_Write_Read(NOP);//返回状态寄存器 if(Sta^4) { if(Clear)//是否清除TXFIFO,没有清除在复位MAX_RT中断标 志后重发 SPI_Write_Read(FLUSH_TX); } SPI_Write_Read_Register(WRITE_REG+STATUS,Sta);//清除TX_DS或MAX_RT中 断标志 IRQ=1; if(Sta^5) return0x00; else return0xff; } /************************************************************* **温度传感器DS18B20程序部分 *************************************************************/ voidDS18B20_Reset(void) { ucharN; DQ=1; Delay(4); DQ=0; Delay(160); DQ=1; Delay(4); N=DQ; Delay(160); DQ=1; } voidDS18B20_Write_Byte(ucharDat) { uchari; for(i=0;i<8;i++) { DQ=0; _nop_(); DQ=Dat&0x01; Delay(8); DQ=1; Dat>>=1; } Delay(7); } ucharDS18B20_Read_Byte(void) { uchari,Value; for(i=0;i<8;i++) { DQ=0; _nop_(); _nop_(); Value>>=1; DQ=1; _nop_(); _nop_(); _nop_(); _nop_(); if(DQ) Value|=0x80; Delay(10); } returnValue; } uintRead_Temperature(void) { uchari,j; uintTemper; DS18B20_Reset(); DS18B20_Write_Byte(0xcc); DS18B20_Write_Byte(0x44); Delay(600); DS18B20_Reset(); DS18B20_Write_Byte(0xcc); DS18B20_Write_Byte(0xbe); i=DS18B20_Read_Byte();//LSB j=DS18B20_Read_Byte();//MSB Temper=j*256+i; Temper*=6.25; returnTemper; } voidDis_Temperature(uintTemper) { ucharSt[4]; St[0]=Temper/1000; St[1]=Temper%1000/100; St[2]=Temper%100/10; St[3]=Temper%10; P0=Dis[St[0]]; P2=0xf7; Delay(330); P0=Dis[St[1]]; P2=0xfb; Delay(330); P0=Dis[St[2]]; P2=0xfd; Delay(330); //P0=Dis[St[3]]; //P2=0xfe; //Delay(330); P0=0x00; P2=0xff; } voidnRF24L01_TxPacket(uchar*Buffer) { CE=0;//StandByI模式 SPI_Write_Buffer(WRITE_REG+RX_ADDR_P0,TX_ADDRESS,TX_ADR_WIDTH);// 装载接收端地址 SPI_Write_Buffer(WR_TX_PLOAD,Buffer,TX_PLOAD_WIDTH);//装载数据 //SPI_RW_Reg(WRITE_REG+CONFIG,0x0e);//IRQ收发完成中断响应,16 位CRC,主发送 CE=1;//置高CE,激发数据发送 } /*主函数*/ voidmain(void) { uintTEMP; ucharTimes; Init_IO(); TX_Mode(); do { if((Times++)>250) { Times=0; TEMP=Read_Temperature(); TX_BUF[0]=TEMP/10; nRF24L01_TxPacket(TX_BUF); Check_Ack (1); } Dis_Temperature(TEMP); } while (1); } /******************************************************* **温度无线接收程序 **时间: 2012.2.3 **——byKeliwen *******************************************************/ #include #include #include #include typedefunsignedcharuchar; typedefunsignedintuint; /***************************************************/ #defineTX_ADR_WIDTH5//5字节宽度的发送/接收地址 #defineTX_PLOAD_WIDTH4//数据通道有效数据宽度 ucharcodeTX_ADDRESS[TX_ADR_WIDTH]={0x34,0x43,0x10,0x10,0x01};//定义一个 静态发送地址 ucharRX_BUF[TX_PLOAD_WIDTH]; ucharTX_BUF[TX_PLOAD_WIDTH]; sbitCSN=P1^0;//ChipEnablepinsignal(output) sbitMOSI=P1^1;//SlaveSelectpin,(outputtoCSN,nRF24L01) sbitIRQ=P1^2;//Interruptsignal,fromnRF24L01(input) sbitMISO=P1^3;//MasterIn,SlaveOutpin(input) sbitSCLK=P1^4;//SerialClockpin,(output) sbitCE=P1^5;//MasterOut,SlaveInpin(output) //SPI(nRF24L01)commands #defineREAD_REG0x00//Definereadcommandtoregister #defineWRITE_REG0x20//Definewritecommandtoregister #defineRD_RX_PLOAD0x61//DefineRXpayloadregisteraddress #defineWR_TX_PLOAD0xA0//DefineTXpayloadregisteraddress #defineFLUSH_TX0xE1//DefineflushTXregistercommand #defineFLUSH_RX0xE2//DefineflushRXregistercommand #defineREUSE_TX_PL0xE3//DefinereuseTXpayloadregistercommand #defineNOP0xFF//DefineNoOperation,mightbeusedtoreadstatusregister //SPI(nRF24L01)registers(addresses) #defineCONFIG0x00//'Config'registeraddress #defineEN_AA0x01//'EnableAuto
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 温度 发送 接收
![提示](https://static.bingdoc.com/images/bang_tan.gif)