找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3728|回复: 3
收起左侧

DHT11在仿真上可以正常显示,在实物上只显示0是怎么回事

[复制链接]
ID:637063 发表于 2020-3-11 09:32 | 显示全部楼层 |阅读模式
缺图,缺详细介绍,或标题意思不明确,请重发
  1. #include<reg51.h>
  2. #include<lcd.h>
  3. sbit dht11=P2^0;
  4. #define OK 1
  5. #define ERROR 0  
  6. #define NUMBER  20  
  7. #define SIZE  5
  8. unsigned char flag;
  9. int temp_value, humi_value, lemp_value, lumi_value;                              
  10. unsigned char status;
  11. unsigned char value_array[5];
  12. //Ñóê±  1ms
  13. void Delay_1ms(unsigned int ms)
  14. {
  15.      unsigned int x, y;
  16.      for(x = ms; x > 0; x--)
  17.      {
  18.         for(y = 124; y > 0; y--);
  19.      }
  20. }
  21. //Ñóê±10 ns
  22. void  Delay_10us(void)
  23. {
  24.     unsigned char  i;
  25.     i--;
  26.     i--;
  27.     i--;
  28.     i--;
  29.     i--;
  30.     i--;
  31. }
  32. unsigned char ReadValue(void)
  33. {
  34.      unsigned char count, value = 0, i;
  35.      status = OK;   
  36.      for(i = 8; i > 0; i--)
  37.      {
  38.         value <<= 1;
  39.         count = 0;
  40.         while(dht11 == 0 && count++ < NUMBER);
  41.         if(count >= NUMBER)
  42.         {
  43.              status = ERROR;
  44.              return 0;   
  45.         }
  46.         Delay_10us();
  47.         Delay_10us();
  48.         Delay_10us();
  49.         if(dht11 != 0)
  50.         {
  51.              value++;
  52.              while(dht11 != 0 && count++ < NUMBER)
  53.              {
  54.                 dht11 = 1;
  55.              }
  56.              if(count >= NUMBER)
  57.              {
  58.                 status = ERROR;  
  59.                 return 0;
  60.               }  
  61.         }
  62.     }  
  63.     return (value);
  64. }
  65. unsigned char ReadTempAndHumi(void)
  66. {  
  67.      unsigned char i = 0, check_value = 0,count = 0;
  68.      EA = 0;
  69.      dht11 = 0;     
  70.      Delay_1ms(20);   
  71.      dht11 = 1;     
  72.      Delay_10us();
  73.      Delay_10us();
  74.      Delay_10us();
  75.      Delay_10us();  
  76.      if(dht11 != 0)   
  77.      {
  78.         EA = 1;
  79.         return ERROR;
  80.      }
  81.      else
  82.     {
  83.         while(dht11 == 0 && count++ < NUMBER);   
  84.         if(count >= NUMBER)  
  85.         {
  86.              dht11 = 1;
  87.              EA = 1;
  88.              return ERROR;   
  89.         }
  90.         count = 0;
  91.         dht11 = 1;
  92.         while(dht11 != 0 && count++ < NUMBER);
  93.         if(count >= NUMBER)
  94.         {
  95.              dht11 = 1;
  96.              EA = 1;
  97.              return ERROR;  
  98.         }  
  99.         for(i = 0; i < SIZE; i++)
  100.         {
  101.              value_array[i] = ReadValue();
  102.              if(status == ERROR)
  103.              {
  104.                 dht11 = 1;
  105.                 EA = 1;   
  106.                 return ERROR;  
  107.              }
  108.              if(i != SIZE - 1)  
  109.              {
  110.                 check_value += value_array[i];  
  111.              }
  112.         }
  113.         if(check_value == value_array[SIZE - 1])
  114.         {
  115.              humi_value = value_array[0]/10;
  116.              lumi_value = value_array[0]%10;
  117.                                            temp_value = value_array[2]/10;
  118.              lemp_value = value_array[2]%10;                                       
  119.              dht11 = 1;
  120.              EA = 1;
  121.              return OK;   
  122.         }
  123.         else
  124.         {
  125.          EA = 1;
  126.          return ERROR;
  127.         }
  128.     }         
  129. }
  130. void display()
  131. {
  132.         LcdWriteCom(0x82);                  //D′μØÖ· 80±íê¾3õê¼μØÖ·
  133.         LcdWriteData('0'+humi_value);
  134.         LcdWriteCom(0x83);
  135.         LcdWriteData('0'+lumi_value);
  136.         LcdWriteCom(0x40+0x82);                  
  137.         LcdWriteData('0'+temp_value);
  138.         LcdWriteCom(0x40+0x83);
  139.         LcdWriteData('0'+lemp_value);
  140. }
  141. void InitTime(void)
  142. {
  143.     TH0 = (65535 - 50000)/256;
  144.     TL0 = (65535 - 50000)%256;
  145.     TMOD = 0X01;
  146.     TR0 = 1;
  147.     ET0 = 1;
  148.     EA = 1;
  149. }        
  150. void main()
  151. {
  152.         LcdInit();
  153.         InitTime();
  154.         while(1)
  155.         {
  156.                 Delay_1ms(1000);
  157.     ReadTempAndHumi();
  158.     Delay_1ms(30);
  159.     display();
  160.   }
  161. }
  162. void timer(void) interrupt 1
  163. {
  164.      TH0 = (65535 - 50000)/256;  
  165.      TL0 = (65535 - 50000)%256;
  166.      flag++;
  167. }
  168. #include"lcd.h"

  169. /*******************************************************************************
  170. * 函 数 名         : Lcd1602_Delay1ms
  171. * 函数功能                   : 延时函数,延时1ms
  172. * 输    入         : c
  173. * 输    出         : 无
  174. * 说    名         : 该函数是在12MHZ晶振下,12分频单片机的延时。
  175. *******************************************************************************/

  176. void Lcd1602_Delay1ms(uint c)   //误差 0us
  177. {
  178.     uchar a,b;
  179.         for (; c>0; c--)
  180.         {
  181.                  for (b=199;b>0;b--)
  182.                  {
  183.                           for(a=1;a>0;a--);
  184.                  }      
  185.         }
  186.             
  187. }

  188. /*******************************************************************************
  189. * 函 数 名         : LcdWriteCom
  190. * 函数功能                   : 向LCD写入一个字节的命令
  191. * 输    入         : com
  192. * 输    出         : 无
  193. *******************************************************************************/
  194. #ifndef         LCD1602_4PINS         //当没有定义这个LCD1602_4PINS时
  195. void LcdWriteCom(uchar com)          //写入命令
  196. {
  197.         LCD1602_E = 0;     //使能
  198.         LCD1602_RS = 0;           //选择发送命令
  199.         LCD1602_RW = 0;           //选择写入
  200.         
  201.         LCD1602_DATAPINS = com;     //放入命令
  202.         Lcd1602_Delay1ms(1);                //等待数据稳定

  203.         LCD1602_E = 1;                  //写入时序
  204.         Lcd1602_Delay1ms(5);          //保持时间
  205.         LCD1602_E = 0;
  206. }
  207. #else
  208. void LcdWriteCom(uchar com)          //写入命令
  209. {
  210.         LCD1602_E = 0;         //使能清零
  211.         LCD1602_RS = 0;         //选择写入命令
  212.         LCD1602_RW = 0;         //选择写入

  213.         LCD1602_DATAPINS = com;        //由于4位的接线是接到P0口的高四位,所以传送高四位不用改
  214.         Lcd1602_Delay1ms(1);

  215.         LCD1602_E = 1;         //写入时序
  216.         Lcd1602_Delay1ms(5);
  217.         LCD1602_E = 0;

  218. //        Lcd1602_Delay1ms(1);
  219.         LCD1602_DATAPINS = com << 4; //发送低四位
  220.         Lcd1602_Delay1ms(1);

  221.         LCD1602_E = 1;         //写入时序
  222.         Lcd1602_Delay1ms(5);
  223.         LCD1602_E = 0;
  224. }
  225. #endif
  226. /*******************************************************************************
  227. * 函 数 名         : LcdWriteData
  228. * 函数功能                   : 向LCD写入一个字节的数据
  229. * 输    入         : dat
  230. * 输    出         : 无
  231. *******************************************************************************/                  
  232. #ifndef         LCD1602_4PINS                  
  233. void LcdWriteData(uchar dat)                        //写入数据
  234. {
  235.         LCD1602_E = 0;        //使能清零
  236.         LCD1602_RS = 1;        //选择输入数据
  237.         LCD1602_RW = 0;        //选择写入

  238.         LCD1602_DATAPINS = dat; //写入数据
  239.         Lcd1602_Delay1ms(1);

  240.         LCD1602_E = 1;   //写入时序
  241.         Lcd1602_Delay1ms(5);   //保持时间
  242.         LCD1602_E = 0;
  243. }
  244. #else
  245. void LcdWriteData(uchar dat)                        //写入数据
  246. {
  247.         LCD1602_E = 0;          //使能清零
  248.         LCD1602_RS = 1;          //选择写入数据
  249.         LCD1602_RW = 0;          //选择写入

  250.         LCD1602_DATAPINS = dat;        //由于4位的接线是接到P0口的高四位,所以传送高四位不用改
  251.         Lcd1602_Delay1ms(1);

  252.         LCD1602_E = 1;          //写入时序
  253.         Lcd1602_Delay1ms(5);
  254.         LCD1602_E = 0;

  255.         LCD1602_DATAPINS = dat << 4; //写入低四位
  256.         Lcd1602_Delay1ms(1);

  257.         LCD1602_E = 1;          //写入时序
  258.         Lcd1602_Delay1ms(5);
  259.         LCD1602_E = 0;
  260. }
  261. #endif
  262. /*******************************************************************************
  263. * 函 数 名       : LcdInit()
  264. * 函数功能                 : 初始化LCD屏
  265. * 输    入       : 无
  266. * 输    出       : 无
  267. *******************************************************************************/                  
  268. #ifndef                LCD1602_4PINS
  269. void LcdInit()                                                  //LCD初始化子程序
  270. {
  271.          LcdWriteCom(0x38);  //开显示
  272.         LcdWriteCom(0x0c);  //开显示不显示光标
  273.         LcdWriteCom(0x06);  //写一个指针加1
  274.         LcdWriteCom(0x01);  //清屏
  275.         LcdWriteCom(0x80);  //设置数据指针起点
  276. }
  277. #else
  278. void LcdInit()                                                  //LCD初始化子程序
  279. {
  280.         LcdWriteCom(0x32);         //将8位总线转为4位总线
  281.         LcdWriteCom(0x28);         //在四位线下的初始化
  282.         LcdWriteCom(0x0c);  //开显示不显示光标
  283.         LcdWriteCom(0x06);  //写一个指针加1
  284.         LcdWriteCom(0x01);  //清屏
  285.         LcdWriteCom(0x80);  //设置数据指针起点
  286. }
  287. #endif

  288. #endif
  289. #ifndef __LCD_H_
  290. #define __LCD_H_
  291. /**********************************
  292. 当使用的是4位数据传输的时候定义,
  293. 使用8位取消这个定义
  294. **********************************/
  295. //#define LCD1602_4PINS

  296. /**********************************
  297. 包含头文件
  298. **********************************/
  299. #include<reg51.h>

  300. //---重定义关键词---//
  301. #ifndef uchar
  302. #define uchar unsigned char
  303. #endif

  304. #ifndef uint
  305. #define uint unsigned int
  306. #endif

  307. /**********************************
  308. PIN口定义
  309. **********************************/
  310. #define LCD1602_DATAPINS P0
  311. sbit LCD1602_E=P2^7;
  312. sbit LCD1602_RW=P2^5;
  313. sbit LCD1602_RS=P2^6;

  314. /**********************************
  315. 函数声明
  316. **********************************/
  317. /*在51单片机12MHZ时钟下的延时函数*/
  318. void Lcd1602_Delay1ms(uint c);   //误差 0us
  319. /*LCD1602写入8位命令子函数*/
  320. void LcdWriteCom(uchar com);
  321. /*LCD1602写入8位数据子函数*/        
  322. void LcdWriteData(uchar dat)        ;
  323. /*LCD1602初始化子程序*/               
  324. void LcdInit();                                                  

  325. #endif
复制代码



求各位大神帮帮我,这到底是怎么回事

proteus仿真

proteus仿真
51hei图片20200311093202.jpg
回复

使用道具 举报

ID:96682 发表于 2020-3-11 13:31 来自手机 | 显示全部楼层
看图片楼主的开发板模块端口未正确设置。
回复

使用道具 举报

ID:637063 发表于 2020-3-11 17:14 | 显示全部楼层
wc86110 发表于 2020-3-11 13:31
看图片楼主的开发板模块端口未正确设置。

什么意思,请大神说细一些
回复

使用道具 举报

ID:639372 发表于 2020-3-11 19:07 | 显示全部楼层
给你思路,具体怎么办你自己试一试,排查一下:
1.硬件问题。建议你找官方例程试一下,如果还是0就是你的模块有问题。
2.接错线了。别说不可能,我一个接线问题(vcc没连)搞了我两天才发现,还烧了个板子。
3.程序问题。如果官方例程可以就是你的程序写错了。
大概问题就这三种,希望能帮到你!
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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