溫度傳感器DS18B及LCD1602的使用_第1頁(yè)
溫度傳感器DS18B及LCD1602的使用_第2頁(yè)
溫度傳感器DS18B及LCD1602的使用_第3頁(yè)
溫度傳感器DS18B及LCD1602的使用_第4頁(yè)
溫度傳感器DS18B及LCD1602的使用_第5頁(yè)
已閱讀5頁(yè),還剩11頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、精選文檔西南科技高校試驗(yàn)報(bào)告課程名稱: 單片機(jī)原理及其應(yīng)用A 試驗(yàn)名稱:LCD1602及DS18B20的應(yīng)用 姓 名: XX 學(xué) 號(hào): XXXXXXXXXX 班 級(jí): XXXX 指導(dǎo)老師: XXX 西南科技高校信息工程學(xué)院制試驗(yàn)題目一、 試驗(yàn)?zāi)康? 學(xué)習(xí)和理解液晶顯示的原理,并且能夠讀懂液晶顯示的時(shí)序圖,學(xué)會(huì)編寫有關(guān)LCD1602的讀、寫等的程序。2 學(xué)習(xí)和理解溫度傳感器的原理,并嘗試著應(yīng)用,能夠依據(jù)DS18B20中存儲(chǔ)的十六進(jìn)制數(shù)來計(jì)算溫度,理解原碼和補(bǔ)碼的轉(zhuǎn)換。3 在試驗(yàn)中,每次消滅問題時(shí),能夠冷靜地面對(duì),通過改正試驗(yàn)中的錯(cuò)誤,漸漸積累閱歷。二、 試驗(yàn)原理1. 1602 液晶內(nèi)部自帶 80

2、 個(gè)字節(jié)的DDRAM,用來存儲(chǔ)待顯示的字符代碼,如下圖所示:圖11602的DDRAM結(jié)構(gòu)圖第一行的地址是 0x00到 0x27,其次行的地址從 0x40 到 0x67,其中第一行 0x00 到 0x0F是與液晶上第一行 16 個(gè)字符顯示位置相對(duì)應(yīng)的,其次行 0x40 到 0x4F 是與其次行 16 個(gè)字符顯示位置相對(duì)應(yīng)的。而每行都多出來一部分,是為了顯示移動(dòng)字幕設(shè)置的。 1602 字符液晶是顯示字符的,因此它跟 ASCII 字符表是對(duì)應(yīng)的。2. 1602基本的讀寫時(shí)序有4個(gè):(1) 讀狀態(tài);(2) 讀數(shù)據(jù)(較少使用);(3) 寫命令;(4) 寫數(shù)據(jù)。(1)讀狀態(tài):1602液晶有一個(gè)狀態(tài)字字節(jié),

3、通過讀取這個(gè)狀態(tài)字的內(nèi)容,就可知道 1602 液晶的一些內(nèi)部狀況,如下表所示:圖21602讀狀態(tài)(3) 寫命令:時(shí)序要求:RS=L, R/W=L, D0D7=指令碼, E=高脈沖(E 使能引腳先從低拉高,再?gòu)母呃?,形成一個(gè)高脈沖)。(4) 寫數(shù)據(jù):時(shí)序要求:RS=H, R/W=L, D0D7=數(shù)據(jù), E=高脈沖3. 1 -Wire 總線開頭需要檢測(cè)這條總線上是否存在 DS18B20這個(gè)器件。假如這條總線上存在 DS18B20,總線會(huì)依據(jù)時(shí)序要求返回一個(gè)低電平脈沖,假如不存在的話,也就不會(huì)返回脈沖,即總線保持為高電平,所以習(xí)慣上稱之為檢測(cè)存在脈沖。此外,獵取存在脈沖不僅僅是檢測(cè)是否存在DS18

