资源简介
C语言,基于飞凌OK6410开发板的DHT11驱动,内有详细注释
代码片段和文件信息
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define GPC_7 S3C64XX_GPC(7)
static volatile unsigned char values[4]={0000};
static struct class * dhtdrv_class;
static struct device * dht11_drv_device;
volatile unsigned long *gpccon = NULL;
volatile unsigned long *gpcdat = NULL;
int major;
static int dht11_drv_open(struct inode *inodestruct file * file)
{
/*设置GPC7为输出引脚*/
*gpccon &= ~( 0xf << (4*7));
/*GPC7输出高电平*/
*gpcdat |= (1<<7);
return 0;
}
static char dht11_drv_read_byte ( void )
{
char dht11_byte ;
unsigned char i ;
unsigned char temp ;
dht11_byte = 0 ;
/*接收数据,并利用|和&存储到dht11_byte*/
for ( i = 0 ; i < 8 ; i ++ )
{
temp = 0 ;
/*50us传输间隔时间*/
while ( ! (gpio_get_value ( GPC_7 ) ) )
{
temp ++ ;
if ( temp > 12 )
return 1 ;
udelay ( 5 ) ;
}
temp = 0 ;
/*根据接收到高电平持续的时长判断数据是0还是1*/
while ( gpio_get_value ( GPC_7 ) )
{
temp ++ ;
if ( temp > 20 )
return 1 ;
udelay ( 5 ) ;
}
/*大于6的话,也就是大于35us,数据为1,否则数据为0*/
if ( temp > 6 )
{
dht11_byte <<= 1 ;
dht11_byte |= 1 ;
}
else
{
dht11_byte <<= 1 ;
dht11_byte |= 0 ;
}
}
return dht11_byte ;
}
static ssize_t dht11_drv_read ( struct file* filp char __user* buf size_t count loff_t* f_pos )
{
unsigned char DataTemp;
unsigned char i;
unsigned char err;
char tempBuf[5];
err = 0 ;
/*设置GPC7为输出引脚*/
*gpccon &= ~( 0xf << ( 4*7) );
*gpccon |= ( 0x1 << (4*7));
/*GPC7输出低电平*/
*gpcdat &= ~( 1<<7 );
/*
等同于
s3c_gpio_cfgpin ( GPC_7 S3C_GPIO_OUTPUT );
gpio_set_value ( GPC_7 0 );
*/
/*延时18毫秒,用于DHT11从待机状态进入工作状态*/
msleep ( 18 );//msleep()休眠延时函数,并不精确,实际延时时间会大于设置值
/*GPC7输出高电平*/
*gpcdat |= ( 1<<7 );
//gpio_set_value ( GPC_7 1 );
udelay ( 40 ); //udelay()忙等待函数延迟过程中无法运行其他任务.这个延迟的时间是准确但是浪费CPU,不适用鱼长时间延时。
/*设置GPC7为输入引脚*/
*gpccon &= ~( 0xf << ( 4*7 ));
/*
等同于
s3c_gpio_cfgpin ( GPC_7 S3C_GPIO_INPUT );
*/
/*
这时候DHT会发出80us的低电平信号,利用while等待信号结束。
下面这个函数在此间拔出 DHT11的话,将会进入死循环,
所以需要添加一个判断。
while ( !( gpio_get_value ( GPC_7 ) ) )
;
*/
while ( !( gpio_get_value ( GPC_7 ) ) && DataTemp )
{
DataTemp --;
udelay ( 10 );
}
if ( !DataTemp )
{
err = 1;
count = -EFAULT;
}
/*
同上,消掉80us的高电平信号。
while ( ( gpio_get_value ( GPC_7 ) ) )
;
*/
if ( !err )
{
DataTemp = 10 ;
while ( ( gpio_get_value ( GPC_7 ) ) && DataTemp )
{
DataTemp --;
udelay ( 10 );
}
if ( !DataTemp )
{
err = 1;
count = -EFAULT;
}
}
if( !err )
{
/*利用数组接收数据
分别是:
8bit湿度整数数据
8bit湿度小数数据
8bi温度整数数据
8bit温度小数数据
8bit校验和
*/
for ( i = 0; i < 5
属性 大小 日期 时间 名称
----------- --------- ---------- ----- ----
文件 162 2014-12-21 10:25 Makefile
文件 609 2014-12-21 10:25 open.c
文件 4622 2014-12-21 10:25 dht11_ok6410.c
----------- --------- ---------- ----- ----
5393 3
相关资源
- C语言编程规范个人规约
- 《嵌入式Linux上的C语言编程实践》
- 嵌入式收费课程视频申嵌
- 尚观教育李慧芹Linux下C语言前嵌入式
- dht11.h库文件
- C语言编写的状态机源代码,包括四种
- 嵌入式用c++实现的红绿灯系统
- libstdc++.so.6.0.28
- SHA256 摘要算法 、HMAC_SHA256 散列/哈希
- Qt4 图形设计与嵌入式开发 源代码
- linux内核驱动之DHT11
- 单片机开发
- 单片机最小系统(附原理图和PCB).
- 2017年电赛瑞萨芯片RX23T原理图.SchDoc
- LCD12864显示屏使用手册和(串行方式、
- 蓝牙四轴虚拟摇杆,油门控制
- INA226电流检测的代码
- 空气报警器源码
- DSP28335通过SPI读写SD卡例程
- 毕业设计(论文):无线充电器的设
- 智能车嵌入式开发(AD128.rar)
- 嵌入式开发ov2460摄像机检测
- OSEKVCX汽车电子嵌入式软件编程技术
- 基于Aurix的AUTOSAR多核操作系统的实现
- PCL测试程序
- 嵌入式硬件设计 第2版
- DHT11温湿度传感器51单片机在LCD1602.d
- 基于嵌入式的智能防近视台灯系统
- DHT11温湿度传感器
- 《嵌入式实时操作系统uCOS-II》邵贝贝
评论
共有 条评论