找回密码
 立即注册

QQ登录

只需一步,快速开始

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

单片机DHT11检测程序(串口发送)

[复制链接]
跳转到指定楼层
楼主
ID:312455 发表于 2018-4-26 19:13 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
关于DHT11的检测及串口
单片机源程序如下:
  1. #include <reg51.h>
  2. #include"stdio.h"
  3. #include"intrins.h"
  4. #define OK 1
  5. #define ERROR 0
  6. extern void Delay_1ms(unsigned int ms);
  7. //函数的返回值表示读取数据是否成功 OK 表示成功 ERROR 表示失败
  8. extern unsigned char DHT11_ReadTempAndHumi(void);
  9. sbit dht11 = P2^0;         //IO口定义
  10. //防止在与硬件通信时发生死循环的计数范围
  11. #define NUMBER 120                           //20 12T
  12. #define SIZE 5
  13. static unsigned char status;
  14. unsigned char tempshi,tempge;
  15. //存放五字节数据的数组
  16. static unsigned char value_array[SIZE];
  17. /*可在其他的文件引用温湿度值,实际是温度的整数的10 倍
  18. 如dht11 读回的温度是26,则temp_value = 260, 湿度同理*/
  19. int temp_value, humi_value;
  20. static unsigned char ReadValue(void);
  21. void serial_init(){
  22.         TMOD=0x20;
  23.         TH1=0xfd;
  24.         TL1=0xfd;                                                 //设置9600波特率
  25.         SCON=0x50;                                                 //串口方式1,允许接收
  26.         TR1=1;
  27. }
  28. void main(){
  29.            serial_init();

  30.            
  31.                 while(1){
  32.                         if(DHT11_ReadTempAndHumi()==OK){
  33.                                 TI=1;
  34.                                 SBUF=temp_value;
  35.                                 TI=0;
  36.                                 Delay_1ms(1000);
  37.                                 TI=1;
  38.                                 SBUF=humi_value;
  39.                                 TI=0;
  40.                                 Delay_1ms(1000);
  41.                         }
  42.                         else if(DHT11_ReadTempAndHumi()==ERROR){
  43.                                 TI=1;
  44.                                 SBUF=0x01;
  45.                                 TI=0;
  46.                                 Delay_1ms(1000);
  47.                         }
  48.                 }
  49. }


  50. extern void Delay_1ms(unsigned int a){                //延时约1ms
  51.         unsigned int i;
  52.         while (--a!=0)
  53.                 for(i=600;i>0;i--);
  54. }
  55. static void DHT11_Delay_10us(void){
  56.                 unsigned char i;
  57.                 i--;
  58.                 i--;
  59.                 i--;
  60.                 i--;
  61.                 i--;
  62.                 i--;
  63.                 i--;
  64.                 i--;
  65.                 i--;
  66.                 i--;
  67.                 i--;
  68.                 i--;
  69.                 i--;
  70.                 i--;
  71.                 i--;
  72.                 i--;
  73.                 i--;
  74.                 i--;
  75.                 i--;
  76.                 i--;
  77.                 i--;
  78.                 i--;
  79. }
  80. /*读一个字节的数据*/
  81. static unsigned char DHT11_ReadValue(void){
  82.         unsigned char count, value = 0, i;
  83.         status = OK; //设定标志为正常状态
  84.         for(i = 8; i > 0; i--){
  85.                 //高位在先
  86.                 value <<= 1;
  87.                 count = 0;
  88.                 //每一位数据前会有一个50us 的低电平时间.等待50us 低电平结束
  89.                 while(dht11 == 0 && count++ < NUMBER);
  90.                 if(count >= NUMBER){
  91.                         status = ERROR; //设定错误标志
  92.                         return 0; //函数执行过程发生错误就退出函数
  93.                 }
  94.                 //26-28us 的高电平表示该位是0,为70us 高电平表该位1
  95.                 DHT11_Delay_10us();
  96.                 DHT11_Delay_10us();
  97.                 DHT11_Delay_10us();

  98.                 //延时30us 后检测数据线是否还是高电平
  99.                 if(dht11 != 0){
  100.                         //进入这里表示该位是1
  101.                         value++;
  102.                         //等待剩余(约40us)的高电平结束
  103.                         while(dht11 != 0 && count++ < NUMBER){
  104.                                 dht11 = 1;
  105.                         }
  106.                         if(count >= NUMBER){
  107.                                 status = ERROR; //设定错误标志
  108.                                 return 0;
  109.                         }
  110.                 }
  111.         }
  112.         return (value);
  113. }
  114. //读温度和湿度函数,读一次的数据,共五字节,读出成功函数返回OK, 错误返回ERROR
  115. extern unsigned char DHT11_ReadTempAndHumi(void){
  116.         unsigned char i = 0, check_value = 0,count = 0;
  117.         //EA = 0;
  118.         dht11 = 0; //拉低数据线大于18ms 发送开始信号
  119.         Delay_1ms(20); //需大于18 毫秒
  120.         dht11 = 1; //释放数据线,用于检测低电平的应答信号
  121.         //延时20-40us,等待一段时间后检测应答信号,应答信号是从机拉低数据线80us
  122.         DHT11_Delay_10us();
  123.         DHT11_Delay_10us();
  124.         DHT11_Delay_10us();
  125.         DHT11_Delay_10us();
  126.         if(dht11 != 0){                   //检测应答信号,应答信号是低电平
  127.                 //没应答信号
  128.         //        EA = 1;
  129.                 return ERROR;
  130.         }
  131.         else{
  132.                 //有应答信号
  133.                 while(dht11 == 0 && count++ < NUMBER); //等待应答信号结束
  134.                 if(count >= NUMBER){                                   //检测计数器是否超过了设定的范围
  135.                         dht11 = 1;
  136.         //                EA = 1;
  137.                         return ERROR; //读数据出错,退出函数
  138.                 }
  139.                 count = 0;
  140.                 dht11 = 1;//释放数据线
  141.                 //应答信号后会有一个80us 的高电平,等待高电平结束
  142.                 while(dht11 != 0 && count++ < NUMBER);
  143.                 if(count >= NUMBER){
  144.                         dht11 = 1;
  145.         //                EA = 1;
  146.                         return ERROR; //退出函数
  147.                 }
  148.                 //读出湿.温度值
  149.                 for(i = 0; i < SIZE; i++){
  150.                         value_array[i] = DHT11_ReadValue();
  151.                         if(status == ERROR){                                //调用ReadValue()读数据出错会设定status 为ERROR
  152.                                 dht11 = 1;
  153.         //                        EA = 1;
  154.                                 return ERROR;
  155.                         }
  156.                 //读出的最后一个值是校验值不需加上去
  157.                         if(i != SIZE - 1){
  158.                                 //读出的五字节数据中的前四字节数据和等于第五字节数据表示成功
  159.                                 check_value += value_array[i];
  160.                         }
  161.                 }//end for
  162.                         //在没用发生函数调用失败时进行校验
  163.                 if(check_value == value_array[SIZE - 1]){
  164.                         //将温湿度扩大10 倍方便分离出每一位
  165.                         humi_value = value_array[0] * 10;
  166.                         temp_value = value_array[2] * 10;
  167.                         dht11 = 1;
  168.         //                EA = 1;
  169.                         return OK; //正确的读出dht11 输出的数据
  170.                 }
  171.                 else{
  172.                         //校验数据出错
  173.         //                EA = 1;
  174.                         return ERROR;
  175.                 }
  176.         }
  177. }
  178. /*****************************************************************************/
  179. /*****************************************************************************/
  180. /************************************************************************/
复制代码

所有资料51hei提供下载:
1985486dht11.zip (1.83 KB, 下载次数: 145)


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:358458 发表于 2018-6-26 02:24 | 只看该作者
串口读出01010101....
回复

使用道具 举报

板凳
ID:382584 发表于 2018-8-3 15:48 | 只看该作者
学习学习,萌新
回复

使用道具 举报

地板
ID:503018 发表于 2019-5-11 16:01 | 只看该作者
看不懂啊,能详细一点不啊
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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