关于无线温度计单片机部分代码解析.docx
- 文档编号:29967494
- 上传时间:2023-08-03
- 格式:DOCX
- 页数:44
- 大小:23.97KB
关于无线温度计单片机部分代码解析.docx
《关于无线温度计单片机部分代码解析.docx》由会员分享,可在线阅读,更多相关《关于无线温度计单片机部分代码解析.docx(44页珍藏版)》请在冰豆网上搜索。
关于无线温度计单片机部分代码解析
#include
#include
#defineucharunsignedchar
#defineuintunsignedint
sbitRS=P2^3;//片选信号
sbitRW=P2^4;//数据信号
sbitEN=P2^5;//时钟信号
sbitDQ=P2^6;//连接DS18B20
uchartplsb,tpmsb;//温湿度值低位、高位字节
uinttemp;
ucharcodenum[]={"0123456789"};
ucharcodedis1[]="温湿度A:
";
ucharcodedis2[]="温湿度B:
";
//----------------------------------------------------------------------------------------------------------------
#defineBYTE_BIT00x01
#defineBYTE_BIT70x80
//----------------------------------------------------------------------------------------------------------------
bdataunsignedcharDATA_BUF;
#defineDATA7((DATA_BUF&BYTE_BIT7)!
=0)
#defineDATA0((DATA_BUF&BYTE_BIT0)!
=0)
sbitflag=DATA_BUF^7;
sbitflag1=DATA_BUF^0;
//---------------------------------------------------发送数据缓冲区-------------------------------------------------
//#defineTxRxBuf_Len4
//unsignedcharTxRxBuf[TxRxBuf_Len]={0x29,0x30,0x31,0x32,};
codeTxAddress[4]={0xcc,0xcc,0xcc,0xcc};
charK2;
ucharTxRxBuf[4]={0x29,0x30,0x31,0x32,};
//----------------------------------------NRF24L01工作模式控制端口------------------------------------------------------
sbitTXEN=P1^0;
sbitTRX_CE=P3^5;
sbitPWR=P1^1;
//----------------------------------------LED显示端口---------------------------------------------------
//sbitLED=P3^5;
//----------------------------------------NRF24L01数据交换端口---------------------------------------------------
sbitMISO=P1^6;
sbitMOSI=P1^5;
sbitSCK=P1^7;
sbitCSN=P1^3;
//----------------------------------------NRF24L01状态端口---------------------------------------------------------
sbitAM=P1^4;
sbitDR=P3^6;
sbitCD=P1^2;
//---------------------------------------------------------------------------------------------------------------
//----------------------------------------按键端口-------------------------------------------------------
sbitKEY2=P3^2;
sbitKEY3=P2^1;
//----------------------------------------NRF24L01控制指令-------------------------------------------
#defineWC0x00
#defineRC0x10
#defineWTP0x20
#defineRTP0x21
#defineWTA0x22
#defineRTA0x23
#defineRRP0x24
//------------------------------------------------NRF24L01寄存器配置------------------------------------------------
unsignedcharidataRFConf[11]=
{
0x00,//配置命令//
0x4c,//CH_NO,配置频段在430MHZ
0x0c,//输出功率为10db,不重发,节电为正常模式
0x44,//地址宽度设置,为4字节
0x04,0x04,//接收发送有效数据长度为4字节
0xCC,0xCC,0xCC,0xCC,//接收地址
0x58,//CRC充许,8位CRC校验,外部时钟信号不使能,16M晶振
};
//================================================延时===========================================================
voidNRF24L01_Delay(intn)
{
uinti;
while(n--)
for(i=0;i<80;i++);
}
//=================================================SPI读函数=======================================================
unsignedcharSpiRead(void)
{
unsignedcharj;
for(j=0;j<8;j++)
{
DATA_BUF=DATA_BUF<<1;
SCK=1;
if(MISO)//读取最高位,保存至最末尾,通过左移位完成整个字节
{
DATA_BUF|=BYTE_BIT0;
}
else
{
DATA_BUF&=~BYTE_BIT0;
}
SCK=0;
}
returnDATA_BUF;
}
//===========================================SPI写函数===============================================================
voidSpiWrite(unsignedcharsend)
{
unsignedchari;
DATA_BUF=send;
for(i=0;i<8;i++)
{
if(DATA7)//总是发送最高位
{
MOSI=1;
}
else
{
MOSI=0;
}
SCK=1;
DATA_BUF=DATA_BUF<<1;
SCK=0;
}
}
//------------------------------------------------------初始化NRF24L01---------------------------------------------
voidNRF24L01Init(void)
{
CSN=1;//Spidisable
SCK=0;//Spiclocklineinitlow
DR=1;//InitDRforinput
AM=1;//InitAMforinput
CD=1;//InitCDforinput
PWR=1;//NRF24L01poweron
TRX_CE=0;//SetNRF24L01instandbymode
TXEN=0;//setradioinRxmode
}
//-----------------------------------------------------初始化寄存器-----------------------------------------------
voidConfig905(void)
{
uchari;
CSN=0;//Spienableforwriteaspicommand
//SpiWrite(WC);//Writeconfigcommand写放配置命令
for(i=0;i<11;i++)//Writeconfigrationwords写放配置字
{
SpiWrite(RFConf[i]);
}
CSN=1;//DisableSpi
}
//-----------------------------------------------------发送数据打包---------------------------------------------------
voidTxPacket(uchar*TxRxBuf)
{
uchari;
//Config905();
CSN=0;
SpiWrite(WTP);//Writepayloadcommand
for(i=0;i<4;i++)
{
SpiWrite(TxRxBuf[i]);//Write32bytesTxdata
}
CSN=1;
NRF24L01_Delay
(1);//Spidisable
CSN=0;//Spienableforwriteaspicommand
SpiWrite(WTA);//Writeaddresscommand
for(i=0;i<4;i++)//写入与对方地址一样的地址
{
SpiWrite(TxAddress[i]);
}
CSN=1;//Spidisable
TRX_CE=1;//SetTRX_CEhigh,startTxdatatransmission
NRF24L01_Delay
(1);//while(DR!
=1);
TRX_CE=0;//SetTRX_CElow
}
//----------------------------------------------设置发送初始状态---------------------------------------------
voidSetTxMode(void)
{
TRX_CE=0;
TXEN=1;
NRF24L01_Delay
(1);//NRF24L01_Delayformodechange(>=650us)
}
//-----------------------------------------------设置接收初始化---------------------------------------------------
voidSetRxMode(void)
{
TXEN=0;
TRX_CE=1;
NRF24L01_Delay
(1);//NRF24L01_Delayformodechange(>=650us)
}
//-------------------------------------------------判断数据接收状态-----------------------------------------------------
unsignedcharCheckDR(void)//检查是否有新数据传入DataReady
{
DR=1;
//通过对端口写1,可以使端口为输入状态,这51的特性。
不熟悉者可以参阅51相关书籍作证(将DR端口设置为输入状态。
)
if(DR==1)
{
DR=0;
return1;
}
else
{
return0;
}
}
//----------------------------------------------------读NRF24L01接收数据------------------------------------------------------------
voidRxPacket(void)
{
uchari;
NRF24L01_Delay
(1);
//TRX_CE=0;//SetNRF24L01instandbymode
NRF24L01_Delay(100);
TRX_CE=0;
CSN=0;//Spienableforwriteaspicommand
NRF24L01_Delay
(1);
SpiWrite(RRP);
for(i=0;i<4;i++)
{
TxRxBuf[i]=SpiRead();//Readdataandsavetobuffer
}
CSN=1;
NRF24L01_Delay(10);
TRX_CE=1;
}
//--------------------------------------------------------数据接收------------------------------------------------
voidRX(void)
{
SetRxMode();
//while(CheckDR()==0);为了实现双向通信,就不能一直处于接收等待状态,所以注释掉
NRF24L01_Delay(10);
RxPacket();
}
/********************************************************************
*名称:
delay()
*功能:
延时,延时时间为100us*t。
这是通过软件延时,有一定误差。
*输入:
t
*输出:
无
***********************************************************************/
voiddelay(unsignedintt)
{
unsignedinti,j;
for(i=0;i for(j=0;j<10;j++); } /******************************************************************** *名称: sendbyte() *功能: 按照液晶的串口通信协议,发送数据 *输入: zdata *输出: 无 ***********************************************************************/ voidsendbyte(unsignedcharzdata) { unsignedinti; for(i=0;i<8;i++) { if((zdata< { RW=1; } else { RW=0; } EN=0; EN=1; } } /******************************************************************** *名称: write_com() *功能: 写串口指令 *输入: cmdcode *输出: 无 ***********************************************************************/ voidwrite_com(unsignedcharcmdcode) { RS=1; sendbyte(0xf8); sendbyte(cmdcode&0xf0); sendbyte((cmdcode<<4)&0xf0); delay (2); } /******************************************************************** *名称: write_data() *功能: 写串口数据 *输入: cmdcode *输出: 无 ***********************************************************************/ voidwrite_data(unsignedcharDispdata) { RS=1; sendbyte(0xfa); sendbyte(Dispdata&0xf0); sendbyte((Dispdata<<4)&0xf0); delay (2); } /******************************************************************** *名称: 显示字符串组 ***********************************************************************/ voidhzkdis(unsignedcharcode*s) { while(*s>0) { write_data(*s); s++; delay(50); } } /******************************************************************** *名称: 显示位置 ***********************************************************************/ voidlcd_pos(ucharX,ucharY){ ucharpos; if(X==0){ X=0x80; } elseif(X==1){ X=0x90; } elseif(X==2){ X=0x88; } elseif(X==3){ X=0x98; } pos=X+Y; write_com(pos); } /******************************************************************** *名称: 清屏 ***********************************************************************/ voidclear_show() { uchari,j; lcd_pos(0,0); for(i=0;i<6;i++){ for(j=0;j<16;j++){ write_data(''); } } } /******************************************************************** *名称: lcdinit() *功能: 初始化函数 *输入: cmdcode *输出: 无 ***********************************************************************/ voidlcdinit() { delay(200); write_com(0x30); delay(50); write_com(0x0c); delay(50); } /*********************************************************/ /**/ /*温湿度*/ /**/ /*********************************************************/ /*******************产生复位脉冲初始化DS18B20**************/ voidreset(void) { uinti; DQ=0; i=100; while(i--); DQ=1;//产生上升沿 i=4; while(i--); } /*********************等待应答脉冲*********************/ voidwait(void) { uinti; while(DQ); while(~DQ);//检测到应答脉冲 i=4; while(i--); } bitreadbit(void) { uinti; bitb; DQ=0; i++; DQ=1; i++;i++;//延时15us以上,读时隙下降沿后15us,DS18B20输出数据才有效 b=DQ; i=10; while(i--); return(b); } /*******************读取数据的一个字节**************************/ ucharreadbyte(void) { uchari,j,b; b=0; for(i=0;i<8;i++) { j=readbit(); b=(j<<7)|(b>>1); } return(b); } /************
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 关于 无线 温度计 单片机 部分 代码 解析