找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3588|回复: 8
收起左侧

单片机+DHT11仿真不成功,找不出来问题

[复制链接]
ID:670765 发表于 2019-12-26 11:30 | 显示全部楼层 |阅读模式
本帖最后由 151huh 于 2019-12-26 11:41 编辑

使用的元件有stc89c52,npn三极管,四位一体共阴数码管,DHT11.

仿真

仿真


代码文件
  1. #include <reg52.h>
  2. #define duanxuan P0
  3. #define weixuan P2
  4. sbit Data = P1^0;[/align][align=left]
  5. void delay_us(int num)//us延时函数
  6. {
  7. int cnt = 0;
  8. TMOD = 0x01;
  9. TH0 = 0xFF; //设置延时1us
  10. TL0 = 0xFF;
  11. TR0 = 1;
  12. while(1)
  13. {
  14.   if(TF0 == 1)
  15.   {
  16.    TF0 = 0;
  17.    TH0 = 0xFF;
  18.    TL0 = 0XFF;
  19.    cnt++;
  20.    if(cnt >= num)
  21.     break;
  22.   }
  23. }
  24.   
  25. }void delay_ms(int shuzhi)//ms延时函数
  26. {
  27. int cnt = 0;
  28. TMOD = 0x01;
  29. TH0 = 0x03; //设置延时1ms
  30. TL0 = 0xE8;
  31. TR0 = 1;
  32. while(1)
  33. {
  34.   if(TF0 == 1)
  35.   {
  36.    TF0 = 0;
  37.    TH0 = 0x03;
  38.    TL0 = 0XE8;
  39.    cnt++;
  40.    if(cnt >= shuzhi)
  41.     break;
  42.   }
  43. }
  44. }
  45. void Xianshi(int a, d)//数码管显示函数
  46. {
  47. unsigned char code wxcode[4] = {0xfe,0xfd,0xfb,0xf7};//位选编码表
  48. unsigned char code dxcode[10] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //段选编码表
  49. unsigned char i;
  50. unsigned int g, s, b, q, j;

  51. g = a%10;//个位
  52. s = a/10%10; //十位
  53. b = b%10;  //百位
  54. q = b/10%10;  //千位

  55. for(i=0;i<4;i++)
  56. {
  57.   weixuan = wxcode[i];
  58.   duanxuan = 0x00;
  59.   if(i==3)
  60.    duanxuan = dxcode[g];
  61.   if(i==2)
  62.    duanxuan = dxcode[s];
  63.   if(i==1)
  64.    duanxuan = dxcode[b];
  65.   if(i==0)
  66.    duanxuan = dxcode[q];
  67. }
  68. j = 100;
  69. while(j--);  
  70. }
  71. [align=left]void DHT_star()//温湿度读取函数
  72. {
  73. Data = 1;
  74. delay_us(20);
  75. Data = 0;
  76. delay_ms(20);    //主机发送起始信号
  77. Data = 1;
  78. delay_us(30);
  79. }
  80. unsigned char DHT_code() //DHT11接受一个字节
  81. {
  82. unsigned char i;
  83. unsigned char dat = 0;
  84. for(i=0;i<8;i++)
  85. {
  86.   while(!Data);  //等待50us的低电平过去
  87.   delay_us(60);  //延时60us如果还为高电平则数据为1
  88.   dat <<= 1;    //数据为0时直接执行移位操作
  89.   if(Data==1)   //数据为1时,加1
  90.    dat += 1;
  91.   while(Data);    //等待数据线拉低
  92. }
  93. return dat;
  94. }[/align][align=left]void DHT_receive()
  95. {
  96. unsigned char R_H, R_L, T_H, T_L, RH=0, RL, TH=0, TL, revise;
  97. DHT_star();
  98. if(Data==0)
  99. {
  100.   while(Data == 0);  //等待数据线拉高
  101.   delay_us(80);
  102.   R_H = DHT_code(); //接受8位湿度整数数据
  103.   R_L = DHT_code(); //接受8位湿度小数数据
  104.   T_H = DHT_code(); //接受8位温度整数数据
  105.   T_L = DHT_code(); //接受8位温度小数数据
  106.   revise = DHT_code();   //接受检验数据[/align][align=left]  delay_us(30);[/align][align=left]  if((R_H+R_L+T_H+T_L)==revise) //校验数据是否正确
  107.   {
  108.    RH = R_H;
  109.    RL = R_L;
  110.    TH = T_H;
  111.    TL = T_L;
  112.   }
  113. }
  114. Xianshi(RH, TH);  //显示湿度整数,温度整数
  115. }[/align][align=left]void main()//主函数
  116. {
  117. while(1)
  118. {
  119.   delay_ms(1500);  //DHT11上电后等待超过1s以越过不稳定状态
  120.   DHT_receive();
  121. }
  122. }
复制代码

回复

使用道具 举报

ID:130230 发表于 2019-12-26 11:55 | 显示全部楼层
不要再while(1)里面延时,你的数码管刷不起来的。建议如果确实需要延时用定时器加标志做成时间片。
回复

使用道具 举报

ID:396245 发表于 2019-12-26 12:05 | 显示全部楼层
P0口需要外部上拉。
回复

使用道具 举报

ID:532541 发表于 2019-12-26 12:24 | 显示全部楼层
DHT11、 18B20这类接口,出问题,有三个方面,第一时序,第二时间,第三口线的设置,第一个一般不出问,因为大家用的程序都是参考了调试通过的了例程,第二个是出问题最多的是时间,因为延时都是用程序循环实现的,而我们用的单片机,时钟频率分频系数和例程可能差别很大,比如用的例程是标准的51(89CAT52),而实际用的是STC12C5A60S2单片机,那延时的时间就差很多了,只要报延时的时间弄对了就ok了,低三就是口线的设置,如方向驱动能力等。
回复

使用道具 举报

ID:202748 发表于 2019-12-26 15:13 | 显示全部楼层
你说是共阴数码管,但你这仿真图是共阳接法。
回复

使用道具 举报

ID:584814 发表于 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)也极罕见。
回复

使用道具 举报

ID:312890 发表于 2019-12-30 13:23 | 显示全部楼层
P0口需要上拉电阻
回复

使用道具 举报

ID:1042651 发表于 2022-8-22 17:15 | 显示全部楼层
void delay_ms(int shuzhi)//ms延时函数
void delay_us(int num)//us延时函数

可能是这两个延时函数的问题,导致不精准,优化下!
回复

使用道具 举报

ID:1042651 发表于 2022-8-22 17:15 | 显示全部楼层
延时函数的问题
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表