找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2682|回复: 3
打印 上一主题 下一主题
收起左侧

STC12C5A60S2+DH11温湿度传感器 11.0592晶振 延时是用示波器掐的

[复制链接]
跳转到指定楼层
楼主
ID:260379 发表于 2019-1-14 10:20 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
  1. #include <STC12C5A60S2.H>
  2. #define uchar unsigned char
  3. #define uint unsigned int
  4. uchar code table[]="TEMP:";
  5. uchar code table1[]="HUMI:";
  6. //请根据自己的dht11接的IO口来改动位定义
  7. sbit dht11 = P3^2;
  8. sbit rw=P2^5;

  9. //防止在与硬件通信时发生死循环的计数范围
  10. #define NUMBER  2000

  11. #define SIZE 5
  12. unsigned char status;
  13. //存放五字节数据的数组
  14. unsigned char value_array[SIZE];
  15. /*可在其他的文件引用温湿度值,实际是温度的整数的10倍
  16. 如dht11读回的温度是26,则temp_value = 260, 湿度同理*/
  17. int temp=12,humi=12;   

  18. sbit lcden=P2^7;
  19. sbit lcdrs=P2^6;

  20. uchar num,a;
  21. uint c,b,d,e;
  22. void delay(uint z)
  23. {
  24.         uint x,y;
  25.         for(x=z;x>0;x--)
  26.                 for(y=500;y>0;y--);
  27. }
  28. void write_com(uchar com)
  29. {
  30.         lcdrs=0;
  31.         P0=com;
  32.         delay(1);
  33.         lcden=1;
  34.         delay(1);
  35.         lcden=0;
  36. }

  37. void write_data(uchar date)
  38. {
  39.         lcdrs=1;
  40.         P0=date;
  41.         delay(1);
  42.         lcden=1;
  43.         delay(1);
  44.         lcden=0;
  45. }

  46. void write_string(uchar hang,uchar add,uchar *p)
  47. {
  48.         if(hang==1)   
  49.                 write_com(0x80+add);
  50.         else
  51.                 write_com(0x80+0x40+add);
  52.                 while(1)                                                                                                                 
  53.                 {
  54.                         if(*p == '\0')  break;
  55.                         write_data(*p);
  56.                         p++;
  57.                 }        
  58. }
  59. void init_1602()
  60. {

  61.         rw=0;

  62.         lcden=0;
  63.         dht11=1;
  64.         write_com(0x38);
  65.         write_com(0x0c);
  66.         write_com(0x06);
  67.         write_com(0x01);
  68.         write_com(0x80);
  69. }

  70. void Delay_1ms(unsigned int ms)
  71. {
  72. unsigned int x, y;
  73. for(x = ms; x > 0; x--)
  74. {
  75.   for(y = 1000; y > 0; y--);
  76. }
  77. }

  78. void  Delay_10us(void)
  79. {
  80. unsigned char  i;
  81.     i--; i--; i--; i--;
  82.         i--; i--; i--; i--;
  83.     i--; i--; i--; i--;
  84.         i--; i--; i--; i--;
  85.     i--; i--;
  86.         i--; i--; i--; i--;
  87.         i--; i--; i--; i--;
  88.     i--; i--; i--; i--;
  89.         i--; i--; i--; i--;
  90.     i--; i--;
  91.         i--; i--; i--; i--;
  92.         i--; i--; i--; i--;
  93.     i--; i--; i--; i--;
  94.         i--; i--; i--; i--;
  95.     i--; i--;
  96.         i--; i--; i--; i--;
  97.     i--; i--;  
  98. }

  99. /*读一个字节的数据*/
  100. unsigned char ReadValue(void)
  101. {
  102. unsigned char count, value = 0, i;
  103. status = 1;     //设定标志为正常状态
  104. for(i = 8; i > 0; i--)
  105. {
  106.   //高位在先
  107.   value <<= 1;
  108.   count = 0;
  109.   //每一位数据前会有一个50us的低电平时间.等待50us低电平结束
  110.   while(dht11 == 0);
  111.   //26-28us的高电平表示该位是0,为70us高电平表该位1
  112.   Delay_10us();
  113.   Delay_10us();

  114.   //延时30us后检测数据线是否还是高电平
  115.   if(dht11 != 0)
  116.   {
  117.    //进入这里表示该位是1
  118.    value++;
  119.    //等待剩余(约40us)的高电平结束
  120.    while(dht11 != 0)
  121.    {
  122.     dht11 = 1;
  123.    }
  124.   }
  125. }  
  126. return (value);
  127. }
  128. //读一次的数据,共五字节
  129. uchar rdata()
  130. {
  131. uchar i = 0, check_value = 0,count = 0;
  132.    Delay_1ms(2);


  133. dht11 = 0;       //拉低数据线大于18ms发送开始信号
  134. Delay_1ms(20);   //需大于18毫秒
  135. dht11 = 1;      //释放数据线,用于检测低电平的应答信号
  136. //延时20-40us,等待一段时间后检测应答信号,应答信号是从机拉低数据线80us
  137. Delay_10us();
  138. Delay_10us();  
  139. if(dht11 != 0)    //检测应答信号,应答信号是低电平
  140. {
  141.    //没应答信号  
  142.   return 0;
  143. }
  144. else
  145. {
  146.   //有应答信号
  147.   while(dht11 == 0 );   //等待应答信号结束
  148.   count = 0;
  149.   dht11 = 1;//释放数据线  
  150.   //应答信号后会有一个80us的高电平等待高电平结束  
  151.   while(dht11 != 0);

  152.   //读出湿.温度值   
  153.      for(i = 0; i < SIZE; i++)
  154.   {
  155.    value_array[i] = ReadValue();
  156.    if(status == 0)//调用ReadValue()读数据出错会设定status为ERROR
  157.    {
  158.     dht11 = 1;     
  159.     return 0;  
  160.    }
  161.    //读出的最后一个值是校验值不需加上去
  162.    if(i != SIZE - 1)  
  163.    {
  164.     //读出的五字节数据中的前四字节数据和等于第五字节数据表示成功
  165.     check_value += value_array[i];  
  166.    }
  167.   }//end for
  168.   //在没用发生函数调用失败时进行校验
  169.   if(check_value == value_array[SIZE - 1])
  170.   {
  171.    //将温湿度扩大10倍方便分离出每一位
  172.    humi = value_array[0] * 10;
  173.    temp = value_array[2] * 10;





  174.   dht11 = 1;
  175.     return 0;    //正确的读出dht11输出的数据   
  176.   }
  177.   else
  178.   {
  179.    //校验数据出错  
  180.       return 0;
  181.   }
  182. }      
  183. }

  184. void main()
  185. {
  186.                 uchar x;
  187.                 x=1;
  188.                 init_1602();
  189.                 for(num=0;num<5;num++)
  190.                         {
  191.                                 write_data(table[num]);
  192.                                 delay(5);
  193.                         }
  194.                 write_com(0x80+0x40);
  195.                  for(num=0;num<5;num++)
  196.                         {
  197.                                 write_data(table1[num]);
  198.                                 delay(5);
  199.                         }
  200.                         while(1)
  201.                         {
  202.                         rdata();
  203.                 write_com(0x80+0x05);
  204.                 write_data(temp/100+'0');
  205.                 delay(x);
  206.                 write_data(temp%100/10+'0');
  207.                 delay(x);
  208.                 write_com(0x80+0x45);
  209.                 write_data(humi/100+'0');
  210.                 delay(x);
  211.                 write_data(humi%100/10+'0');
  212.                  delay(x);
  213.                                 
  214.                         write_string(1,8,"com");
  215. //                write_com(0x80+0x09);
  216. //                delay(x);
  217. //                write_data(c/10000+'0');
  218. //                delay(x);
  219. //                write_data(c%10000/1000+'0');
  220. //                delay(x);
  221. //                write_data(c%10000%1000/100+'0');
  222.         
  223. }
  224.                            
  225. }
复制代码
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏3 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:1 发表于 2019-1-14 15:13 | 只看该作者
用示波器掐的?
回复

使用道具 举报

板凳
ID:260379 发表于 2019-1-18 16:50 | 只看该作者

嗯  对时间要求有点小严格 所以用示波器一点一点试的
回复

使用道具 举报

地板
ID:984027 发表于 2021-11-28 15:55 来自手机 | 只看该作者
我的怎么不显示
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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