嵌入式系统综合实验一_第1页
嵌入式系统综合实验一_第2页
嵌入式系统综合实验一_第3页
嵌入式系统综合实验一_第4页
嵌入式系统综合实验一_第5页
已阅读5页,还剩8页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

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. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论