标题: 单片机+DHT11仿真不成功,找不出来问题 [打印本页]
作者: 151huh 时间: 2019-12-26 11:30
标题: 单片机+DHT11仿真不成功,找不出来问题
本帖最后由 151huh 于 2019-12-26 11:41 编辑
使用的元件有stc89c52,npn三极管,四位一体共阴数码管,DHT11.
代码文件
- #include <reg52.h>
- #define duanxuan P0
- #define weixuan P2
- sbit Data = P1^0;[/align][align=left]
- void delay_us(int num)//us延时函数
- {
- int cnt = 0;
- TMOD = 0x01;
- TH0 = 0xFF; //设置延时1us
- TL0 = 0xFF;
- TR0 = 1;
- while(1)
- {
- if(TF0 == 1)
- {
- TF0 = 0;
- TH0 = 0xFF;
- TL0 = 0XFF;
- cnt++;
- if(cnt >= num)
- break;
- }
- }
-
- }void delay_ms(int shuzhi)//ms延时函数
- {
- int cnt = 0;
- TMOD = 0x01;
- TH0 = 0x03; //设置延时1ms
- TL0 = 0xE8;
- TR0 = 1;
- while(1)
- {
- if(TF0 == 1)
- {
- TF0 = 0;
- TH0 = 0x03;
- TL0 = 0XE8;
- cnt++;
- if(cnt >= shuzhi)
- break;
- }
- }
- }
- void Xianshi(int a, d)//数码管显示函数
- {
- unsigned char code wxcode[4] = {0xfe,0xfd,0xfb,0xf7};//位选编码表
- unsigned char code dxcode[10] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //段选编码表
- unsigned char i;
- unsigned int g, s, b, q, j;
-
- g = a%10;//个位
- s = a/10%10; //十位
- b = b%10; //百位
- q = b/10%10; //千位
-
- for(i=0;i<4;i++)
- {
- weixuan = wxcode[i];
- duanxuan = 0x00;
- if(i==3)
- duanxuan = dxcode[g];
- if(i==2)
- duanxuan = dxcode[s];
- if(i==1)
- duanxuan = dxcode[b];
- if(i==0)
- duanxuan = dxcode[q];
- }
- j = 100;
- while(j--);
- }
- [align=left]void DHT_star()//温湿度读取函数
- {
- Data = 1;
- delay_us(20);
- Data = 0;
- delay_ms(20); //主机发送起始信号
- Data = 1;
- delay_us(30);
- }
- unsigned char DHT_code() //DHT11接受一个字节
- {
- unsigned char i;
- unsigned char dat = 0;
- for(i=0;i<8;i++)
- {
- while(!Data); //等待50us的低电平过去
- delay_us(60); //延时60us如果还为高电平则数据为1
- dat <<= 1; //数据为0时直接执行移位操作
- if(Data==1) //数据为1时,加1
- dat += 1;
- while(Data); //等待数据线拉低
- }
- return dat;
- }[/align][align=left]void DHT_receive()
- {
- unsigned char R_H, R_L, T_H, T_L, RH=0, RL, TH=0, TL, revise;
- DHT_star();
- if(Data==0)
- {
- while(Data == 0); //等待数据线拉高
- delay_us(80);
- R_H = DHT_code(); //接受8位湿度整数数据
- R_L = DHT_code(); //接受8位湿度小数数据
- T_H = DHT_code(); //接受8位温度整数数据
- T_L = DHT_code(); //接受8位温度小数数据
- revise = DHT_code(); //接受检验数据[/align][align=left] delay_us(30);[/align][align=left] if((R_H+R_L+T_H+T_L)==revise) //校验数据是否正确
- {
- RH = R_H;
- RL = R_L;
- TH = T_H;
- TL = T_L;
- }
- }
- Xianshi(RH, TH); //显示湿度整数,温度整数
- }[/align][align=left]void main()//主函数
- {
- while(1)
- {
- delay_ms(1500); //DHT11上电后等待超过1s以越过不稳定状态
- DHT_receive();
- }
- }
复制代码
作者: jizhongbiao 时间: 2019-12-26 11:55
不要再while(1)里面延时,你的数码管刷不起来的。建议如果确实需要延时用定时器加标志做成时间片。
作者: SroneBridge 时间: 2019-12-26 12:05
P0口需要外部上拉。
作者: linzhiqi1 时间: 2019-12-26 12:24
DHT11、 18B20这类接口,出问题,有三个方面,第一时序,第二时间,第三口线的设置,第一个一般不出问,因为大家用的程序都是参考了调试通过的了例程,第二个是出问题最多的是时间,因为延时都是用程序循环实现的,而我们用的单片机,时钟频率分频系数和例程可能差别很大,比如用的例程是标准的51(89CAT52),而实际用的是STC12C5A60S2单片机,那延时的时间就差很多了,只要报延时的时间弄对了就ok了,低三就是口线的设置,如方向驱动能力等。
作者: ysandi 时间: 2019-12-26 15:13
你说是共阴数码管,但你这仿真图是共阳接法。
作者: man1234567 时间: 2019-12-26 18:12
[/align][align=left]这些是什么鬼看得眼花 
建议将
void main()//主函数
{
while(1)
{
delay_ms(1500); //DHT11上电后等待超过1s以越过不稳定状态
DHT_receive();
}
}
调整成
void main()//主函数
{
delay_ms(1500); //DHT11上电后等待超过1s以越过不稳定状态
while(1)
{
DHT_receive();
}
}
试试。还有就是感觉在delay()里用while(1)也极罕见。
作者: weiweioioi 时间: 2019-12-30 13:23
P0口需要上拉电阻
作者: absxy 时间: 2022-8-22 17:15
void delay_ms(int shuzhi)//ms延时函数
void delay_us(int num)//us延时函数
可能是这两个延时函数的问题,导致不精准,优化下!
作者: absxy 时间: 2022-8-22 17:15
延时函数的问题
欢迎光临 (http://www.51hei.com/bbs/) |
Powered by Discuz! X3.1 |