三木社区

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 415|回复: 0
打印 上一主题 下一主题

platform\sm14z2538\dev\dht11-arch.c

[复制链接]

1657

主题

1684

帖子

5684

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
5684
跳转到指定楼层
楼主
发表于 2017-6-13 10:07:45 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
文件名称:dht11-arch.c
文件路径:contiki-3.0\platform\sm14z2538\dev
源码分析:
1.头文件引用
  1. #include "dev/gpio.h"
  2. #include "clock.h"
复制代码
2.硬件接口定义
  1. #define DHT11_DATA_PORT   GPIO_B_BASE
  2. #define DHT11_DATA_BIT    (1 << 1)
  3. #define DHT11_DATA        DHT11_DATA_PORT, DHT11_DATA_BIT  
复制代码
3.声明延时函数
  1. void Delay_us(void);
  2. void Delay_ms(unsigned int Time);
复制代码
4.声明温湿度采集函数
  1. void Start_DHT11(void);
复制代码
5.声明温湿度传感器初始化函数
  1. void DHT11_Inint(void);
复制代码
6.变量定义
  1. unsigned char DHT11_FLAG,DHT11_temp;
  2. unsigned char Hum_dec,Hum_uni,Tem_dec,Tem_uni=4;
  3. unsigned char Tem_data_H,Tem_data_L,RH_data_H,RH_data_L,DHT11_checkdata;
  4. unsigned char Tem_data_H_temp,Tem_data_L_temp,RH_data_H_temp,RH_data_L_temp,DHT11_checkdata_temp;
  5. unsigned char DHT11_comdata;
复制代码
7.设置io输出高电平
  1. static void
  2. gpio_set(int port, int bit)
  3. {
  4.   REG((port | GPIO_DATA) + (bit << 2)) = bit;
  5. }
复制代码
8.设置io输出低电平
  1. static void
  2. gpio_reset(int port, int bit)
  3. {
  4.   REG((port | GPIO_DATA) + (bit << 2)) = 0;
  5. }
复制代码
9.读取io状态
  1. static int
  2. gpio_get(int port, int bit)
  3. {
  4.   return REG((port | GPIO_DATA) + (bit << 2));
  5. }
复制代码
10.微秒延时函数
  1. static void
  2. Delay_us_dht11(unsigned char DELAY)
  3. {
  4.     clock_delay_usec(DELAY);
  5. }
复制代码
11.毫秒延时函数
  1. void Delay_ms_dht11(unsigned int Time)//n msÑÓʱ
  2. {
  3.   unsigned char i;
  4.   while(Time--)
  5.   {
  6.     for(i=0;i<100;i++)
  7.      Delay_us_dht11(10);
  8.   }
  9. }
复制代码
12.开始采集温度和湿度
  1. void Start_DHT11(void)
  2. {     
  3.     unsigned char i;         
  4.     for(i=0;i<8;i++)   
  5.     {
  6.         DHT11_FLAG=2;
  7.         while((!gpio_get(DHT11_DATA))&&DHT11_FLAG++);
  8.         Delay_us_dht11(30);
  9. //        Delay_us_dht11(10);
  10. //        Delay_us_dht11(10);
  11.         DHT11_temp=0;
  12.         if(gpio_get(DHT11_DATA))DHT11_temp=1;
  13.         DHT11_FLAG=2;
  14.         while((gpio_get(DHT11_DATA))&&DHT11_FLAG++);   
  15.         if(DHT11_FLAG==1)break;   
  16.         DHT11_comdata<<=1;
  17.         DHT11_comdata|=DHT11_temp;
  18.     }   
  19. }
复制代码
13.温度传感器初始化
  1. void DHT11_Inint(void)   
  2. {
  3.     gpio_reset(DHT11_DATA);
  4.     Delay_ms_dht11(30);  //>18MS
  5.     gpio_set(DHT11_DATA);
  6.     GPIO_SET_INPUT(DHT11_DATA_PORT,DHT11_DATA_BIT);//INPUT
  7.     Delay_us_dht11(35);
  8.     if(!gpio_get(DHT11_DATA))
  9.     {
  10.         DHT11_FLAG=2;
  11.         while((!gpio_get(DHT11_DATA))&&DHT11_FLAG++);
  12.         DHT11_FLAG=2;
  13.         while((gpio_get(DHT11_DATA))&&DHT11_FLAG++);
  14.         Start_DHT11();
  15.         Delay_us_dht11(10);
  16.         RH_data_H_temp=DHT11_comdata;
  17.         Start_DHT11();
  18.         Delay_us_dht11(10);
  19.         RH_data_L_temp=DHT11_comdata;
  20.         Start_DHT11();
  21.         Delay_us_dht11(10);
  22.         Tem_data_H_temp=DHT11_comdata;
  23.         Start_DHT11();
  24.         Delay_us_dht11(10);
  25.         Tem_data_L_temp=DHT11_comdata;
  26.         Start_DHT11();
  27.         Delay_us_dht11(10);
  28.         DHT11_checkdata_temp=DHT11_comdata;
  29.         gpio_set(DHT11_DATA);
  30.         Delay_us_dht11(30);
  31.         DHT11_temp=(Tem_data_H_temp+Tem_data_L_temp+RH_data_H_temp+RH_data_L_temp);
  32.         if(DHT11_temp==DHT11_checkdata_temp)
  33.         {
  34.             RH_data_H=RH_data_H_temp;
  35.             RH_data_L=RH_data_L_temp;
  36.             Tem_data_H=Tem_data_H_temp;
  37.             Tem_data_L=Tem_data_L_temp;
  38.             DHT11_checkdata=DHT11_checkdata_temp;
  39.         }
  40.         Tem_dec=Tem_data_H/10;
  41.         Tem_uni=Tem_data_H%10;
  42.         
  43.         Hum_dec=RH_data_H/10;
  44.         Hum_uni=RH_data_H%10;        
  45.     }
  46.     else //
  47.     {
  48.         Tem_dec=0;
  49.         Tem_uni=0;
  50.         
  51.         Hum_dec=0;
  52.         Hum_uni=0;  
  53.     }
  54.    
  55.     GPIO_SET_OUTPUT(DHT11_DATA_PORT,DHT11_DATA_BIT); //OUTPUT
  56.     Delay_us_dht11(30);
  57. }
复制代码


回复

使用道具 举报

Archiver|手机版|小黑屋|三木电子社区 ( 辽ICP备11000133号-4 )

辽公网安备 21021702000620号

GMT+8, 2026-3-13 00:06 , Processed in 0.027839 second(s), 22 queries .

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

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