


版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、西南科技大學(xué)實(shí)驗(yàn)報(bào)告課程名稱: 單片機(jī)原理及其應(yīng)用 A實(shí)驗(yàn)名稱:LCD1602及DS18B2C的應(yīng)用姓 名: XX學(xué) 號(hào):XXXXXXXXXX班 級(jí):XXXX指導(dǎo)教師:XXX西南科技大學(xué)信息工程學(xué)院制實(shí)驗(yàn)?zāi)康膶?shí)驗(yàn)題目1. 學(xué)習(xí)和理解液晶顯示的原理,并且能夠讀懂液晶顯示的時(shí)序圖,學(xué)會(huì)編寫(xiě)有關(guān)LCD1602 的讀、寫(xiě)等的程序。2. 學(xué)習(xí)和理解溫度傳感器的原理,并嘗試著應(yīng)用,能夠根據(jù)DS18B2沖存儲(chǔ)的十六進(jìn)制 數(shù)來(lái)計(jì)算溫度,理解原碼和補(bǔ)碼的轉(zhuǎn)換。3. 在實(shí)驗(yàn)中,每次出現(xiàn)問(wèn)題時(shí),能夠冷靜地面對(duì),通過(guò)改正實(shí)驗(yàn)中的錯(cuò)誤,逐漸積累經(jīng) 驗(yàn)。二、實(shí)驗(yàn)原理1. 1602液晶內(nèi)部自帶80個(gè)字節(jié)的DDRAM用來(lái)存儲(chǔ)
2、待顯示的字符代碼,如下圖所示:圖1 1602的DDRA腑構(gòu)圖第一行的地址是0x00到0x27,第二行的地址從0x40到0x67,其中第一行0x00到0x0F 是與液晶上第一行16個(gè)字符顯示位置相對(duì)應(yīng)的,第二行 0x40到0x4F是與第二行16個(gè) 字符顯示位置相對(duì)應(yīng)的。而每行都多出來(lái)一部分,是為了顯示移動(dòng)字幕設(shè)置的。1602字符液晶是顯示字符的,因此它跟 ASCII字符表是對(duì)應(yīng)的。2. 1602基本的讀寫(xiě)時(shí)序有4 個(gè): (1)讀狀態(tài);(2)讀數(shù)據(jù)(較少使用);(3)寫(xiě)命令;(4) 寫(xiě)數(shù)據(jù)o (1)讀狀態(tài):1602液晶有一個(gè)狀態(tài)字字節(jié),通過(guò)讀取這個(gè)狀態(tài)字的內(nèi)容,就可知道1602 液晶的一些內(nèi)部情況
3、,如下表所示:圖2 1602讀狀態(tài) 寫(xiě)命令:時(shí)序要求:RS=L R/W=L,D0D7=f令碼,E=高脈沖(E使能引腳先從低拉高, 再?gòu)母呃?,形成一個(gè)高脈沖)。(4)寫(xiě)數(shù)據(jù):時(shí)序要求:RS=H R/W=L,D0D7=t據(jù),E= 高脈沖3. 1 -Wire總線開(kāi)始需要檢測(cè)這條總線上是否存在 DS18B20這個(gè)器件。如果這條總線上 存在DS18B2Q總線會(huì)根據(jù)時(shí)序要求返回一個(gè)低電平脈沖,如果不存在的話,也就不會(huì)返回 脈沖,即總線保持為高電平,所以習(xí)慣上稱之為檢測(cè)存在脈沖。此外,獲取存在脈沖不僅僅是檢測(cè)是否存在DS18B20還要通過(guò)這個(gè)脈沖過(guò)程通知 DS18B20準(zhǔn)備好,單片機(jī)要對(duì)它進(jìn)行 操作了。4
4、. DS18B20芯片通過(guò)達(dá)拉斯公司的單總線協(xié)議依靠一個(gè)單線端口通訊,如何區(qū)分不同的 器件呢?在每個(gè) DS18B20內(nèi)部都有一個(gè)唯一的 64位長(zhǎng)的序列號(hào),這個(gè)序列號(hào)值就存在 DS18B2吶部的ROM中。開(kāi)始的8位是產(chǎn)品類型編碼(DS18B20是0x10 ),接著的48位 是每個(gè)器件唯一的序號(hào),最后的 8位是CRC校驗(yàn)碼。這里只講一條總線上只接一個(gè)器件的 指令和程序,可以跳過(guò) ROM不進(jìn)行ROM檢測(cè)(0xCC)。三、實(shí)驗(yàn)步驟1. 打開(kāi)protues,新建一個(gè)文件,根據(jù)實(shí)驗(yàn)內(nèi)容和實(shí)驗(yàn)要求,畫(huà)出原理圖并保存2. 打開(kāi)keil ,新建工程和文件,根據(jù)protues中已經(jīng)畫(huà)好的原理圖的連線方式和實(shí)驗(yàn)內(nèi)
5、容及其要求,編寫(xiě)程序并進(jìn)行編譯。3. 當(dāng)在keil中的程序經(jīng)編譯沒(méi)有語(yǔ)法錯(cuò)誤時(shí),生成hex文件,將它導(dǎo)入到protues的單片機(jī)中,進(jìn)行仿真。根據(jù)實(shí)驗(yàn)內(nèi)容和要求對(duì)實(shí)驗(yàn)結(jié)果進(jìn)行檢測(cè),若實(shí)驗(yàn)結(jié)果正確,則進(jìn)行下一個(gè)實(shí)驗(yàn),若實(shí)驗(yàn)結(jié)果和實(shí)驗(yàn)要求不同,則分別查找可能存在于程序和原理圖中的問(wèn)題, 改正并直到結(jié)果正確為止。四、實(shí)驗(yàn)結(jié)果及分析1. 在protues中運(yùn)行編寫(xiě)的第一個(gè)程序,結(jié)果如下圖所示:圖3 1602顯示字符運(yùn)行之后,屏幕上顯示“ Hello ”和“Welcome to Swust”,其中“ Hello ”位于第一行,從 第五位開(kāi)始顯示,此處的 程序?yàn)?un sig ned char str =
6、 "Hello"I nitLcd1602(); LcdShowStr(5, 0, str);而“ Welcomdo Swust” 顯示在第二行,此處的程序?yàn)?LcdShowStr(0, 1, "Welcome to SWUST!")。2. 運(yùn)行第二個(gè)程序,結(jié)果如下所示:圖4 DS18B20和1602的應(yīng)用結(jié)果實(shí)驗(yàn)時(shí),通過(guò)手動(dòng)調(diào)節(jié)溫度傳感器上面的值,進(jìn)行升溫或者降溫,LCD1602將會(huì)顯示對(duì)應(yīng)的溫度值,通過(guò)計(jì)算溫度傳感器的儲(chǔ)存器內(nèi)的值,可得到與液晶顯示屏上相同的值。圖5 DS18B20寄存器內(nèi)容其中DS18B2C主要寄存器數(shù)據(jù)格式如下所示:圖6 DS18B
7、寄存器格式由此可計(jì)算出溫度傳感器的值。五、體會(huì)這次實(shí)驗(yàn),主要是對(duì)于單片機(jī)的應(yīng)用,所以基本上是對(duì)于之前所學(xué)習(xí)的知識(shí)的應(yīng)用。對(duì) 于LCD1602和溫度傳感器來(lái)說(shuō),它們的硬件電路的連線都比較簡(jiǎn)單,但是這也意味著在軟件 編程方面的復(fù)雜。1602和DS18B20的時(shí)序都比較復(fù)雜,所以程序也比較復(fù)雜。在寫(xiě)第二個(gè)溫 度傳感器的程序的時(shí)候,會(huì)用到第一個(gè) LCD1602的程序,所以在編程的時(shí)候,可以把1602的 讀、寫(xiě)以及初始化等單獨(dú)寫(xiě)成一個(gè)程序,這樣更有利于功能的實(shí)現(xiàn)。和前面一樣,實(shí)驗(yàn)不可能都是一開(kāi)始就成功的,總會(huì)有各種各樣的錯(cuò)誤,有的或許是粗 心,有的或許是不懂,但無(wú)論怎么樣,經(jīng)過(guò)自己細(xì)心地查找和學(xué)習(xí)并改正
8、之后,這些都會(huì)成 為寶貴的經(jīng)驗(yàn),這是單獨(dú)看書(shū)找不到的。這雖然是最后一次的單片機(jī)實(shí)驗(yàn)了,但學(xué)習(xí)并沒(méi)有 結(jié)束,在未來(lái)的日子里,我們依舊要多動(dòng)手,編寫(xiě)程序,要用到單片機(jī)的地方很多,只有不 停地實(shí)踐和練習(xí),我們才能夠?qū)W習(xí)得更好。六、附錄1. LCD顯示字符程序(keil編寫(xiě))#in clude <reg51.h>sbit LCD1602_RS = P2A0;sbit LCD1602_RW =卩2人1;sbit LCD1602_E =卩2人2;/*等待液晶準(zhǔn)備好*/void LcdWaitReady()un sig ned char sta;P0 = OxFF;LCD1602_RS = 0;
9、LCD1602_RW = 1;do LCD1602_E = 1;sta = P0; /讀取狀態(tài)字LCD1602_E = 0; while (sta & 0x80); bit7 等于1表示液晶正忙,重復(fù)檢測(cè)直到其等于0為止/*向LCD1602液晶寫(xiě)入一字節(jié)命令,cmd-待寫(xiě)入命令值 */void LcdWriteCmd( un sig ned char cmd)LcdWaitReady();LCD1602_RS = 0;LCD1602_RW = 0;P0 = cmd;LCD1602_E = 1;LCD1602_E = 0;/*向LCD1602液晶寫(xiě)入一字節(jié)數(shù)據(jù),dat-待寫(xiě)入數(shù)據(jù)值 */
10、void LcdWriteDat( un sig ned 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 LcdSetCurs or(un sig ned char x, un sig ned char y)un sig ned char addr;if (y :=0) /由輸入的屏幕坐標(biāo)計(jì)算顯示RAM的地址addr = 0x00 + x; /第一行字符地址從0x00起始
11、elseaddr = 0x40 + x; /第二行字符地址從0x40起始LcdWriteCmd(addr | 0x80); / 設(shè)置 RAM地址/*在液晶上顯示字符串,(x,y)-對(duì)應(yīng)屏幕上的起始坐標(biāo),str-字符串指針*/void LcdShowStr( un sig ned char x, un sig ned char y, un sig ned char *str)LcdSetCursor(x, y); / 設(shè)置起始地址while (*str != '0') /連續(xù)寫(xiě)入字符串?dāng)?shù)據(jù),直到檢測(cè)到結(jié)束符LcdWriteDat(*str+); /先取str指向的數(shù)據(jù),然后 st
12、r自加1/*初始化1602液晶*/void In itLcd1602()LcdWriteCmd(0x38); 16*2 顯示, 5*7 點(diǎn)陣, 8 位數(shù)據(jù)接口LcdWriteCmd(0x0C); /顯示器開(kāi),光標(biāo)關(guān)閉LcdWriteCmd(0x06); /文字不動(dòng),地址自動(dòng) +1LcdWriteCmd(0x01); / 清屏exter n void In itLcd1602();exter n void LcdShowStr( un sig ned char x, un sig ned char y, un sig ned char *str); void mai n()un sig ned
13、char str = "Hello"In itLcd1602();LcdShowStr(5, 0, str);LcdShowStr(0, 1, "Welcome to SWUST!");while (1);2. 溫度傳感器的液晶顯示程序#in clude <reg51.h>#in clude vintrin s.h>sbit IO_18B20 = P3A1; /DS18B20 通信引腳/*軟件延時(shí)函數(shù),延時(shí)時(shí)間(t*10)us */sbit LCD1602_RS =卩2人0;sbit LCD1602_RW =卩2人1;sbit LCD1
14、602_E =卩2人2;void DelayX10us( un sig ned char t)do _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_(); while (-t);/*復(fù)位總線,獲取存在脈沖,以啟動(dòng)一次讀寫(xiě)操作*/*等待液晶準(zhǔn)備好 */void LcdWaitReady()un sig ned char sta;P0 = OxFF;LCD1602_RS = 0;LCD1602_RW = 1;do LCD1602_E = 1;sta = P0; /讀取狀態(tài)字LCD1602_E = 0;0為止 while (s
15、ta & 0x80); bit7等于1表示液晶正忙,重復(fù)檢測(cè)直到其等于/*向LCD1602液晶寫(xiě)入一字節(jié)命令,cmd-待寫(xiě)入命令值 */void LcdWriteCmd( un sig ned char cmd)LcdWaitReady();LCD1602_RS = 0;LCD1602_RW = 0;P0 = cmd;LCD1602_E = 1;LCD1602_E = 0;/*向LCD1602液晶寫(xiě)入一字節(jié)數(shù)據(jù),dat-待寫(xiě)入數(shù)據(jù)值*/void LcdWriteDat( un sig ned char dat)LcdWaitReady();LCD1602_RS = 1;LCD1602_
16、RW = 0;P0 = dat;LCD1602_E = 1;LCD1602_E = 0;/*設(shè)置顯示 RAM 起始地址,亦即光標(biāo)位置,(x,y)-對(duì)應(yīng)屏幕上的字符坐標(biāo)*/void LcdSetCurs or(un sig ned char x, un sig ned char y)un sig ned char addr;if (y = 0) /由輸入的屏幕坐標(biāo)計(jì)算顯示RAM 的地址addr = 0x00 + x; /第一行字符地址從0x00起始elseaddr = 0x40 + x; /第二行字符地址從0x40起始LcdWriteCmd(addr | 0x80); / 設(shè)置 RAM 地址/*
17、在液晶上顯示字符串,(x,y)-對(duì)應(yīng)屏幕上的起始坐標(biāo),str-字符串指針*/void LcdShowStr( un sig ned char x, un sig ned char y, un sig ned char *str)LcdSetCursor(x, y); / 設(shè)置起始地址while (*str != '0') /連續(xù)寫(xiě)入字符串?dāng)?shù)據(jù),直到檢測(cè)到結(jié)束符LcdWriteDat(*str+); /先取str指向的數(shù)據(jù),然后 str自加1/*初始化1602液晶*/void In itLcd1602()LcdWriteCmd(0x38); 1116*2顯示, 5*7 點(diǎn)陣, 8
18、 位數(shù)據(jù)接口LcdWriteCmd(OxOC); /顯示器開(kāi),光標(biāo)關(guān)閉LcdWriteCmd(0x06); /文字不動(dòng),地址自動(dòng) +1LcdWriteCmd(0x01); / 清屏bit Get18B20Ack()bit ack;EA = 0; /禁止總中斷IO_18B20 = 0; /產(chǎn)生 500us復(fù)位脈沖DelayX10us(50);IO_18B20 = 1;DelayX10us(6); / 延時(shí) 60usack = IO_18B20; /讀取存在脈沖while(!IO_18B2O); /等待存在脈沖結(jié)束EA = 1; /重新使能總中斷return ack;/*向DS18B20寫(xiě)入一個(gè)字
19、節(jié),dat-待寫(xiě)入字節(jié) */void Write18B20(u nsig ned char dat)un sig ned char mask;EA = 0; /禁止總中斷for (mask=0x01; mask!=0; mask<<=1) / 低位在先,依次移出8 個(gè) bitIO_18B20 = 0; /產(chǎn)生 2us低電平脈沖_nop_();_nop_();if (mask&dat) = 0) / 輸出該 bit 值IO_18B20 = 0;elseIO_18B20 = 1;DelayX10us(6); / 延時(shí) 60usIO_18B20 = 1; /拉高通信引腳EA =
20、1; /重新使能總中斷/*從DS18B20讀取一個(gè)字節(jié),返回值 -讀到的字節(jié) */un sig ned char Read18B20()un sig ned char dat;un sig ned char mask;EA = 0; /禁止總中斷for (mask=0x01; mask!=0; mask<<=1) / 低位在先,依次采集 8 個(gè) bitIO_18B20 = 0; /產(chǎn)生 2us低電平脈沖_nop_();_nop_();IO_18B20 = 1; /結(jié)束低電平脈沖,等待18B20輸出數(shù)據(jù)_nop_(); / 延時(shí) 2us_nop_();if (!IO_18B20) /
21、讀取通信引腳上的值dat &= mask;elsedat |= mask;DelayX10us(6); / 再延時(shí) 60usEA = 1; /重新使能總中斷return dat;/*啟動(dòng)一次18B20溫度轉(zhuǎn)換,返回值-表示是否啟動(dòng)成功*/bit Start18B20()bit ack;ack = Get18B20Ack(); /執(zhí)行總線復(fù)位,并獲取18B20應(yīng)答if (ack = 0) /女口 18B20正確應(yīng)答,則啟動(dòng)一次轉(zhuǎn)換Write18B20(0xCC); / 跳過(guò) ROM 操作Write18B20(0x44); /啟動(dòng)一次溫度轉(zhuǎn)換return ack; ack=0表示操作成功,
22、所以返回值對(duì)其取反/*讀取DS18B20轉(zhuǎn)換的溫度值,返回值-表示是否讀取成功*/bit Get18B20Temp( int *temp)bit ack;un sig ned char LSB, MSB; 16bit 溫度值的低字節(jié)和高字節(jié)ack = Get18B20Ack(); /執(zhí)行總線復(fù)位,并獲取18B20應(yīng)答if (ack = 0) /女口 18B20正確應(yīng)答,則讀取溫度值Write18B20(0xCC); / 跳過(guò) ROM 操作Write18B20(0xBE); / 發(fā)送讀命令LSB = Read18B20(); /讀溫度值的低字節(jié)MSB = Read18B20(); II讀溫度值的
23、高字節(jié)*temp = (int)MSB << 8) + LSB; II 合成為 16bit 整型數(shù)return ack; IIack=0表示操作應(yīng)答,所以返回值為其取反值bit flagls = 0; II1s 定時(shí)標(biāo)志un sig ned char TORH = 0; /ITO 重載值的高字節(jié)un sig ned char TORL = 0; IIT0 重載值的低字節(jié)/*整型數(shù)轉(zhuǎn)換為字符串,str-字符串指針,dat彳寺轉(zhuǎn)換數(shù),返回值-字符串長(zhǎng)度*/unsigned char IntToString(unsigned char *str, int dat) sig ned cha
24、r i = 0;un sig ned char len = 0;un sig ned char buf6;if (dat < 0) /如果為負(fù)數(shù),首先取絕對(duì)值,并在指針上添加負(fù)號(hào)dat = -dat;*str+ ='-'len+;do /先轉(zhuǎn)換為低位在前的十進(jìn)制數(shù)組bufi+ = dat % 10;dat /= 10; while (dat > 0);len += i; /i最后的值就是有效字符的個(gè)數(shù)while (i- > 0) /將數(shù)組值轉(zhuǎn)換為ASCII碼反向拷貝到接收指針上*str+ = bufi + '0'*str = '0
25、9; /添加字符串結(jié)束符return len; /返回字符串長(zhǎng)度/*配置并啟動(dòng) T0, ms-T0定時(shí)時(shí)間*/void Con figTimer0 (un sig ned int ms)un sig ned long tmp; 臨時(shí)變量tmp = (tmp * ms) / 1000; /計(jì)算所需的計(jì)數(shù)值tmp = 65536 - tmp; /計(jì)算定時(shí)器重載值tmp = tmp + 12; /補(bǔ)償中斷響應(yīng)延時(shí)造成的誤差TORH = (unsigned char)(tmp>>8); /定時(shí)器重載值拆分為高低字節(jié)TORL = (un sig ned char)tmp;TMOD &= OxFO; /清零 T0的控制位TMOD |= 0x01; / 配置 T0 為模式 1TH0 = T0RH; /力口載 T0重載值TL0 = T0RL;ET0 = 1; /使能T0中斷TR0 = 1; / 啟動(dòng) T0/* T0中斷服務(wù)函數(shù),完成1秒定時(shí)*/ void In terruptTimer0() in terrupt 1static un sig ned char tmr1s = 0;TH0 = T0
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝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ù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 小學(xué)三個(gè)課堂管理制度
- 吉林動(dòng)畫(huà)學(xué)院管理制度
- 單位工作安全管理制度
- 凈化車(chē)間供暖管理制度
- 攪拌設(shè)備清洗方案(3篇)
- 招商方案策劃(3篇)
- 商場(chǎng)擺攤預(yù)算方案(3篇)
- 工程安全論證方案(3篇)
- DB62T 4396-2021 高壓天然氣儲(chǔ)氣井定期檢驗(yàn)規(guī)范
- 商場(chǎng)燈籠采購(gòu)方案(3篇)
- HG∕T 4591-2014 化工液力透平
- 國(guó)家開(kāi)放大學(xué)《工程地質(zhì)(本)》形考作業(yè)-1-4參考答案
- 2024年新疆發(fā)聲亮劍發(fā)言稿3則
- 測(cè)試治具加工項(xiàng)目策劃方案
- 江蘇省南京市建鄴區(qū)2023-2024學(xué)年五年級(jí)下學(xué)期6月期末英語(yǔ)試題
- 福建省漳州市2023-2024學(xué)年八年級(jí)下學(xué)期期末數(shù)學(xué)試題
- 特殊教育概論-期末大作業(yè)-國(guó)開(kāi)-參考資料
- 服務(wù)質(zhì)量評(píng)價(jià)體系構(gòu)建
- ISO 15609-1 2019 金屬材料焊接工藝規(guī)程和評(píng)定-焊接工藝規(guī)程-電弧焊(中文版)
- 醫(yī)療器械銷售授權(quán)證書(shū)審批指南
- 陪診公司推廣方案
評(píng)論
0/150
提交評(píng)論