




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、2022-5-131在線教務輔導網(wǎng):在線教務輔導網(wǎng): 更多課程配套課件資源請訪問在線教務輔導網(wǎng)更多課程配套課件資源請訪問在線教務輔導網(wǎng)2022-5-132第八章 遠程溫度采集與曲線的生成綜合實例2022-5-133基于遠程網(wǎng)絡(luò)的監(jiān)測技術(shù)已經(jīng)廣泛應用于嵌入式系統(tǒng)中,本章將介紹基于S3C2440和Linux為平臺的嵌入式遠程溫度采集系統(tǒng),利用DS18B20溫度傳感器實現(xiàn)溫度的采集,通過嵌入式web服務器Boa實現(xiàn)了遠程溫度的監(jiān)測,還利用JavaScript腳本在網(wǎng)頁中繪制出溫度隨時間變化的曲線圖。軟硬件總體設(shè)計部分說明了溫度采集硬件電路的基本構(gòu)成;DS18B20驅(qū)動程序編寫部分詳細講述了DS18B
2、20底層硬件驅(qū)動的編寫;應用程序部分詳細講述了嵌入式web服務器boa的移植和生成溫度曲線圖的JavaScript腳本。 2022-5-134系統(tǒng)結(jié)構(gòu)圖系統(tǒng)結(jié)構(gòu)圖2022-5-135DS18B20與s3c2410的接口電路圖DS18B20與s3c2440處理器的接口電路如上圖所示。4.7 k的上拉電阻能保證總線閑置時其狀態(tài)為高電平,供電電壓Vcc為,GND接地,VDD管腳接供電電源,DQ為通信接口。 2022-5-136GPIO接口的使用步驟 (1) 先通過s3c2410_gpio_cfgpin(GPIO接口號,功能代號)函數(shù)設(shè)置GPIO接口是用來輸入的還是用來輸出的。如s3c2410_gpi
3、o_cfgpin(S3C2410_GPG14, S3C2410_GPG14_OUTP);表示將S3C2410_GPG14接口設(shè)置成輸出。(2) 再通過s3c2410_gpio_setpin(GPIO接口號,輸出的值)函數(shù)設(shè)置GPIO接口輸出高低電平,0表示低電平,1表示高電平;s3c2410_gpio_setpin(S3C2410_GPG14,1)表示S3C2410_GPG14接口輸出高電平。(3) s3c2410_gpio_getpin(GPIO接口號)函數(shù)用來獲得指定GPIO接口輸入的值,如s3c2410_gpio_getpin(S3C2410_GPG14),如果S3C2410_GPG14
4、這個接口輸入為高電平,返回值是100 0000 0000 0000(十進制為16384),即第14位上是1;(4) s3c2410_gpio_pullup(GPIO接口號) 函數(shù)用來指定GPIO接口是否要使用內(nèi)部的上拉電阻。使用s3c2410_gpio_pullup(S3C2410_GPG14, 1);宏命令將S3C2410_GPG14接口設(shè)置成不使用上拉電阻:注意:默認情況是使用上拉電阻的,因此在大多數(shù)情況都省略了這一步; 2022-5-137DS18B20驅(qū)動需要的頭文件 #include #include #include #include #include #include #incl
5、ude #include #include #include #include #include #include #include #include static int ds18b20_major;/* 將ds18b20的數(shù)據(jù)引腳DQ接在2440處理器的GPG14管腳上*/#define DQ S3C2410_GPG14#define CFG_IN S3C2410_GPG14_INP#define CFG_OUT S3C2410_GPG14_OUTP2022-5-138單總線器件采用了嚴格的通信協(xié)議來保證數(shù)據(jù)的完整性,通信協(xié)議包括:復位脈沖、應答脈沖、寫0和寫1時序、讀0和讀1時序。所有這
6、些傳輸?shù)臄?shù)據(jù)都是以先低位后高位的方式發(fā)送或接收的。驅(qū)動程序是Linux內(nèi)核與硬件之間的接口,驅(qū)動程序為應用程序屏蔽了硬件的細節(jié),這樣在應用程序看來,硬件設(shè)備只是一個設(shè)備文件,應用程序可以象操作普通文件一樣對硬件設(shè)備進行操作。硬件設(shè)備驅(qū)動程序是內(nèi)核的一部分,它主要完成以下的功能:設(shè)備的初始化、把數(shù)據(jù)從內(nèi)核傳送到硬件或從硬件讀取數(shù)據(jù)、并給應用程序提供系統(tǒng)調(diào)用。編寫設(shè)備驅(qū)動程序的主要工作就是編寫子函數(shù)模塊,并填充file_operations結(jié)構(gòu)體的各個域。DS18B20 時序 2022-5-139DS18B20初始化時序及其驅(qū)動模塊的實現(xiàn)(代碼見書)初始化脈沖由復位脈沖(RESET PULSE)和
7、應答脈沖(PRESENCE PULSE)組成,特別說明的是所有的通信都是以初始化時序開始的。主機總線在開始時刻發(fā)送一個從高電平到低電平的復位脈沖,這個低電平信號持續(xù)時間最短為480us,接著釋放總線進入接收狀態(tài),DSl8B20在檢測到總線的上升沿之后等待15-60us,隨后DS18B20發(fā)出持續(xù)時間為60-240us的低電平存在脈沖。相應的初始化脈沖模塊如下所示,其中變量DQ用來表示總線的電平: 2022-5-1310 while(ret=0) / while循環(huán),直到初始化成功,成功則ret為1,退出循環(huán) s3c2410_gpio_cfgpin(DQ, CFG_OUT); /配置DQ管腳的G
8、PIO接口為輸出 s3c2410_gpio_pullup(DQ, 1); / 禁用上拉電阻,已經(jīng)在電路中接了的上拉電阻 s3c2410_gpio_setpin(DQ, 1); / 輸出高電平 udelay(5); s3c2410_gpio_setpin(DQ, 0); / 產(chǎn)生reset脈沖,并保持低電平 600us udelay(600); s3c2410_gpio_setpin(DQ, 1); / 釋放總線 udelay(70); s3c2410_gpio_cfgpin(DQ, CFG_IN); /等待70us后,總線改為輸入口 if(s3c2410_gpio_getpin(DQ) /判斷
9、總線是否拉低,沒被拉低表示初始化失敗 printk(DS18B20 init failed.rn); ret=0; else udelay(430); / 再繼續(xù)等待430us后,如果總線被重新釋放則表明初始化成功 if(s3c2410_gpio_getpin(DQ) ret=1; printk(DS18B20 init succesful.rn); break; s3c2410_gpio_cfgpin(DQ, CFG_OUT); s3c2410_gpio_setpin(DQ, 1); / 釋放總線 udelay(3); return ret; /返回初始化標志,ret為0表示沒有成功,ret
10、為1表示初始化成功2022-5-1311DS18B20寫時序及其驅(qū)動模塊的實現(xiàn)(代碼見書)寫時序及其驅(qū)動模塊的實現(xiàn)(代碼見書)所有的讀寫操作不論是命令還是數(shù)據(jù),都是以字節(jié)為單位的,全部都是以先低位后高位的方式傳輸?shù)?。DS18B20的寫時序如圖8-4所示,當總線從高電平拉至低電平之后的15us之內(nèi)就必須將所寫的位數(shù)據(jù)送到總線上,DSl8B20在隨后的15-45us時間間隔內(nèi)對總線采樣,若總線為低電平,寫入的位就是0,若總線為高電平,則寫入的位就是1,連續(xù)寫2位數(shù)據(jù)的間隙必須大于1us,發(fā)送一位數(shù)據(jù)的時間從總線拉低開始到發(fā)送該位結(jié)束,時間必須控制在60120us。數(shù)據(jù)寫入結(jié)束后,需要將總線釋放以確
11、保之后的操作能正確進行。2022-5-1312 char i = 0; s3c2410_gpio_cfgpin(DQ, CFG_OUT); for(i=0; i= 1; / 向右移一位,準備寫下一個位數(shù)據(jù) 向DS18B20寫一個字節(jié)的子程序部分 2022-5-1313DS18B20讀時序及其驅(qū)動模塊的實現(xiàn)(代碼見書)DS18B20的讀取過程:首先主機將總線拉低1us6us,然后釋放總線,接著就可以去判斷總線的電平,若總線為低電平,說明讀取的數(shù)據(jù)位為0,若總線為高電平,則表明讀取的數(shù)據(jù)位為1,讀取一位數(shù)據(jù)的時間從總線拉低開始到將總線置高準備讀取下一位數(shù)據(jù)位的時間必須大于60us,如圖8-5所示,
12、并且位與位之間須有一個大于1us的高電平時間間隔。由于DS18B20溫度傳感器默認采用12位的分辨率,因此一個溫度數(shù)據(jù)需要讀取兩個字節(jié)。2022-5-1314讀DS18B20一個字節(jié)一個字節(jié)的子程序部分如下 unsigned char i; unsigned char data=0; s3c2410_gpio_cfgpin(DQ, CFG_OUT); for(i=0; i8; i+) s3c2410_gpio_setpin(DQ, 1); udelay(3); s3c2410_gpio_setpin(DQ, 0); / 總線從高電平拉至低電平產(chǎn)生讀時間隙 udelay(3); s3c2410_
13、gpio_setpin(DQ, 1); / 保持低電平3us后,釋放總線 s3c2410_gpio_cfgpin(DQ, CFG_IN); / 總線改為輸入 udelay(9); if(s3c2410_gpio_getpin(DQ) / 等待9us后,讀取總線的位數(shù)據(jù) data |= 0 x01 4; / 根據(jù)ds18b20文檔說明,這幾位的表示精度獲得實際的溫度temp |= (data14); /溫度存在temp變量中,在此沒有考慮負溫度,也沒有保留小數(shù)copy_to_user(buffer, data, 9); /把從SCRATCHPAD存儲器讀到的9個字節(jié)傳送給應用程序; printk
14、(Kernel temp: 0 x%x %d n , temp ,temp); / 總線空閑時,輸出高電平s3c2410_gpio_cfgpin(DQ, CFG_OUT); / 重新設(shè)置總線為輸出,并且輸出為高電平s3c2410_gpio_setpin(DQ, 1); return 1;2022-5-1317驅(qū)動的結(jié)構(gòu)體如下:static struct file_operations ds18b20_fops = .owner = THIS_MODULE, .read = ds18b20_read,;驅(qū)動的初始化子程序部分如下:int _init ds18b20_init(void)print
15、k(Initial driver for ds18b20.n);ds18b20_major = register_chrdev(0,/dev/ds18b20,&ds18b20_fops);/為驅(qū)動申請主備號。if(ds18b20_major 0 )printk(KERN_ERR cant get major n);else printk(ds_major:%dn,ds18b20_major); printk(KERN_ERR insmod ds18b20 is OK!n); return 0;驅(qū)動的退出函數(shù)如下:void _exit ds18b20_exit(void) unregister_
16、chrdev(ds18b20_major,/dev/ds18b20 ); /注銷初始化函數(shù)中申請的主備號。/ 模塊說明部分如下:module_init(ds18b20_init);module_exit(ds18b20_exit);MODULE_LICENSE(GPL);2022-5-1318DS18B20應用程序的編寫應用軟件系統(tǒng)的結(jié)構(gòu)如圖8-6所示,DS18B20硬件驅(qū)動完成了溫度的采集,DS18B20應用程序?qū)⒆x取的溫度及其對應的時間寫入到記錄文件中去,嵌入式WEB服務器Boa提供了一個WEB接口,最后通過瀏覽器運行一個JavaScript腳本顯示溫度隨時間變化的曲線圖。2022-5-1
17、319頭文件、宏定義、頭文件、宏定義、CRC校驗表校驗表 #include #include #include #include #include #include #include #include #define ADC_DEV/dev/ds18b20static int adc_fd = -1;static unsigned char result9;unsigned char crc_data;unsigned char CrcTable 256=0, 94, 188, 226, 97, 63, 221, 131, 194, 156, 126, 32, 163, 253, 31, 65
18、,157, 195, 33, 127, 252, 162, 64, 30, 95, 1, 227, 189, 62, 96, 130, 220,35, 125, 159, 193, 66, 28, 254, 160, 225, 191, 93, 3, 128, 222, 60, 98,190, 224, 2, 92, 223, 129, 99, 61, 124, 34, 192, 158, 29, 67, 161, 255,70, 24, 250, 164, 39, 121, 155, 197, 132, 218, 56, 102, 229, 187, 89, 7,219, 133, 103,
19、 57, 186, 228, 6, 88, 25, 71, 165, 251, 120, 38, 196, 154,101, 59, 217, 135, 4, 90, 184, 230, 167, 249, 27, 69, 198, 152, 122, 36,248, 166, 68, 26, 153, 199, 37, 123,58, 100, 134, 216, 91, 5, 231, 185,140, 210, 48, 110, 237, 179, 81, 15, 78, 16, 242, 172, 47, 113, 147, 205,17, 79, 173, 243, 112, 46,
20、 204, 146, 211, 141, 111, 49, 178, 236, 14, 80,175, 241, 19, 77, 206, 144, 114, 44, 109, 51, 209, 143, 12, 82, 176, 238,50, 108, 142, 208, 83, 13, 239, 177, 240, 174, 76, 18, 145, 207, 45, 115,202, 148, 118, 40, 171, 245, 23, 73, 8, 86, 180, 234, 105, 55, 213, 139,87, 9, 235, 181, 54, 104, 138, 212,
21、149, 203, 41, 119, 244, 170, 72, 22,233, 183, 85, 11, 136, 214, 52, 106, 43, 117, 151, 201, 74, 20, 246, 168,116, 42, 200, 150, 21, 75, 169, 247, 182, 232, 10, 84, 215, 137, 107, 53;2022-5-1320 unsigned char i,crc_data=0; for(i=0;ij;i+) /查表校驗 crc_data = CrcTablecrc_dataresulti; return (crc_data);CRC
22、校驗函數(shù)部分校驗函數(shù)部分 線程線程(按下回車鍵停止采樣按下回車鍵停止采樣)和設(shè)備文件打開函數(shù)和設(shè)備文件打開函數(shù) static int stop=0;static void* comMonitor(void* data) getchar(); stop=1; / stop標志是否有回車符按下,按下stop為1 return NULL;static int init_ADdevice(void) if(adc_fd=open(ADC_DEV, O_RDWR)0) printf(Error opening %s ds18b20 devicen, ADC_DEV); return -1; 2022-5
23、-1321main主函數(shù):主函數(shù): int main(void) int i=0; pthread_t th_com; void * retval; char jg= ; / 定義數(shù)據(jù)之間的間隔符為空格,用jg變量表示空格 char hh=n; FILE *fp; time_t rawtime; struct tm *timeinfo; FILE *ffpp; if(init_ADdevice() 4; i |= (result1tm_hour,timeinfo-tm_min); / 將讀取到的溫度寫入javascript腳本可以讀的格式 fclose(fp); sleep(1);if(ffp
24、p=fopen(now.js,w)=NULL) printf(file can not open now.txtn); exit(0); fprintf(ffpp,now = new Array();n = %d%c%02d:%02d:%02d%c%04d-%02d-%02d;n,i,jg,timeinfo-tm_hour,timeinfo-tm_min,timeinfo-tm_sec,jg,1900+timeinfo-tm_year,1+timeinfo-tm_mon,timeinfo-tm_mday); fclose(ffpp); sleep(1); pthread_join(th_com
25、, &retval);printf(n);return 0;2022-5-1323Makefile文件文件 ARGET = ds18b20_appCC = arm-linux-gcc KERNELDIR ?= /opt/EmbedSky/linux- PWD := $(shell pwd)all:$(TARGET) modules$(TARGET):$(CC) -o $(TARGET) $(TARGET).c -lpthreadmodules:$(MAKE) -C $(KERNELDIR) M=$(PWD) modulesclean:rm -rf *.o .* d *.ko *
26、. .tmp_versions *.order *.symvers $(TARGET)obj-m$(CC)、$(MAKE)、 rm命令的前面是一個Tab鍵的占位符,不是空格。rm -rf *.o .* d *.ko *. .tmp_versions *.order *.symvers $(TARGET) (這個要寫成一行)2022-5-1324溫度記錄文件的格式溫度記錄文件的格式 溫度記錄文件要寫成JavaScript腳本可以識別的數(shù)組變量格式,其具體格式如下:dataSet = new Array(); = 23 2225; = 23 2225; = 23 2225; = 25 2225;
27、= 27 2226; = 29 2226; = 26 2226; = 24 2226; = 23 2226;2022-5-1325嵌入式Web服務器boa的移植1 嵌入式Web服務器boa源代碼的修改(1) 解壓源代碼后,找到文件 注釋掉該文件的225227行,否則會在編譯時出現(xiàn)icky Linux kernel bug!的編譯錯誤。(2) 將文件中的#define TIMEZONE_OFFSET(foo) foo#-tm_gmtoff這一行改為#define TIMEZONE_OFFSET(foo) foo-tm_gmtoff,即只是去掉了該行的兩個#字符。(3) 修改存放配置文件的路徑,默
28、認配置文件存放的目錄/etc是不可以寫的,所以要將配置文件放在/root/boa目錄下。將文件中的#define SERVER_ROOT /etc/boa 這一行改成 #define SERVER_ROOT /root/boa 。2022-5-13262 boa在嵌入式下的移植 1. 編譯boa。 執(zhí)行boa-0.94.13/src/configure,生成一個Makefile文件,修改Makefile文件中的CC和CPP編譯器變量,將編譯器改為交叉編譯器,修改CC=gcc為CC=arm-linux-gcc,修改CPP=gcc -E為CPP=arm-linux-gcc E。最后執(zhí)行make命令
29、來編譯boa源代碼,生成boa可執(zhí)行文件。2022-5-13273 配置boa。為了使boa 能在嵌入式平臺上運行,需要對其運行環(huán)境、參數(shù)等進行配置。(1)修改 Group nogroup 為Group 0,在我們制作的文件系統(tǒng)中沒有nogroup組,所以設(shè)成0。修改User nobody 為User root(2)修改存放cgi腳本的目錄,將scriptAlias /cgi-bin/ /usr/lib/cgi-bin/ 改為scriptAlias /cgi-bin/ /root/boa/cgi-bin/。(3)ServerName的設(shè)置:將#ServerName 前面的注釋符#去掉。 (4)
30、將日志文件和配置文件放到可讀寫的/root/boa/目錄下:ErrorLog /root/boa/log/error_logAccessLog /root/boa/log/dev/nullDocumentRoot /root/boa/wwwMimeTypes /root/boa/2022-5-13284. 拷貝相關(guān)的文件和創(chuàng)建相關(guān)目錄將開發(fā)主機/etc目錄下的 文件拷貝到嵌入式目標板的/root/boa/目錄下,將拷貝到嵌入式目標板的/root/boa/目錄下,最后將下的boa可執(zhí)行文件拷貝到嵌入式目標板/root/boa目錄下。創(chuàng)建目錄mkdir /root/boa/www,mkdir /r
31、oot/boa/www/cgi-bin/,創(chuàng)建目錄mkdir /root/boa/log這時就可以啟動boa程序,實現(xiàn)對boa web服務器的訪問。2022-5-1329溫度隨時間變化的曲線腳本的編寫溫度隨時間變化的曲線圖是利用了一個JavaScript腳本來實現(xiàn)的,JavaScript腳本是在客戶端的瀏覽器上運行的程序,這樣就減輕了嵌入式服務器端的資源消耗。通過瀏覽器向嵌入式Boa服務器發(fā)出一個HTTP請求,Boa服務器上的JavaScript腳本就會去讀取溫度記錄文件里的溫度和對應的時間數(shù)據(jù),然后在瀏覽器中顯示出溫度隨時間變化的曲線圖。曲線圖繪制腳本和首頁文件主要有以下四個部分組成.202
32、2-5-13301.首先將記錄文件中的溫度及其對應的時間分別讀進溫度數(shù)組wendui和時間數(shù)組shijiani中,只取得前面24個溫度及其對應的時間數(shù)據(jù)。=function()wendu = new Array();now = new Array();shijian = new Array();for(var i=0,j=dataSet.length-24;jdataSet.length;i+,j+) var reCat = /40/; / 溫度與時間是以空格分開的 var arrdata = dataSetj.split(reCat); / 以空格為分割符,提取出溫度數(shù)組和時間數(shù)組wendu
33、i = arrdata0; shijiani = arrdata1; var data=new period(wendu0,wendu1,wendu2,wendu3,wendu4,wendu5,wendu6,wendu7,wendu8,wendu9,wendu10,wendu11,wendu12,wendu13,wendu14,wendu15,wendu16,wendu17,wendu18,wendu19,wendu20,wendu21,wendu22,wendu23,/y軸數(shù)據(jù)shijian0,shijian1,shijian2,shijian3,shijian4,shijian5,shijian6,shijian7,shijian8,shijian9,shijian10,shijian11,shijian12,shijian13,shijian14,shijian15,shijian16,shijian17,shijian18,shijian19,shijian20,shijian21,s
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 租地合同附屬協(xié)議
- 山東省濟寧市任城區(qū)2024-2025學年七年級上學期期末生物學試題(含答案)
- 湖南省郴州市2024-2025學年高一上學期期末考試生物學試題(含答案)
- 離婚協(xié)議書條款補充協(xié)議
- 初中數(shù)學競賽指導策略訓練課教案
- 水務工程設(shè)計與施工合同管理協(xié)議
- 非謂語動詞的用法與解析:高中英語語法
- (一模)2025屆安徽省“江南十?!备呷?lián)考地理試卷(含官方答案)
- 電氣物資知識培訓課件
- 水療產(chǎn)品知識培訓課件
- 2025年遼寧現(xiàn)代服務職業(yè)技術(shù)學院單招職業(yè)技能測試題庫(含答案)
- 2025年月度工作日歷含農(nóng)歷節(jié)假日電子表格版
- 部編版六年級下冊道德與法治全冊教案教學設(shè)計
- 益生菌精品課件
- 一級公司向二級公司授權(quán)管理制度
- 沃爾瑪全國的分布
- (自考)財務管理學完整版課件全套ppt教程(最新)
- 第四紀地質(zhì)與環(huán)境:第十一章 第四紀氣候變遷及其動力機制
- 小學生心理健康講座-(精)
- 蝴蝶豌豆花(課堂PPT)
- 口腔修復學-第七章-牙列缺失的全口義齒修復
評論
0/150
提交評論