嵌入式系統(tǒng)綜合實驗一_第1頁
嵌入式系統(tǒng)綜合實驗一_第2頁
嵌入式系統(tǒng)綜合實驗一_第3頁
嵌入式系統(tǒng)綜合實驗一_第4頁
嵌入式系統(tǒng)綜合實驗一_第5頁
已閱讀5頁,還剩8頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

P.PAGE1實驗名稱:姓名:學號:P.PAGE1裝訂線裝訂線專業(yè):測控技術與儀器姓名:顏睿專業(yè):測控技術與儀器姓名:顏睿學號:3130103850日期:2018.4.28地點:創(chuàng)客空間課程名稱:嵌入式系統(tǒng)設計指導老師:馬永昌成績:________________實驗名稱:綜合實驗一dht11和人體感應傳感器實驗類型:驗證型同組學生姓名:孫凡原一、實驗目的和要求(必填) 二、實驗內容和原理(必填)三、主要儀器設備(必填) 四、操作方法和實驗步驟五、實驗數(shù)據(jù)記錄和處理 六、實驗結果與分析(必填)七、討論、心得一、實驗目的和要求1.掌握字符設備驅動程序的基本結構和開發(fā)方法2.掌握用戶空間調用設備驅動的方法3.掌握用戶和內核的交互二、實驗內容和原理1.編寫溫濕度傳感器DHT11驅動,傳輸打印溫濕度信息2.編寫人體感應傳感器驅動,控制LED燈亮滅原理:溫濕度傳感器DHT11:1.引腳圖實際使用傳感器沒有NC引腳2.數(shù)據(jù)采集a.數(shù)據(jù)總時序用戶主機發(fā)送一次開始信號后,DHT11從低功耗模式轉換到高速模式,待主機開始信號結束后,DHT11發(fā)送響應信號,送出40bit的數(shù)據(jù),幵觸發(fā)一次信采集。b.主機發(fā)送起始信號連接DHT11的DATA引腳的I/O口輸出低電平,且低電平保持時間不能小于18ms,然后等待DHT11作出應答信號。c.檢測從機應答信號DHT11的DATA引腳檢測到外部信號有低電平時,等待外部信號低電平結束,延遲后DHT11的DATA引腳處于輸出狀態(tài),輸出80微秒的低電平作為應答信號,緊接著輸出80微秒的高電平通知外設準備接收數(shù)據(jù)。d.接收數(shù)據(jù)(1)數(shù)據(jù)判定規(guī)則

位數(shù)據(jù)“0”的格式為:50微秒的低電平和26-28微秒的高電平,位數(shù)據(jù)“1”的格式為:50微秒的低電平加70微秒的高電平。接收數(shù)據(jù)時可以先等待低電平過去,即等待數(shù)據(jù)線拉高,再延時60us,因為60us大于28us且小于70us,再檢測此時數(shù)據(jù)線是否為高,如果為高,則數(shù)據(jù)判定為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);//設置溫濕度傳感器數(shù)據(jù)端的引腳為輸出

gpio_set_value(config.led1_num,0);

gpio_set_value(config.out_num,0);//根據(jù)dht11的數(shù)據(jù)傳輸規(guī)則進行操作

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)//獲得的數(shù)據(jù)存入buff[40]數(shù)組

{

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)))//數(shù)據(jù)傳入用戶態(tài)

{

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. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論