DHT11.c程序疑问,U8T_data_H10%10 + '0' 这的+“0”是什么意思

DHT11.c程序疑问,U8T_data_H10%10 + '0' 这的+“0”是什么意思,第1张

是‘0’,不是"0",意思是取数字0的ASCII码值0x30

因为U8T_data_H是表示湿度整数部分,是实际值,比如湿度为89%,U8T_data_H的值即为0x59,拆分为个十位即8和9,就是说U8T_data_H/10%10=8,U8T_data_H%10=9。但是如果要显示出来就要转为ASCII码,否则就会显示ASCII里第八和第九个字符就是退格和制表符,也可能显示不支持则为乱码。而ASCII里数字0~9的码位应该是0x30~0x39,所以要得某数字ASCII值只要把数字值加0x30即可,比如上面DATA[44] = U8T_data_H/10%10 + '0' = 0x08 + 0x30 = 0x38,DATA[45] = U8T_data_H%10 + '0' = 0x09 + 0x30 = 0x39,就是8和9的ASCII码值

您的程序整体可能没有错,但是这个对时序的要求很高,或许您的时序错了。只有时序不对时,读取出来的数据全部是0,所以,你的改变对它无效,而且这个传感器无法PROTEUS中仿真,当初我做这个项目的时候,也是使用了半天才调试出来的,也是开始出现0

0

0

0的情况。

U8FLAG++是加到溢出(=0)的时候退出

从2加到256时间主要看机器周期

如果按照1us算的话 大概1ms多了

1毫秒内没接到响应信号退出

接到响应信号并记录响应信号(低电平)的时间

U8FLAG++就是记录响应信号时间的

while((!P2_0)&&U8FLAG++);

一次运算(按照机器周期1us计算)

7个机器周期 7us

接收完成信号后U8FLAG的值应该是13

sbit DQ1= P3^7 ; //车内探头

sbit DQ2= P1^1 ; //车外探头

sbit AC_CTRL = P2^2; //AC空调控制端。1为开启

/------------------------------------------------

定义区

------------------------------------------------/

xdata signed int Memory_buf2[5]={0,0,0,0,0};//xdata 前2分钟记忆值:车外湿度,车外温度,车内湿度,车内温度,电压

xdata signed int Memory_buf1[5]={0,0,0,0,0};//xdata 前1分钟记忆值:车外湿度,车外温度,车内湿度,车内温度,电压

unsigned int U16RH_data1,U16T_data1, U16RH_data2,U16T_data2,Voltage;

bit Minus_Flag1,Minus_Flag2,TIMEshow; //定义温度符号位 时间闪烁的:

/

串行总线 收发信号检测,数据读取 车内探头

/

unsigned char COM1(void)

{unsigned char i,U8temp,U8comdata,U8FLAG;

for(i=0;i<8;i++)

{

U8FLAG=2;

while((!DQ1)&&U8FLAG++);

delay40us();

U8temp=0;

if(DQ1)U8temp=1; //延时40us后 如果仍为高电平则数据为1 否则为0

U8FLAG=2;

while((DQ1)&&U8FLAG++);

if(U8FLAG==1)break;

U8comdata<<=1; U8comdata|=U8temp; //整合数据

}

return(U8comdata);

}

/------------------------------------------------

读取温、湿度 车内探头

------------------------------------------------/

void RH1(void)

{

unsigned char U8T_data_H,U8T_data_L,U8RH_data_H,U8RH_data_L,U8temp,U8FLAG;

unsigned char U8T_data_H_temp,U8T_data_L_temp,U8RH_data_H_temp,U8RH_data_L_temp,U8checkdata_temp;

DQ1=0; delay100us(5); //主机拉低总线 至少500us

DQ1=1; delay40us(); //总线由上拉电阻拉高 主机延时20us-40us

if(!DQ1) //判断从机是否有低电平响应信号 如不响应则跳出,响应则向下运行

{

U8FLAG=2;

while((!DQ1)&&U8FLAG++); //判断从机是否发出 80us 的低电平响应信号是否结束

U8FLAG=2;

while((DQ1)&&U8FLAG++); //判断从机是否发出 80us 的高电平,如发出则进入数据接收状态

//数据接收状态

U8RH_data_H_temp=COM1(); //读湿度高8位

U8RH_data_L_temp=COM1(); //读湿度低8位

U8T_data_H_temp =COM1(); //读温度高8位

U8T_data_L_temp =COM1(); //读温度低8位

U8checkdata_temp=COM1(); //读校验数据

DQ1=1; //释放总线

U8temp=(U8T_data_H_temp+U8T_data_L_temp+U8RH_data_H_temp+U8RH_data_L_temp); //数据校验

if(U8temp==U8checkdata_temp) //如果数据读取无误

{

U8RH_data_H=U8RH_data_H_temp;

U8RH_data_L=U8RH_data_L_temp;

U8T_data_H = U8T_data_H_temp;

U8T_data_L = U8T_data_L_temp;

if(U8T_data_H&0x80) //如果温度高8位首位为1 则为负温度

{Minus_Flag1=1;U8T_data_H = U8T_data_H-0x80;}

else

{Minus_Flag1=0;U8T_data_H = U8T_data_H;}

U16RH_data1=(U8RH_data_H256)|U8RH_data_L;

U16T_data1 = (U8T_data_H256)|U8T_data_L;

}

}

}

}

这是我正在用的程序的一部分,用的是1T的单片机,给你参考一下吧。晶体是12M的,别的地方你基本可以不改,主要注意好延时的时间一定要参照备注

以上就是关于DHT11.c程序疑问,U8T_data_H/10%10 + '0' 这的+“0”是什么意思全部的内容,包括:DHT11.c程序疑问,U8T_data_H/10%10 + '0' 这的+“0”是什么意思、DHT11温湿度传感器的问题。、解释下面程序是怎么判断DHT11的80us响应信号的。 unsigned char U8FLAG=2; while((!P2_0)&&U8FLAG++);等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/10171239.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-06
下一篇 2023-05-06

发表评论

登录后才能评论

评论列表(0条)

保存