驱动:dht11驱动程序

news2024/9/20 11:31:36

DHT11读写时序详解(时序+上板实测)_mcu 读取thd11 接收数据开始-CSDN博客文章浏览阅读733次,点赞20次,收藏21次。DHT11有两种,一种三线制,一种四线制。其中都包括1个VDD,1个GND,和1个DATA串行数据引脚。不同的是四线制其中一个引脚悬空。_mcu 读取thd11 接收数据开始https://blog.csdn.net/weixin_53042232/article/details/141131210?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522E8679AEF-F11D-47FF-B55F-38AC4ADAF96A%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fblog.%2522%257D&request_id=E8679AEF-F11D-47FF-B55F-38AC4ADAF96A&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~blog~first_rank_ecpm_v1~rank_v31_ecpm-1-141131210-null-null.nonecase&utm_term=DHT11%E8%AF%BB%E5%86%99%E6%97%B6%E5%BA%8F%E8%AF%A6%E8%A7%A3%EF%BC%88%E6%97%B6%E5%BA%8F%2B%E4%B8%8A%E6%9D%BF%E5%AE%9E%E6%B5%8B%EF%BC%89&spm=1018.2226.3001.4450

内核: vi drivers/char/dht11.c 

#include <linux/init.h>
#include <linux/kernel.h>
#include <linux/fs.h>
#include <linux/module.h>
#include <asm/io.h>
#include <asm/string.h>
#include <asm/uaccess.h>
#include <linux/miscdevice.h>
#include <asm-generic/errno-base.h>
#include <mach/gpio-nrs.h>
#include <mach/gpio.h>
#include <linux/delay.h>

#define DEV_NAME "dht11"
#define PIN_DHT11 S3C2410_GPF(6)

static void pin_init(void)
{
	gpio_request(PIN_DHT11, "dht11");
}

static void dht11_start(void)
{
	gpio_direction_output(PIN_DHT11, 0);
	mdelay(20);
	gpio_set_value(PIN_DHT11, 1);
	udelay(30);
	gpio_direction_input(PIN_DHT11);
}

static int dht11_wait_repon(void)
{
	int time = 100;
	while(gpio_get_value(PIN_DHT11))   // wait H end
	{
		udelay(1);
		if(!time--)
			return -1;
	}

	time = 100;
	while(!gpio_get_value(PIN_DHT11) && time)  // wait 80us L end
	{
		udelay(1);
		if(!time--)
			return -2;
	}

	time = 100;
	while(gpio_get_value(PIN_DHT11))   // wait 80us H end
	{
		udelay(1);
		if(!time--)
			return -3;
	}

	return 0;
}

static int dht11_get_bit(void)
{
	int time = 100;
	while(!gpio_get_value(PIN_DHT11))  // wait 50us L end
	{
		udelay(1);	
		if(!time--)
			return -1;
	}

	udelay(30);

	if(0 == gpio_get_value(PIN_DHT11))
		return 0;

	while(gpio_get_value(PIN_DHT11))   // wait 40us H end
	{
		udelay(1);	
		if(!time--)
			return -2;
	}

	return 1;
}

static int dht11_get_value(unsigned char * data)
{
	int i = 0;
	int j = 0;
	unsigned char sum = 0;
	for(i = 0; i < 5; i++)
	{
		data[i] = 0;
		for(j = 0; j < 8; j++)
		{
			char bit = dht11_get_bit();	
			if(bit < 0)
				return bit;
			data[i] <<= 1;
			data[i] |= bit;
		}
	}

	for(i = 0; i < 4; i++)
	{
		sum += data[i];
	}

	if(sum == data[4])
		return 4;
	else
		return -1;
}

static int open (struct inode * inode, struct file * file)
{
	pin_init();
	printk("dht11 open ...\n");
	return 0;
}

static ssize_t read (struct file * file, char __user * buf, size_t len, loff_t * offset)
{
	unsigned char data[4] = {0};
	int ret = 0;
	dht11_start();
	ret = dht11_wait_repon();
	if(ret < 0)
		goto err_wait;

	ret = dht11_get_value(data);
	if(ret < 0)
		goto err;

	copy_to_user(buf, &data, sizeof(data));

	printk("dht11 read ...\n");
	return sizeof(data);

err_wait:
	printk("dht11_wait_repon err ... \n");
	return ret;

err:
	printk("dht11_get_value err ...\n");
	return ret;
}

static ssize_t write (struct file * file, const char __user * buf, size_t len, loff_t * offset)
{
	return 0;
}

static int close (struct inode * inode, struct file * file)
{
	printk("dht11 close ...\n");
	return 0;
}

static struct file_operations fops = 
{
	.owner = THIS_MODULE,
	.open = open,
	.read = read,
	.write = write,
	.release = close
};

