[技术问答] 有没有驱动DHT21例子的或者DS18B20例子

[复制链接]
 楼主| 幸福小强 发表于 2020-2-17 22:38 | 显示全部楼层 |阅读模式
求分享啊。
wanduzi 发表于 2020-2-21 14:23 | 显示全部楼层
按照51的那种操作时序,然后IO口选择准双向模式就行了。
gaoyang9992006 发表于 2020-2-21 17:06 | 显示全部楼层
  1. //AM2301
  2. #include <REG51.h>
  3. #include<intrins.h>  //包含_nop_()函数定义的头文件
  4. //读传感器 端口位定义,可修改
  5. sbit AM2301_PIN = P2^3;

  6. // 变量定义
  7. unsigned char Sensor_Data[5]={0x00,0x00,0x00,0x00,0x00};
  8. unsigned char Sensor_Check;                  //校验和

  9. unsigned char Sensor_AnswerFlag;  //收到起始标志位
  10. unsigned char Sensor_ErrorFlag;   //读取传感器错误标志
  11. unsigned int  Sys_CNT;

  12. /********************************************\
  13. |* 功能: 延时        晶振为12M时                                    *|
  14. |*  t = 1 为 20us  然后成倍增加10us左右                *|
  15. \********************************************/
  16. void Delay_N10us(unsigned char t)
  17. {
  18.     while(t--)
  19.    {
  20.             _nop_();
  21.    }
  22. }
  23. /********************************************\
  24. |* 功能: 延时        晶振为12M时                                        *|
  25. |* 延时大约 1ms                                                            *|
  26. \********************************************/
  27. void Delay_N1ms(unsigned int t)
  28. {
  29.   unsigned int i;
  30.   unsigned int j;
  31.   for(j=t;j>0;j--)
  32.      for(i=124;i>0;i--);  //延时大约 1ms
  33. }

  34. /********************************************\
  35. |* 功能: 读传感器发送的单个字节                *|
  36. \********************************************/
  37. unsigned char Read_SensorData(void)
  38.   {
  39.         unsigned char i,cnt;
  40.         unsigned char buffer,tmp;
  41.         buffer = 0;
  42.         for(i=0;i<8;i++)
  43.         {
  44.                 cnt=0;
  45.                 while(!AM2301_PIN)        //检测上次低电平是否结束
  46.                 {
  47.                   if(++cnt >= 300)
  48.                    {
  49.                           break;
  50.                    }
  51.                 }
  52.                 //延时Min=26us Max50us 跳过数据"0" 的高电平
  53.                 Delay_N10us(2);         //延时30us   
  54.                
  55.                 //判断传感器发送数据位
  56.                 tmp =0;
  57.                 if(AM2301_PIN)         
  58.                 {
  59.                   tmp = 1;
  60.                 }  
  61.                 cnt =0;
  62.                 while(AM2301_PIN)                //等待高电平 结束
  63.                 {
  64.                            if(++cnt >= 200)
  65.                         {
  66.                           break;
  67.                         }
  68.                 }
  69.                 buffer <<=1;
  70.                 buffer |= tmp;       
  71.         }
  72.         return buffer;
  73.   }

  74. /********************************************\
  75. |* 功能: 读传感器                              *|
  76. \********************************************/
  77. unsigned char Read_Sensor(void)
  78.   {
  79.                 unsigned char i;
  80.                 //主机拉低(Min=800US Max=20Ms)
  81.     AM2301_PIN = 0;
  82.                 Delay_N1ms(2);  //延时2Ms
  83.                 //释放总线 延时(Min=30us Max=50us)
  84.                 AM2301_PIN = 1;        
  85.                 Delay_N10us(1);//延时30us
  86.                 //主机设为输入 判断传感器响应信号
  87.                 AM2301_PIN = 1;
  88.            Sensor_AnswerFlag = 0;  // 传感器响应标志         
  89.                 //判断从机是否有低电平响应信号 如不响应则跳出,响应则向下运行          
  90.                 if(AM2301_PIN ==0)
  91.                 {
  92.                          Sensor_AnswerFlag = 1;//收到起始信号
  93.                          Sys_CNT = 0;
  94.                          //判断从机是否发出 80us 的低电平响应信号是否结束         
  95.                          while((!AM2301_PIN))
  96.                          {
  97.                                          if(++Sys_CNT>300) //防止进入死循环
  98.                                         {
  99.                                          Sensor_ErrorFlag = 1;
  100.                                          return 0;
  101.                                         }
  102.                                 }
  103.                                 Sys_CNT = 0;
  104.                                 //判断从机是否发出 80us 的高电平,如发出则进入数据接收状态
  105.                                 while((AM2301_PIN))
  106.                                 {
  107.                                          if(++Sys_CNT>300) //防止进入死循环
  108.                                  {
  109.                                          Sensor_ErrorFlag = 1;
  110.                                          return 0;
  111.                                  }
  112.                                 }                  
  113.                                 // 数据接收        传感器共发送40位数据
  114.                                 // 即5个字节 高位先送  5个字节分别为湿度高位 湿度低位 温度高位 温度低位 校验和
  115.                                 // 校验和为:湿度高位+湿度低位+温度高位+温度低位
  116.                                 for(i=0;i<5;i++)
  117.                                 {
  118.                                         Sensor_Data[i] = Read_SensorData();
  119.                                 }
  120.                         }
  121.                         else
  122.                         {
  123.                                 Sensor_AnswerFlag = 0;          // 未收到传感器响应       
  124.                         }
  125.           return 1;
  126.   }
xyz549040622 发表于 2020-2-23 11:09 | 显示全部楼层
支持下楼上的分享!
 楼主| 幸福小强 发表于 2020-2-25 21:34 | 显示全部楼层
多谢分享。
598330983 发表于 2020-3-4 21:24 | 显示全部楼层
给;力
zhuomuniao110 发表于 2020-3-7 22:51 | 显示全部楼层
前来学习。
734774645 发表于 2020-3-15 20:37 | 显示全部楼层
学习一下。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

143

主题

1720

帖子

2

粉丝
快速回复 在线客服 返回列表 返回顶部