• 大小: 2KB
    文件类型: .rar
    金币: 1
    下载: 0 次
    发布日期: 2021-05-20
  • 语言: C/C++
  • 标签: dht11  ok6410  嵌入式  

资源简介

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


评论

共有 条评论