1 新定义mcu简介
RD8T36系列开发调试非常方便,具有ISP(InSystemPrograming)、ICP(InCircuitPrograming)和IAP(InApplicationPrograming)功能。允许芯片在线或带电的情况下,直接在电路板上对程序存储器进行调试及升级。RD8T36系列具有非常优异的抗干扰性能和性能极好的触控按键性能,非常适合应用于各种使用场合的触控按键和主控控制,如大小智能家电和智能家居、物联网、无线通讯、游戏机等工业控制和消费应用领域。
DHT11简介
DHT11数字温湿度传感器是一款含有已校准数字信号输出的温湿度复合传感器。它应用专用的数字模块采集技术和温湿度传感技术,确保产品具有极高的可靠性与卓越的长期稳定性。传感器包括一个电阻式感湿元件和一个NTC测温元件,并与一个高性能8位单片机相连接。因此该产品具有品质卓越、超快响应、抗干扰能力强、性价比极高等优点。每个DHT11传感器都在极为精确的湿度校验室中进行校准。校准系数以程序的形式储存在OTP内存中,传感器内部在检测信号的处理过程中要调用这些校准系数。单线制串行接口,使系统集成变得简易快捷。超小的体积、极低的功耗,信号传输距离可达20米以上,使其成为各类应用甚至最为苛刻的应用场合的最佳选则。
现在用RD8T36对DHT11进行测试,测试代码如下,借鉴 安赫,代码都大同小异,时序是相同的。
#define uchar unsigned char
#define uint unsigned int
sbit Data=P1^0; //数据线
uchar rec_dat[9]; //储存数据
void Delay2us() //@32MHz
{
_nop_();
}
void Delay8us() //@32MHz
{
unsigned char i;
i = 8;
while (--i);
}
void Delay25us() //@32MHz
{
unsigned char i;
_nop_();
i = 30;
while (--i);
}
void Delay30us() //@32MHz
{
unsigned char i;
_nop_();
i = 37;
while (--i);
}
void Delay40us() //@32MHz
{
unsigned char i;
_nop_();
i = 50;
while (--i);
}
/*
主机(单片机)发送起始信号:
1.主机先拉高data。
2.拉低data延迟18ms。
3.拉高data并延迟等待(通过此操作将单片机引脚设置为输入)。
*/
void DHT11_start(void)
{
Data=1;
Delay2us();
Data=0;
Delay25us(); //拉低延时18ms以上
Data=1;
Delay30us(); //拉高 延时 20~40us,取中间值 30us
}
/*------------------------------------------------
接收八位二进制
------------------------------------------------*/
uchar DHT11_rec_byte(void) //接收一个字节
{
unsigned char i,dat=0;
for(i=0;i<8;i++) //从高到低依次接收8位数据
{
while(Data); //等待进入低电平
while(!Data); //等待50us低电平过去
Delay8us(); //延时60us,如果还为高则数据为1,否则为0
dat<<=1;//移位(低位补零)使正确接收8位数据,数据为0时直接移位
if(Data==1) //数据为1时,使dat加1来接收数据1
dat+=1;
while(Data); //等待数据线拉低
}
return dat;
}
/*------------------------------------------------
接收40bit数据(具体的温湿度)
1.主机先把data线拉高(io设置为输入)。
2.从机把data线拉低,主机读取data线电平,直到低电平结束(大约50us)
从机拉高data线后,延迟40us左右(28~70us之间)主机再次读取data线电平,如果为低电平,则为“0”,如果为高电平,则为“1”。
3.继续重复上述1,2步骤累计40次。
------------------------------------------------*/
uchar T_H;
void DHT11_receive(void) //接收40位的数据
{
uchar R_H,R_L,T_L,RH,RL,TH,TL,revise;
DHT11_start();//发送起始信号:
if(Data==0)
{
while(Data==0); //等待拉高
Delay40us(); //拉高后延时80us
R_H=DHT11_rec_byte(); //接收湿度高八位
R_L=DHT11_rec_byte(); //接收湿度低八位
T_H=DHT11_rec_byte(); //接收温度高八位
T_L=DHT11_rec_byte(); //接收温度低八位
revise=DHT11_rec_byte(); //接收校正位
Delay25us(); //结束
if((R_H+R_L+T_H+T_L)==revise) //最后一字节为校验位,校验是否正确
{
RH=R_H;
RL=R_L;
TH=T_H;
TL=T_L;
}
/*数据处理,转换为字符,方便显示*/
//湿度
rec_dat[0]=(28);
rec_dat[1]=(5);
rec_dat[2]=' ';
rec_dat[3]=' ';
//温度
rec_dat[4]='0'+(TH/10);
rec_dat[5]='0'+(TH%10);
rec_dat[6]=' ';
}
}
void main(void)
{
IcResourceInit();
ADC_Init1(0x08);
TR0=0;关闭模式0和1的中断源
ET0=0;
TRX=0;
ET2=0;
IE1 &=~0x08;
OLED_Init();
OLED_Clear();
while(1)
{
#if(TestMode==1)
GetADCValue();
OLED_ShowCHinese( 2 , 0 , 0 );
OLED_ShowCHinese( 20 , 0 , 1 );
OLED_ShowCHinese( 36 , 0 , 2 );
OLED_ShowCHinese( 84 , 0 , 9 );
OLED_ShowCHinese( 102 , 0 , 10 );
// OLED_ShowString(10,2,CharData,16);
DHT11_receive();
OLED_ShowNum(40,4,rec_dat[5],6,16); //}
OLED_ShowNum(10,4,rec_dat[4],6,16);
OLED_ShowNum(40,4,rec_dat[1],6,16); //}
OLED_ShowNum(10,4,rec_dat[0],6,16);
;
#endif
}
}
在水杯旁的测试,运行结果如下,
正常环境下测量
————————————————
版权声明:本文为CSDN博主「我要学习。。。。。」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/m0_62054816/article/details/133050016
|