版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
P.PAGE1实验名称:姓名:学号:P.PAGE1装订线装订线专业:测控技术与仪器姓名:颜睿专业:测控技术与仪器姓名:颜睿学号:3130103850日期:2018.4.28地点:创客空间课程名称:嵌入式系统设计指导老师:马永昌成绩:________________实验名称:综合实验一dht11和人体感应传感器实验类型:验证型同组学生姓名:孙凡原一、实验目的和要求(必填) 二、实验内容和原理(必填)三、主要仪器设备(必填) 四、操作方法和实验步骤五、实验数据记录和处理 六、实验结果与分析(必填)七、讨论、心得一、实验目的和要求1.掌握字符设备驱动程序的基本结构和开发方法2.掌握用户空间调用设备驱动的方法3.掌握用户和内核的交互二、实验内容和原理1.编写温湿度传感器DHT11驱动,传输打印温湿度信息2.编写人体感应传感器驱动,控制LED灯亮灭原理:温湿度传感器DHT11:1.引脚图实际使用传感器没有NC引脚2.数据采集a.数据总时序用户主机发送一次开始信号后,DHT11从低功耗模式转换到高速模式,待主机开始信号结束后,DHT11发送响应信号,送出40bit的数据,幵触发一次信采集。b.主机发送起始信号连接DHT11的DATA引脚的I/O口输出低电平,且低电平保持时间不能小于18ms,然后等待DHT11作出应答信号。c.检测从机应答信号DHT11的DATA引脚检测到外部信号有低电平时,等待外部信号低电平结束,延迟后DHT11的DATA引脚处于输出状态,输出80微秒的低电平作为应答信号,紧接着输出80微秒的高电平通知外设准备接收数据。d.接收数据(1)数据判定规则
位数据“0”的格式为:50微秒的低电平和26-28微秒的高电平,位数据“1”的格式为:50微秒的低电平加70微秒的高电平。接收数据时可以先等待低电平过去,即等待数据线拉高,再延时60us,因为60us大于28us且小于70us,再检测此时数据线是否为高,如果为高,则数据判定为1,否则为0。
if(err)
{
printk(KERN_ERR"[%s%d]:Requestbuttongpiofailed\n",__func__,__LINE__);
return-EFAULT;
}
err=gpio_request_one(config.led_num,GPIOF_OUT_INIT_LOW,"LEDlight");
if(err)
{
printk(KERN_ERR"[%s%d]:Requestledgpiofailed\n",__func__,__LINE__);
gpio_free(config.button_num);
return-EFAULT;
}
err=gpio_request_one(config.out_num,GPIOF_IN,"LightButton");
if(err)
{
printk(KERN_ERR"[%s%d]:Requestbuttongpiofailed\n",__func__,__LINE__);
gpio_free(config.button_num);
gpio_free(config.led_num);
return-EFAULT;
}
err=gpio_request_one(config.led1_num,GPIOF_OUT_INIT_LOW,"LEDlight");
if(err)
{
printk(KERN_ERR"[%s%d]:Requestledgpiofailed\n",__func__,__LINE__);
gpio_free(config.out_num);
gpio_free(config.button_num);
gpio_free(config.led_num);
}
flag=1;
break;
}
case1:
{
gpio_direction_output(config.led_num,0);//设置led输出
gpio_direction_input(config.button_num);//设置人体传感器输入
gpio_set_value(config.led_num,0);//关led
if(gpio_get_value(config.button_num)==0)//人体感应输入低电平,led灭
{
gpio_set_value(config.led_num,0);
}
elseif(gpio_get_value(config.button_num)==1)//人体感应输入高电平,led亮
{
gpio_set_value(config.led_num,1);
}
gpio_direction_output(config.led1_num,0);//设置led1输出(实际并未使用)
gpio_direction_output(config.out_num,1);//设置温湿度传感器数据端的引脚为输出
gpio_set_value(config.led1_num,0);
gpio_set_value(config.out_num,0);//根据dht11的数据传输规则进行操作
mdelay(20);
gpio_set_value(config.out_num,1);
udelay(40);
gpio_direction_input(config.out_num);
while(gpio_get_value(config.out_num)==0)
{}
while(gpio_get_value(config.out_num)==1)
{}
for(i=0;i<40;i++)
{
while(gpio_get_value(config.out_num)==0)
{}
udelay(50);
if(gpio_get_value(config.out_num)==1)//获得的数据存入buff[40]数组
{
buff[i]=1;
while(gpio_get_value(config.out_num)==1)
{}
}
else
buff[i]=0;
}
for(i=0;i<16;i++)//湿度移位相加
{
humi=humi*2+buff[i];
}
for(i=16;i<32;i++)//温度移位相加
{
temper=temper*2+buff[i];
}
config.humidity=humi;
config.temperature=temper;
gpio_direction_output(config.out_num,1);//测量结束引脚置高电平
gpio_set_value(config.out_num,1);
mdelay(2000);//延时一段时间再测量
if(copy_to_user((void*)arg,&config,sizeof(structgpio_config)))//数据传入用户态
{
printk(KERN_ERR"[%s%d]:copytouserfailed!\n",__func__,__LINE__);
return-EFAULT;
}
flag=1;
break;
}
default:
printk(KERN_INFO"[%s%d]:Invalidcmd",__func__,__LINE__);
break;
}
return0;}
staticstructfile_operationsdemo_fops={
.owner=THIS_MODULE,
.open=demo_open,
.release=demo_release,
.unlocked_ioctl=demo_ioctl,};staticint__initdemo_init(void){
interr;
printk(KERN_INFO"DemoInit\n");
err=alloc_chrdev_region(&demo_devno,0,1,DRIVER_NAME);
if(err<0){
gotoerr;
}
cdev_init(&demo_dev,&demo_fops);
err=cdev_add(&demo_dev,demo_devno,1);
if(err<0)
{
printk(KERN_ERR"[%s,%d]addcdevfailed\n",__func__,__LINE__);
gotoFREE_DEVNO;
}
//自动生成设备文件在/dev目录下,文件名为DEVICE_NAME
demo_class=class_create(THIS_MODULE,DEVICE_NAME);
if(IS_ERR(demo_class))
{
printk(KERN_ERR"[%s,%d]classcreatefailed\n",__func__,__LINE__);
gotoDEV_FREE;
}
device_create(demo_class,NULL,demo_devno,NULL,DEVICE_NAME);
return0;DEV_FREE:
cdev_del(&demo_dev);FREE_DEVNO:
unregister_chrdev_region(demo_devno,1);err:
returnerr;}staticvoiddemo_exit(void){
if(flag)
{
gpio_free(config.button_num);
gpio_free(config.led_num);
gpio_free(config.out_num);
gpio_free(config.led1_num);
}
device_destroy(demo_class,demo_devno);
class_destroy(demo_class);
cdev_del(&demo_dev);
unregister_chrdev_region(demo_devno,1);
printk(KERN_INFO"Demoexit\n");}module_init(demo_init);module_exit(demo_exit);MODULE_AUTHOR("hyg");MODULE_DESCRIPTION("BUTTONLEDDriver");MODULE_LICENSE("GPL");2.应用程序demo.c#include<stdio.h>#include<stdlib.h>#include<unistd.h>#include<sys/types.h>#include<sys/ioctl.h>#include<sys/time.h>#include<sys/ioctl.h>#include<errno.h>#include<fcntl.h>structgpio_config{
intbutton_num;
intout_num;
intled_num;
intled1_num;
inthumidity;
inttemperature;};intmain(intargc,char**argv){
intfd;
floath;
floatt;
structgpio_configconfig;
config.button_num=26;//人体感应传感器引脚
config.led_num=3;//led引脚
config.out_num=5;//dht11引脚
config.led1_num=6;//未使用
config.humidity=0;//湿度
config.tempe
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 财务分析方法与技巧培训
- 新零售行业智能供应链优化方案
- 2025年兴安货运从业资格考试题
- 2025年凉山州货运从业资格证科目一考试答案
- 2025年晋中货运从业资格证模拟考试题
- 健康食品供应链合作与质量保障协议书
- 农业种植行业农产品质量免责声明
- 大学数学建模过程解读
- 安全与应急避险班会课
- 建筑行业智能设计与施工管理平台方案
- 中国AI+Agent应用研究报告
- 七年级上册生物2024-2025学年新人教版期末综合试卷(含答案)
- 数据分析师历年考试真题试题库(含答案)
- 2024年人教版初二道德与法治上册期末考试卷(附答案)
- 2024年全国教育大会精神全文课件
- 2024至2030年中国工控安全行业发展状况及投资潜力分析报告
- DL-T5153-2014火力发电厂厂用电设计技术规程
- 法学概论-课件
- 文件袋、档案袋密封条模板
- 天蓝色商务发展历程时间轴PPT模板课件
- 农村体育教学资源的开发运用与拓展-精品文档
评论
0/150
提交评论