4、B20,還要通過這個(gè)脈沖過程通知 DS18B20預(yù)備好,單片機(jī)要對(duì)它進(jìn)行操作了。4. DS18B20芯片通過達(dá)拉斯公司的單總線協(xié)議依靠一個(gè)單線端口通訊,如何區(qū)分不同的器件呢?在每個(gè) DS18B20 內(nèi)部都有一個(gè)唯一的 64 位長(zhǎng)的序列號(hào),這個(gè)序列號(hào)值就存在 DS18B20內(nèi)部的 ROM 中。開頭的 8 位是產(chǎn)品類型編碼( DS18B20 是 0x10),接著的 48 位是每個(gè)器件唯一的序號(hào),最終的 8 位是 CRC 校驗(yàn)碼。這里只講一條總線上只接一個(gè)器件的指令和程序,可以跳過 ROM,不進(jìn)行 ROM檢測(cè)(0xCC)。三、 試驗(yàn)步驟1. 打開protues,新建一個(gè)文件,依據(jù)試驗(yàn)內(nèi)容和試驗(yàn)要求,

5、畫出原理圖并保存。2. 打開keil,新建工程和文件,依據(jù)protues中已經(jīng)畫好的原理圖的連線方式和試驗(yàn)內(nèi)容及其要求,編寫程序并進(jìn)行編譯。3. 當(dāng)在keil中的程序經(jīng)編譯沒有語(yǔ)法錯(cuò)誤時(shí),生成hex文件,將它導(dǎo)入到protues的單片機(jī)中,進(jìn)行仿真。依據(jù)試驗(yàn)內(nèi)容和要求對(duì)試驗(yàn)結(jié)果進(jìn)行檢測(cè),若試驗(yàn)結(jié)果正確,則進(jìn)行下一個(gè)試驗(yàn),若試驗(yàn)結(jié)果和試驗(yàn)要求不同,則分別查找可能存在于程序和原理圖中的問題,改正并直到結(jié)果正確為止。四、 試驗(yàn)結(jié)果及分析1. 在protues中運(yùn)行編寫的第一個(gè)程序,結(jié)果如下圖所示:圖31602顯示字符運(yùn)行之后,屏幕上顯示“Hello”和“Welcome to Swust”,其中“He

6、llo”位于第一行,從第五位開頭顯示,此處的程序?yàn)閡nsigned char str = "Hello"InitLcd1602(); LcdShowStr(5, 0, str);而“Welcome to Swust”顯示在其次行,此處的程序?yàn)長(zhǎng)cdShowStr(0, 1, "Welcome to SWUST!")。2. 運(yùn)行其次個(gè)程序,結(jié)果如下所示:圖4DS18B20和1602的應(yīng)用結(jié)果試驗(yàn)時(shí),通過手動(dòng)調(diào)整溫度傳感器上面的值,進(jìn)行升溫或者降溫,LCD1602將會(huì)顯示對(duì)應(yīng)的溫度值,通過計(jì)算溫度傳感器的儲(chǔ)存器內(nèi)的值,可得到與液晶顯示屏上相同的值。圖5DS1

7、8B20寄存器內(nèi)容其中DS18B20主要寄存器數(shù)據(jù)格式如下所示:圖6DS18B寄存器格式由此可計(jì)算出溫度傳感器的值。五、 體會(huì)這次試驗(yàn),主要是對(duì)于單片機(jī)的應(yīng)用,所以基本上是對(duì)于之前所學(xué)習(xí)的學(xué)問的應(yīng)用。對(duì)于LCD1602和溫度傳感器來說,它們的硬件電路的連線都比較簡(jiǎn)潔,但是這也意味著在軟件編程方面的簡(jiǎn)單。1602和DS18B20的時(shí)序都比較簡(jiǎn)單,所以程序也比較簡(jiǎn)單。在寫其次個(gè)溫度傳感器的程序的時(shí)候,會(huì)用到第一個(gè)LCD1602的程序,所以在編程的時(shí)候,可以把1602的讀、寫以及初始化等單獨(dú)寫成一個(gè)程序,這樣更有利于功能的實(shí)現(xiàn)。和前面一樣,試驗(yàn)不行能都是一開頭就成功的,總會(huì)有各種各樣的錯(cuò)誤,有的或許

