STC12C5628AD单片机读取奥松DHT11时都是0,是采用公司的例程读取的,不知错在哪了

晶振是11.0592MHZ,波特率9600,可能是延时问题,总也调不对,求一个我能用的汇编程序,感谢
RS232接口

//--------------------------------
//-----湿度读取子程序 ------------
//--------------------------------
//----以下变量均为全局变量--------
//----温度高8位== U8T_data_H------
//----温度低8位== U8T_data_L------
//----湿度高8位== U8RH_data_H-----
//----湿度低8位== U8RH_data_L-----
//----校验 8位 == U8checkdata-----
//----调用相关子程序如下----------
//---- Delay();, Delay_10us();,COM();
//--------------------------------

void RH(void)
{
//主机拉低18ms
P2_0=0;
Delay(180);
P2_0=1;
//总线由上拉电阻拉高 主机延时20us
Delay_10us();
Delay_10us();
Delay_10us();
Delay_10us();
//主机设为输入 判断从机响应信号
P2_0=1;
//判断从机是否有低电平响应信号 如不响应则跳出,响应则向下运行
if(!P2_0) //T !
{
U8FLAG=2;
//判断从机是否发出 80us 的低电平响应信号是否结束
while((!P2_0)&&U8FLAG++);
U8FLAG=2;
//判断从机是否发出 80us 的高电平,如发出则进入数据接收状态
while((P2_0)&&U8FLAG++);
//数据接收状态
COM();
U8RH_data_H_temp=U8comdata;
COM();
U8RH_data_L_temp=U8comdata;
COM();
U8T_data_H_temp=U8comdata;
COM();
U8T_data_L_temp=U8comdata;
COM();
U8checkdata_temp=U8comdata;
P2_0=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;
U8checkdata=U8checkdata_temp;
}//fi
}//fi

}
以上是官方的At89C51的程序,晶振11.0592M,再和DHT11通讯中,调用了delay的延时程序。而你采样的是STC12C5628,是单周期51内核单片机,运行速度远远大于At89c51,所以你要移植厂商的程序,你需要增加你延时的指令条数,以满足DHT11的通讯时间要求。追问

我改了几次,9600波特率总是零,其他波特率有数,但不正确。

追答

你的意思是,在单片机配置9600串行通讯的时候,可以收到数据,都是0。
我觉得首先你要确定你的9600波特率通讯,单片机和Pc间是正常的。
比如你自己发送固定的数组,Pc接受看是不是正常。
正常了以后,你要修改DHT11官方提供的软件,主要是采集这块。
采集子函数里用到了软件延时,和单片机的工作频率有关,你的是1周期的单片机,你用它程序里的延时数,肯定延时的比它的要短,时间短,所以DHT11响应了没都不知道。所以请你先检查确认,然后帮你出办法。

追问

用数组测试通讯正常,修改延时后似乎传出正确的的湿度30RH,温度20度,我还有一路AD转换,测出的数总是ff,不知为什么,能帮我看下程序吗

追答

没问题,我的邮箱[email protected]

温馨提示:答案为网友推荐,仅供参考
第1个回答  2011-04-22
什么接口?IO? SPI? I2C?串口?追问

RS232

追答

那就开个串口接收中断了,只要他发数据,单片机就能收到了。
他不发那你肯定什么都读不到啊

相似回答