CC2530的DHT11驱动,可用于协议栈!!!_第1页
CC2530的DHT11驱动,可用于协议栈!!!_第2页
CC2530的DHT11驱动,可用于协议栈!!!_第3页
CC2530的DHT11驱动,可用于协议栈!!!_第4页
CC2530的DHT11驱动,可用于协议栈!!!_第5页
已阅读5页,还剩7页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、共2个文件:DHT11.c和DHT11.hDHT11.c#include "DHT11.h"/* 函数名称: Set_32MHZ* 功能 : 设置系统时钟为32MHZ* 参数列表: 无 * 返回值 : 无*/void Set_32MHZ(void) CLKCONCMD &= 0x40; /系统时钟源为32MHZ晶振; while(CLKCONSTA & 0x40); /等待时钟稳定; CLKCONCMD &= 0x47; /系统主时钟频率:32MHZ;/* dht11.c*/32MHZ us延时函数;#pragma optimize=nonevoid

2、 dht11_delay_us(unsigned int n) n>>=1; while(n-) asm("NOP"); asm("NOP"); asm("NOP"); asm("NOP"); asm("NOP"); asm("NOP"); asm("NOP"); asm("NOP"); asm("NOP"); asm("NOP"); asm("NOP"); asm

3、("NOP"); asm("NOP"); asm("NOP"); asm("NOP"); void delay_ms(uint32_t time) while(time-) dht11_delay_us(1000); unsigned char dht11_read_byte(void) unsigned char r_val = 0; unsigned char t_count = 0; /计时器,防止超时; unsigned char i; for(i = 0 ; i < 8 ; i+) t_count

4、= 0; /低电平50us后开始一个数据位读取; while( !DHT11_PIN ) asm("NOP"); t_count+; if(t_count > 250) /超时; return 100; t_count = 0; dht11_delay_us(32); /高电平2628us表示'0',70us表示'1' if( DHT11_PIN = 1 ) r_val <<= 1; r_val |= 1; else r_val <<= 1; continue; /等待DHT11数据输出结束; while( DH

5、T11_PIN = 1) asm("NOP"); t_count+; if(t_count>250) return 100; return r_val; char dht11_value(unsigned char *temp , unsigned char *humi , unsigned char flag) unsigned char t_count = 0; /计时器; unsigned char h_i = 0 , h_f = 0; unsigned char t_i = 0 , t_f = 0; unsigned char check_sum = 0; D

6、HT11_PIN_OUT(); DHT11_PIN_L(); /输出低电平; /低电平持续时间必须大于18ms; delay_ms(40); /40ms; DHT11_PIN_H(); /主机结束信号; /主机等待20us40us,读取DHT11响应输出; dht11_delay_us(30); DHT11_PIN_IN(); if(DHT11_PIN = 0) /正确的响应输出; while( !DHT11_PIN ) asm("NOP"); t_count+; if(t_count > 250) /超时; return -1; t_count = 0; dht11

7、_delay_us(50); /DHT11给出响应输出后会拉高总线80us; while( DHT11_PIN ); /等待接收; asm("NOP"); t_count+; if(t_count > 250) /超时; return -1; h_i = dht11_read_byte(); /湿度整数部分; h_f = dht11_read_byte(); /湿度小数部分; t_i = dht11_read_byte(); /温度整数部分; t_f = dht11_read_byte(); /温度小数部分; check_sum = dht11_read_byte()

8、; /校验和; /校验和正确或者温湿度整数部分获取正确即表示获取成功! if(check_sum = ( h_i + h_f + t_i + t_f ) | (h_i != 100 && t_i != 100) ) if(flag = DHT11_STRING) temp0 = t_i/10+0x30; temp1 = t_i%10+0x30; humi0 = h_i/10+0x30; humi1 = h_i%10+0x30; else *temp = t_i; *humi = h_i; else if(flag = DHT11_STRING) temp0 = '0&#

9、39; temp1 = '0' humi0 = '0' humi1 = '0' else *temp = 0; *humi = 0; return -1; else if(flag = DHT11_STRING) temp0 = '0' temp1 = '0' humi0 = '0' humi1 = '0' else *temp = 0; *humi = 0; return -1; return 0;DHT11.h#ifndef _DHT11_H#define _DHT11_H#in

10、clude <iocc2530.h>#include "zComDef.h"#define DHT11_PIN P0_7 /数据引脚/引脚配置为输出;#define DHT11_PIN_OUT() P0DIR |= 1<<7; asm("NOP"); /引脚配置为输入;#define DHT11_PIN_IN() P0DIR &= (1<<7); asm("NOP"); /拉高数据线;#define DHT11_PIN_H() DHT11_PIN = 1; asm("NOP&quo

11、t;); /拉低数据线;#define DHT11_PIN_L() DHT11_PIN = 0; asm("NOP"); void Set_32MHZ(void);/* 32MHZ us延时函数;*/void dht11_delay_us(unsigned int n);void delay_ms(uint32_t time);/* 读DHT11传感器; 读取成功返回读取值,失败返回100(超过DHT11范围);*/unsigned char dht11_read_byte(void);/* 获取温湿度数值;读取成功返回0,失败返回-1 第一个参数为温度,第二个参数为湿度,第三个参数为类型(DHT11_STRING or DHT11_UINT8)用法举例:例一:unsigned char temp , humi;char r_val;r_val = dht11_value(&temp , &humi , DHT11_UINT8);例二:unsigned char temp2,humi2;char r_va

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论