8、是馬虎,有的或許是不懂,但無論怎么樣,經(jīng)過自己細(xì)心地查找和學(xué)習(xí)并改正之后,這些都會(huì)成為貴重的閱歷,這是單獨(dú)看書找不到的。這雖然是最終一次的單片機(jī)試驗(yàn)了,但學(xué)習(xí)并沒有結(jié)束,在將來的日子里,我們照舊要多動(dòng)手,編寫程序,要用到單片機(jī)的地方很多,只有不停地實(shí)踐和練習(xí),我們才能夠?qū)W習(xí)得更好。六、 附錄1. LCD顯示字符程序(keil編寫)#include <reg51.h>sbit LCD1602_RS = P20;sbit LCD1602_RW = P21;sbit LCD1602_E = P22;/* 等待液晶預(yù)備好 */void LcdWaitReady() unsigned cha

9、r sta; P0 = 0xFF; LCD1602_RS = 0; LCD1602_RW = 1; do LCD1602_E = 1; sta = P0; /讀取狀態(tài)字LCD1602_E = 0; while (sta & 0x80); /bit7 等于 1 表示液晶正忙,重復(fù)檢測(cè)直到其等于 0 為止/* 向 LCD1602 液晶寫入一字節(jié)命令, cmd-待寫入命令值 */void LcdWriteCmd(unsigned char cmd) LcdWaitReady(); LCD1602_RS = 0; LCD1602_RW = 0; P0 = cmd; LCD1602_E = 1;

10、 LCD1602_E = 0;/* 向 LCD1602 液晶寫入一字節(jié)數(shù)據(jù), dat-待寫入數(shù)據(jù)值 */void LcdWriteDat(unsigned char dat) LcdWaitReady(); LCD1602_RS = 1; LCD1602_RW = 0; P0 = dat; LCD1602_E = 1; LCD1602_E = 0;/* 設(shè)置顯示 RAM 起始地址,亦即光標(biāo)位置, (x,y) -對(duì)應(yīng)屏幕上的字符坐標(biāo) */void LcdSetCursor(unsigned char x, unsigned char y) unsigned char addr; if (y =

11、0) /由輸入的屏幕坐標(biāo)計(jì)算顯示 RAM 的地址 addr = 0x00 + x; /第一行字符地址從 0x00 起始 else addr = 0x40 + x; /其次行字符地址從 0x40 起始 LcdWriteCmd(addr | 0x80); /設(shè)置 RAM 地址/* 在液晶上顯示字符串, (x,y) -對(duì)應(yīng)屏幕上的起始坐標(biāo), str-字符串指針 */void LcdShowStr(unsigned char x, unsigned char y, unsigned char *str) LcdSetCursor(x, y); /設(shè)置起始地址 while (*str != '0

12、') /連續(xù)寫入字符串?dāng)?shù)據(jù),直到檢測(cè)到結(jié)束符 LcdWriteDat(*str+); /先取 str 指向的數(shù)據(jù),然后 str 自加 1 /* 初始化 1602 液晶 */void InitLcd1602() LcdWriteCmd(0x38); /16*2 顯示, 5*7 點(diǎn)陣, 8 位數(shù)據(jù)接口 LcdWriteCmd(0x0C); /顯示器開,光標(biāo)關(guān)閉 LcdWriteCmd(0x06); /文字不動(dòng),地址自動(dòng)+1 LcdWriteCmd(0x01); /清屏extern void InitLcd1602();extern void LcdShowStr(unsigned char

13、 x, unsigned char y, unsigned char *str);void main() unsigned char str = "Hello" InitLcd1602(); LcdShowStr(5, 0, str); LcdShowStr(0, 1, "Welcome to SWUST!"); while (1);2. 溫度傳感器的液晶顯示程序#include <reg51.h>#include <intrins.h>sbit IO_18B20 = P31; /DS18B20 通信引腳/* 軟件延時(shí)函數(shù),延時(shí)時(shí)

14、間(t*10)us */sbit LCD1602_RS = P20;sbit LCD1602_RW = P21;sbit LCD1602_E = P22;void DelayX10us(unsigned char t) do _nop_(); _nop_(); _nop_(); _nop_(); _nop_();_nop_();_nop_();_nop_(); while (-t);/* 復(fù)位總線,獵取存在脈沖,以啟動(dòng)一次讀寫操作 */* 等待液晶預(yù)備好 */void LcdWaitReady() unsigned char sta; P0 = 0xFF; LCD1602_RS = 0; LC

