DHT11温度传感器的驱动程序(gec6818开发板 a53内核)

1. dht11的驱动程序 文件名:temp_drv.c

//头文件来源于linux内核源码
#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/cdev.h>
#include <linux/fs.h>
#include <linux/errno.h>
#include <linux/uaccess.h>
#include <linux/device.h>
#include <linux/io.h>
#include <linux/gpio.h>		//函数声明
#include "cfg_type.h" 	 	//端口宏定义
#include <linux/ioport.h>	//IO相关
#include <linux/delay.h> 	//延时函数
#include <linux/time.h>

//1.定义一个字符设备
static struct cdev dht11_cdev;
static unsigned int dht11_major = 0; //主设备号;0--动态;>0--静态
static unsigned int dht11_minor = 0; //次设备号
static dev_t dht11_dev_num; 		   //设备号
static struct class *dht11_class;
static struct device *dht11_device;

#define DHT_DATA (PAD_GPIO_D+19)
#define GEC6818_GET_DHTDATA  _IOR('K', 0, unsigned int) //注册宏

static int gec6818_dht11_open(struct inode *inode, struct file *filp)
{
	gpio_set_value(DHT_DATA, 1);
	printk("dht11 driver is openning\n");	//应用程序打开驱动文件时打印
	return 0;
}

static int gec6818_dht11_release(struct inode *inode, struct file *filp)
{
	gpio_set_value(DHT_DATA, 1);
	printk("dht11 driver is closing\n");//应用程序关闭驱动文件时打印
	return 0;
}
static unsigned char get_byte(void)
{
	int i=0, k=0;
	int ret_data = 0;

	for(k=0; k<8; k++)
	{
		i=0;//复位计数值
		while(!gpio_get_value(DHT_DATA))//等待总线拉高跳出
		{
			i++;
			udelay(1);
			if(i > 120)
			{
				printk("DTH11  high timeout error\n");
				break;
			}
		}

		udelay(22);
		ret_data <<= 1;//逐渐将数据移到最高位
		if(gpio_get_value(DHT_DATA))
			ret_data |= 0x01;//接收最高位放在第
  • 1
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 7
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值