当前位置: 首页 > news >正文

驱动-----dht11温湿度传感器

单总线:只用一根线。

复位信号:设置为输出模式,低电平20ms,然后再拉高30us。然后设置为输入模式,dht11会先拉低80us,然后拉高80us表示对接成功

数据0:开始先拉低50us,然后拉高26~28us表示0

数据1:开始拉低50us,然后拉高70us表示1

每传输一位的数据都要间隔一个拉低50us

梳理一下时序:

应用程序:

#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 dht11_start(void)
{gpio_request(PIN_DHT11, "pin_dht11");gpio_direction_output(PIN_DHT11, 1);msleep(40);gpio_set_value(PIN_DHT11, 0);mdelay(18);gpio_set_value(PIN_DHT11, 1);udelay(30);gpio_direction_input(PIN_DHT11);
}static int dht11_wait_respon(void)
{int time = 100;while((time > 0) && gpio_get_value(PIN_DHT11)){udelay(1);time--;}if(time <= 0){printk("dht11_wait_respon   1\n");return -1;}time = 100;while((time > 0) && (!gpio_get_value(PIN_DHT11))){udelay(1);time--;}if(time <= 0){printk("dht11_wait_respon   2\n");return -1;}time = 100;while((time > 0) && gpio_get_value(PIN_DHT11)){udelay(1);time--;}if(time <= 0){printk("dht11_wait_respon   3\n");return -1;}return 0;
}static int get_bit(void)
{int time = 100;while((time > 0) && (!gpio_get_value(PIN_DHT11))){udelay(1);time--;}if(time <= 0){printk("get_bit   1\n");return -1;}udelay(30);if(0 == gpio_get_value(PIN_DHT11))return 0;time = 100;while((time > 0) && gpio_get_value(PIN_DHT11)){udelay(1);time--;}if(time <= 0){printk("get_bit   2\n");return -1;}return 1;
}static int dht11_get_data(unsigned char * data)
{int i = 0;int j = 0;for(j = 0; j < 5; j++){for(i = 0; i < 8; i++){char tmp = 0;data[j] <<= 1;tmp = get_bit();	if(tmp < 0)return -1;data[j] |= tmp;}}return 0;
}static int open (struct inode * inode, struct file * file)
{printk("dht11 open ...\n");return 0;
}static ssize_t read (struct file * file, char __user * buf, size_t len, loff_t * offset)
{int ret = 0;unsigned char data[5] = {0};dht11_start();ret = dht11_wait_respon();if(ret < 0)return -1;ret = dht11_get_data(data);if(ret < 0)return -1;copy_to_user(buf, data, sizeof(data));printk("dht11 read ...\n");return 0;
}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");

http://www.lryc.cn/news/478322.html

相关文章:

  • Docker 基础命令简介
  • 嵌入式开发之静态库和共享库
  • 关于npm源的切换及相关操作
  • vue前端sku实现
  • 使用Vue3和Vue2进行开发的区别
  • 爬虫入门urllib 和 request(二)
  • 【大数据学习 | HBASE】hbase的整体架构
  • 群控系统服务端开发模式-应用开发-个人资料
  • openssl生成加密,公钥实现非对称加密
  • [CKS] K8S Admission Set Up
  • 前端学习Day13 CSS盒子的定位(固定定位篇“附练习”)
  • Tomcat 启动卡住,日志显示 At least one JAR was scanned for TLDs yet contained no TLDs.
  • 计算机网络:网络层 —— 移动 IP 技术
  • useCrudSchemas
  • SpringBoot3集成Junit5
  • 【EMNLP2024】阿里云人工智能平台 PAI 多篇论文入选 EMNLP2024
  • Spark的Shuffle过程
  • Java+Swing可视化图像处理软件
  • RDD转换算子:【mapValues、mapPartitions】
  • 数组和指针的复杂关系
  • Linux系统I/O调优实例
  • 记录Ubuntu OS的异常
  • Vue 3 单元测试与E2E测试
  • 猫用空气净化器哪个牌子好?求除毛好、噪音小的宠物空气净化器!
  • 第十九课 Vue组件中的方法
  • 【JavaScript】V8,Nodejs 与浏览器
  • 内存马浅析
  • 聊一聊Elasticsearch的基本原理与形成机制
  • 应急救援无人车:用科技守护安全!
  • 详解Java之Spring MVC篇二