15、D1602_RW = 1; do LCD1602_E = 1; sta = P0; /讀取狀態(tài)字LCD1602_E = 0; while (sta & 0x80); /bit7 等于 1 表示液晶正忙,重復(fù)檢測(cè)直到其等于 0 為止/* 向 LCD1602 液晶寫入一字節(jié)命令, cmd-待寫入命令值 */void LcdWriteCmd(unsigned char cmd) LcdWaitReady(); LCD1602_RS = 0; LCD1602_RW = 0; P0 = cmd; LCD1602_E = 1; LCD1602_E = 0;/* 向 LCD1602 液晶寫入一字節(jié)數(shù)

16、據(jù), dat-待寫入數(shù)據(jù)值 */void LcdWriteDat(unsigned char dat) LcdWaitReady(); LCD1602_RS = 1; LCD1602_RW = 0; P0 = dat; LCD1602_E = 1; LCD1602_E = 0;/* 設(shè)置顯示 RAM 起始地址,亦即光標(biāo)位置, (x,y) -對(duì)應(yīng)屏幕上的字符坐標(biāo) */void LcdSetCursor(unsigned char x, unsigned char y) unsigned char addr; if (y = 0) /由輸入的屏幕坐標(biāo)計(jì)算顯示 RAM 的地址 addr = 0x00

17、 + x; /第一行字符地址從 0x00 起始 else addr = 0x40 + x; /其次行字符地址從 0x40 起始 LcdWriteCmd(addr | 0x80); /設(shè)置 RAM 地址/* 在液晶上顯示字符串, (x,y) -對(duì)應(yīng)屏幕上的起始坐標(biāo), str-字符串指針 */void LcdShowStr(unsigned char x, unsigned char y, unsigned char *str) LcdSetCursor(x, y); /設(shè)置起始地址 while (*str != '0') /連續(xù)寫入字符串?dāng)?shù)據(jù),直到檢測(cè)到結(jié)束符 LcdWriteD

18、at(*str+); /先取 str 指向的數(shù)據(jù),然后 str 自加 1 /* 初始化 1602 液晶 */void InitLcd1602() LcdWriteCmd(0x38); /16*2 顯示, 5*7 點(diǎn)陣, 8 位數(shù)據(jù)接口 LcdWriteCmd(0x0C); /顯示器開,光標(biāo)關(guān)閉 LcdWriteCmd(0x06); /文字不動(dòng),地址自動(dòng)+1 LcdWriteCmd(0x01); /清屏bit Get18B20Ack() bit ack; EA = 0; /禁止總中斷 IO_18B20 = 0; /產(chǎn)生 500us 復(fù)位脈沖 DelayX10us(50); IO_18B20 =

19、1; DelayX10us(6); /延時(shí) 60us ack = IO_18B20; /讀取存在脈沖 while(!IO_18B20); /等待存在脈沖結(jié)束 EA = 1; /重新使能總中斷 return ack;/* 向 DS18B20 寫入一個(gè)字節(jié), dat-待寫入字節(jié) */void Write18B20(unsigned char dat) unsigned char mask; EA = 0; /禁止總中斷 for (mask=0x01; mask!=0; mask<<=1) /低位在先,依次移出 8 個(gè) bit IO_18B20 = 0; /產(chǎn)生 2us 低電平脈沖 _n

20、op_(); _nop_(); if (mask&dat) = 0) /輸出該 bit 值 IO_18B20 = 0; else IO_18B20 = 1; DelayX10us(6); /延時(shí) 60us IO_18B20 = 1; /拉高通信引腳 EA = 1; /重新使能總中斷/* 從 DS18B20 讀取一個(gè)字節(jié),返回值-讀到的字節(jié) */unsigned char Read18B20()unsigned char dat;unsigned char mask;EA = 0; /禁止總中斷for (mask=0x01; mask!=0; mask<<=1) /低位在先,