static struct miscdevice misc = 
{
	.minor = MISC_DYNAMIC_MINOR,
	.name = DEV_NAME,
	.fops = &fops
};

static int __init dht11_init(void)
{
	int ret = misc_register(&misc);
	if(ret < 0)
		goto err_misc_register;

	printk("dht11_init  ...\n");
	return ret;

err_misc_register:
	misc_deregister(&misc);
	printk("dht11 misc_register faidht11\n");	
	return ret;
}

static void __exit dht11_exit(void)
{
	misc_deregister(&misc);
	printk("dht11_exit  ###############################\n");
}

module_init(dht11_init);
module_exit(dht11_exit);
MODULE_LICENSE("GPL");

应用层:~/nfs/rootfs$ vi dht11_app.c

#include <stdio.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <fcntl.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>

int main(int argc, const char *argv[])
{
	int fd = open("/dev/dht11",O_RDWR);
	if(fd < 0 )
	{
		perror("open dht11");
		return -1;
	}
	while(1)
	{
		unsigned char data[4] = {0};
		int ret = read(fd,data,sizeof(data));
		printf("ret = %d\n",ret);
		int i = 0;
		for(i = 0; i < 4; ++i)
		{
			printf("%x\t",data[i]);
		}
		printf("\n");
		sleep(2);
	}
	close(fd);
	return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2083171.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

常见几种简单的深度学习算法在生物医学数据领域的特点和不足

本团队提供生物医学领域专业的AI&#xff08;机器学习、深度学习&#xff09;技术支持服务。如果您有需求&#xff0c;请扫描文末二维码关注我们。 通过表格的形式&#xff0c;总结了常见几种简单的深度学习算法在生物医学数据领域的特点和不足&#xff08;仅个人理解&#xff…

HarmonyOS NEXT 实战开发:实现日常提醒应用

为什么要开发这个日常提醒应用&#xff1f; 最近鸿蒙热度一直不减&#xff0c;而且前端的就业环境越来越差&#xff0c;所以心里面萌生了换一个赛道的想法。HarmonyOS NEXT 是华为打造的国产之光&#xff0c;而且是纯血版不再是套壳&#xff0c;更加激起了我的好奇心。ArkTS是…

【网络安全】分析cookie实现PII IDOR

未经许可,不得转载。 文章目录 正文正文 目标:公共电子商务类型的网站,每月有大约6万到10万访问者,注册用户大约有5万。 存在一个查询个人资料的端点/GetProfiledetails,以下是完整的请求和响应: 我发现,cookie非常类似于base64编码后的结果,于是我将其进行base64解码…

WEB开发---使用HTML CSS开发网页实时显示当前日期和时间

自己刚开始学习html css知识&#xff0c;临时做个网页&#xff0c;实时显示当前日期和时间功能。 代码如下&#xff1a; test.html <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport&q…

C#利用ffmpeg借助NVIDIA GPU实现实时RTSP硬解码+硬编码录制MP4

目录 说明 效果 项目 代码 下载 说明 利用周杰的开源项目 Sdcb.FFmpeg 项目地址&#xff1a;https://github.com/sdcb/Sdcb.FFmpeg/ 代码实现参考&#xff1a;https://github.com/sdcb/ffmpeg-muxing-video-demo 效果 C#利用ffmpeg借助NVIDIA GPU实现实时RTSP硬解码硬…

004-OpenFeign服务接口调用

文章目录 1 简介2 OpenFeign 通用步骤2.1 建module2.2 改POM2.3 写YML2.3 主启动类2.4 cloud-api-commons模块修改2.4.1 按照架构说明进行编码准备2.4.2 引入openfeign依赖2.4.3 新建服务接口PayFeignApi 2.5 编写controller2.6 测试2.7 总结 3 OpenFeign高级特性3.1 注意3.2 O…

QGC 修改为双路视频介绍

文章目录 一、效果图二、简要流程关于QGC地面站其它文章请点击这里: QGC地面站 一、效果图 右下角切换视频通道; 左下角切换地图与当前的视频 二、简要流程 ● C++ 后端 C++ 中利用 QGC 原有的红外热成像视频流,修改几处即可 // src\VideoManager\VideoManager.cc Vi…

快排找基准值之挖坑法

思路&#xff1a;把数组里第一个数据拿出来记为标准值&#xff0c;然后两边交替&#xff0c;从右往左找比基准值小的数据放到前面缺数据的坑里。放完后该位置也缺数据成为了新的坑&#xff0c;再把坑的下标移到新的位置。 从左到右找比基准值大的数据&#xff0c;后面同理。 …

装饰器(Decorators)的实现

1、Python 中的函数可以像普通变量一样当做参数传递给另外一个函数&#xff1b; 2、装饰器&#xff1a;不修改函数源码但是要实现给函数添加额外功能。python使用语法糖即来实现装饰器。 3、装饰器的作用&#xff1a; &#xff08;1&#xff09;抽离出大量函数中与函数功能本…

Spring框架 基础介绍

目录 Spring框架 IOC: AOP: 一站式&#xff1a; spring搭建 Maven 导入 spring 核心基础 jar 编写 spring 配置文件 编写一个 User 实体类 测试 spring IOC(控制反转) 依赖注入&#xff1a; 1、通过属性注入 2、通过构造方法注入 spring中bean管理 1、基于xml配置方…

AI模型:追求全能还是专精?

AI模型&#xff1a;追求全能还是专精&#xff1f; 近日&#xff0c;OpenAI预计在秋季推出代号为“草莓”的新AI。从专注于数学问题到处理主观营销策略&#xff0c;"草莓"模型展现出惊人的多样性。而这种全能型 AI 是否代表了未来趋势&#xff1f;相比专攻于某一领域…

I get HttpClient.Timeout Error in C# OpenAI library

题意&#xff1a;“我在 C# OpenAI 库中遇到 HttpClient.Timeout 错误。” 问题背景&#xff1a; I am using the OpenAI library in my c# project, but I get the following error if it does not receive a response for more than 100 seconds. I cannot add a custom htt…

宠物空气净化器应该怎么选择?希喂、IAM、有哈哪款性价比高

在当今社会&#xff0c;养宠已然渐渐成为现在年轻人生活中的一种标配。可爱的宠物们以它们的忠诚、活泼与温暖&#xff0c;给予像我们这类年轻人无尽的陪伴。这种陪伴在时光的消逝中渐渐升华&#xff0c;成为年轻人心灵的慰藉和生活中不可或缺的一部分。然而&#xff0c;在享受…

【软件测试】软件测试生命周期与Bug

目录 &#x1f4d5; 前言 &#x1f334;软件测试的生命周期 ​编辑&#x1f332;BUG &#x1f6a9; 概念 &#x1f6a9;描述bug的要素 &#x1f6a9;bug的级别 &#x1f6a9;bug的生命周期 &#x1f3c0;先检查自身&#xff0c;是否bug描述不清楚 &#x1f3c0;站在用…

JavaScript学习文档(9):事件流、事件委托、其他事件、元素尺寸与位置

目录 一、事件流 1、事件流的两个阶段 2、事件捕获 3、事件冒泡 4、阻止冒泡 5、解绑事件 &#xff08;1&#xff09;解绑事件 &#xff08;2&#xff09;鼠标经过事件区别 二、事件委托 1、优点 2、原理 3、实现 4、tab栏切换案例改造 三、其他事件 1、页面加载…

不可不知的HDMI之前世今生

1、HDMI的产生 2002年4月&#xff0c;来自电子电器行业的7家公司——日立、松下、飞利浦、SiliconImage、索尼、汤姆逊、东芝&#xff0c;共同组建了HDMI接口组织——HDMIFounders&#xff08;HDMI论坛&#xff09;&#xff0c;开始着手制定一种符合高清时代标准的全新数字化视…

nginx转发接口地址【非常实用】

使用场景 由于客户的需求是要访问一个外网接口 比如http://58.20.57.190:6652 实例 http://58.20.57.190:6652//uploadBasePatient?Barcode1000000073&customerCode1 比如外网才能访问&#xff0c;科室电脑是访问不了外网的 我们就需要中间在一个既有外网又有内网的前置…

数据结构(邓俊辉)学习笔记】串 09——BM_BC算法:以终为始

文章目录 1. 不对称性2. 善待教训3.前轻后重4.以终为始 1. 不对称性 上一节所介绍的 KMP 算法计算时间&#xff0c;在最坏情况下也可以保证不超过线性。这的确是一个好消息。然而&#xff0c;倘若我们因此就停下继续优化的脚步&#xff0c;那就大错特错了。 实际上&#xff0c…

如何在Java爬虫中设置代理IP:详解与技巧

在进行网络爬虫时&#xff0c;使用代理IP可以有效地避免被目标网站封禁&#xff0c;提升数据抓取的成功率。本文将详细介绍如何在Java爬虫中设置代理IP&#xff0c;并提供一些实用的技巧和示例代码。 为什么需要代理IP&#xff1f; 在进行爬虫操作时&#xff0c;频繁的请求可能…

深度学习基础—彩色图片的卷积运算

深度学习基础—卷积运算http://t.csdnimg.cn/2mRei 上篇文章卷积运算实际是灰度图像的运算&#xff08;2维空间&#xff09;&#xff0c;但是实际中我们彩色图片使用的更多&#xff0c;和灰度图像不同的是&#xff1a;彩色图片是由三原色&#xff08;红、绿、蓝&#xff09;组成…