是‘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++);等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)