21、依次采集 8 個(gè) bit IO_18B20 = 0; /產(chǎn)生 2us 低電平脈沖 _nop_(); _nop_(); IO_18B20 = 1; /結(jié)束低電平脈沖,等待 18B20 輸出數(shù)據(jù) _nop_(); /延時(shí) 2us _nop_(); if (!IO_18B20) /讀取通信引腳上的值 dat &= mask; else dat |= mask; DelayX10us(6); /再延時(shí) 60usEA = 1; /重新使能總中斷return dat;/* 啟動(dòng)一次 18B20 溫度轉(zhuǎn)換,返回值-表示是否啟動(dòng)成功 */bit Start18B20() bit ack; ack =

22、Get18B20Ack(); /執(zhí)行總線復(fù)位,并獵取 18B20 應(yīng)答 if (ack = 0) /如 18B20 正確應(yīng)答,則啟動(dòng)一次轉(zhuǎn)換 Write18B20(0xCC); /跳過 ROM 操作 Write18B20(0x44); /啟動(dòng)一次溫度轉(zhuǎn)換 return ack; /ack=0 表示操作成功,所以返回值對(duì)其取反/* 讀取 DS18B20 轉(zhuǎn)換的溫度值,返回值-表示是否讀取成功 */bit Get18B20Temp(int *temp) bit ack; unsigned char LSB, MSB; /16bit 溫度值的低字節(jié)和高字節(jié) ack = Get18B20Ack();

23、/執(zhí)行總線復(fù)位,并獵取 18B20 應(yīng)答 if (ack = 0) /如 18B20 正確應(yīng)答,則讀取溫度值 Write18B20(0xCC); /跳過 ROM 操作Write18B20(0xBE); /發(fā)送讀命令LSB = Read18B20(); /讀溫度值的低字節(jié)MSB = Read18B20(); /讀溫度值的高字節(jié)*temp = (int)MSB << 8) + LSB; /合成為 16bit 整型數(shù)return ack; /ack=0 表示操作應(yīng)答,所以返回值為其取反值bit flag1s = 0; /1s 定時(shí)標(biāo)志unsigned char T0RH = 0; /T0

24、 重載值的高字節(jié)unsigned char T0RL = 0; /T0 重載值的低字節(jié)/* 整型數(shù)轉(zhuǎn)換為字符串, str-字符串指針, dat-待轉(zhuǎn)換數(shù),返回值-字符串長(zhǎng)度 */unsigned char IntToString(unsigned char *str, int dat)signed char i = 0;unsigned char len = 0;unsigned char buf6;if (dat < 0) /假如為負(fù)數(shù),首先取確定值,并在指針上添加負(fù)號(hào)dat = -dat;*str+ = '-'len+;do /先轉(zhuǎn)換為低位在前的十進(jìn)制數(shù)組bufi+

25、= dat % 10;dat /= 10; while (dat > 0);len += i; /i 最終的值就是有效字符的個(gè)數(shù)while (i- > 0) /將數(shù)組值轉(zhuǎn)換為 ASCII 碼反向拷貝到接收指針上*str+ = bufi + '0'*str = '0' /添加字符串結(jié)束符return len; /返回字符串長(zhǎng)度/* 配置并啟動(dòng) T0, ms-T0 定時(shí)時(shí)間 */void ConfigTimer0(unsigned int ms)unsigned long tmp; /臨時(shí)變量tmp = 11059200 / 12; /定時(shí)器計(jì)數(shù)頻率tm

26、p = (tmp * ms) / 1000; /計(jì)算所需的計(jì)數(shù)值tmp = 65536 - tmp; /計(jì)算定時(shí)器重載值tmp = tmp + 12; /補(bǔ)償中斷響應(yīng)延時(shí)造成的誤差T0RH = (unsigned char)(tmp>>8); /定時(shí)器重載值拆分為凹凸字節(jié)T0RL = (unsigned char)tmp;TMOD &= 0xF0; /清零 T0 的把握位TMOD |= 0x01; /配置 T0 為模式 1TH0 = T0RH; /加載 T0 重載值TL0 = T0RL;ET0 = 1; /使能 T0 中斷TR0 = 1; /啟動(dòng) T0/* T0 中斷服務(wù)函數(shù),完成 1 秒定時(shí) */void InterruptTimer0() interrupt 1static unsigned c

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論