




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、#include <reg51.h>#include <intrins.h>#define uchar unsigned char#define uint unsigned intsbit DQ = P33; /定義DS18B20端口DQ sbit BEEP=P37 ; /蜂鳴器驅(qū)動線bit presence,flag;bit compare_th,compare_tl,alarm_on_off=0,temp_th,temp_tl;sbit LCD_RS = P20; sbit LCD_RW = P21;sbit LCD_EN = P22;sbit K1 = P14;s
2、bit K2 = P15;sbit K3 = P16;sbit K4 = P17;uchar code cdis1 = " READ_ROMCORD "uchar code cdis2 = " "uchar code cdis3 = " DS18B20 ERROR "uchar code cdis4 = " PLEASE CHECK "uchar code cdis5 = " TEMP: "uchar code cdis6 = "TH: TL: "unsigned char
3、data temp_data2 = 0x00,0x00;unsigned char data temp_alarm2 = 0x00,0x00;unsigned char data display5 = 0x00,0x00,0x00,0x00,0x00; /溫度值顯示unsigned char data display13 = 0x00,0x00,0x00; /溫度報警值顯示/unsigned char code ditab16 = 0x00,0x01,0x01,0x02,0x03,0x03,0x04,0x04,/ 0x05,0x06,0x06,0x07,0x08,0x08,0x09,0x09;
4、unsigned char data RomCode8 = 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00;unsigned char code mytab18 = 0x0C,0x12,0x12,0x0C,0x00,0x00,0x00,0x00;unsigned char code mytab28 = 0x01,0x1b,0x1d,0x19,0x1d,0x1b,0x01,0x00;/小喇叭#define delayNOP(); _nop_();_nop_();_nop_();_nop_();unsigned char Temp,temp_comp,timecou
5、nt,count;unsigned char crc;void Disp_Temp_alarm(uchar addr,uchar num);void spk(uchar addr);void set_temp_alarm();void temp_compare();void beep();/*/void delay1(int ms) unsigned char y; while(ms-) for(y = 0; y<250; y+) _nop_(); _nop_(); _nop_(); _nop_(); /*/* */*檢查LCD忙狀態(tài) */*lcd_busy為1時,忙,等待。lcd-bu
6、sy為0時,閑,可寫指令與數(shù)據(jù)。 */* */*/ bit lcd_busy() bit result; LCD_RS = 0; LCD_RW = 1; LCD_EN = 1; delayNOP(); result = (bit)(P0&0x80); LCD_EN = 0; return(result); /*/* */*寫指令數(shù)據(jù)到LCD */*RS=L,RW=L,E=高脈沖,D0-D7=指令碼。 */* */*/void lcd_wcmd(uchar cmd) while(lcd_busy(); LCD_RS = 0; LCD_RW = 0; LCD_EN = 0; _nop_()
7、; _nop_(); P0 = cmd; delayNOP(); LCD_EN = 1; delayNOP(); LCD_EN = 0; /*/* */*寫顯示數(shù)據(jù)到LCD */*RS=H,RW=L,E=高脈沖,D0-D7=數(shù)據(jù)。 */* */*/void lcd_wdat(uchar dat) while(lcd_busy(); LCD_RS = 1; LCD_RW = 0; LCD_EN = 0; P0 = dat; delayNOP(); LCD_EN = 1; delayNOP(); LCD_EN = 0; /*/* */*自定義字符寫入CGRAM */* */*/void write
8、tab() unsigned char i; lcd_wcmd(0x40); /寫CGRAM for (i = 0; i< 8; i+) lcd_wdat(mytab1i); for (i = 0; i< 8; i+) lcd_wdat(mytab2i); /*/* */* LCD初始化設(shè)定 */* */*/void lcd_init() delay1(15); lcd_wcmd(0x01); /清除LCD的顯示內(nèi)容 lcd_wcmd(0x38); /16*2顯示,5*7點陣,8位數(shù)據(jù) delay1(5); lcd_wcmd(0x38); delay1(5); lcd_wcmd(0
9、x38); delay1(5); lcd_wcmd(0x0c); /顯示開,關(guān)光標(biāo) delay1(5); lcd_wcmd(0x06); /移動光標(biāo) delay1(5); lcd_wcmd(0x01); /清除LCD的顯示內(nèi)容 delay1(5);writetab(); /自定義字符寫入CGRAM/*/* */* 設(shè)定顯示位置 */* */*/void lcd_pos(uchar pos) lcd_wcmd(pos | 0x80); /數(shù)據(jù)指針=80+地址變量/*/* */*us級延時函數(shù) */* */*/void Delay(unsigned int num) while( -num );/
10、*/* */*初始化ds1820 */* */*/Init_DS18B20(void) DQ = 1; /DQ復(fù)位 Delay(8); /稍做延時 DQ = 0; /單片機將DQ拉低 Delay(90); /精確延時 大于 480us DQ = 1; /拉高總線 Delay(8); presence = DQ; /如果=0則初始化成功 =1則初始化失敗 Delay(100); DQ = 1; return(presence); /返回信號,0=presence,1= no presence/*/* */* 讀一個字節(jié) */* */*/ReadOneChar(void) unsigned cha
11、r i = 0; unsigned char dat = 0; for (i = 8; i > 0; i-) DQ = 0; / 給脈沖信號 dat >>= 1; DQ = 1; / 給脈沖信號 if(DQ) dat |= 0x80; Delay(4); return (dat);/*/* */* 寫一個字節(jié) */* */*/WriteOneChar(unsigned char dat) unsigned char i = 0; for (i = 8; i > 0; i-) DQ = 0; DQ = dat&0x01; Delay(5); DQ = 1; dat
12、>>=1; /*/* */* 溫度報警值寫入DS18B20 */* */*/Write_Temperature_alarm(void) Init_DS18B20(); WriteOneChar(0xCC); /跳過讀序號列號的操作 WriteOneChar(0x4e); /將設(shè)定的溫度報警值寫入 DS18B20WriteOneChar(temp_alarm0); /寫THWriteOneChar(temp_alarm1); /寫TL WriteOneChar(0x7f); /12位精確度Init_DS18B20(); WriteOneChar(0xCC); /跳過讀序號列號的操作
13、WriteOneChar(0x48); /把暫存器里的溫度報警值拷貝到EEROM/*/* */* 讀取64位序列碼 */* */*/Read_RomCord(void) unsigned char j; Init_DS18B20(); WriteOneChar(0x33); / 讀序列碼的操作 for (j = 0; j < 8; j+) RomCodej = ReadOneChar() ; /*/* */*DS18B20的CRC8校驗程序 */* */*/uchar CRC8() uchar i,x; uchar crcbuff; crc=0; for(x = 0; x <8;
14、x+) crcbuff=RomCodex; for(i = 0; i < 8; i+) if(crc crcbuff)&0x01)=0) crc >>= 1; else crc = 0x18; /CRC=X8+X5+X4+1 crc >>= 1; crc |= 0x80; crcbuff >>= 1; return crc; /*/* */* 數(shù)據(jù)轉(zhuǎn)換與顯示 */* */*/Disp_RomCode(uchar H_num) uchar j; if(H_num=1) lcd_pos(0x00); if(H_num=2) lcd_pos(0x40
15、); for(j=0;j<8;j+) Temp = RomCodej; display0=(Temp&0xf0)>>4); if(display0>9) display0=display0+0x37; elsedisplay0=display0+0x30; lcd_wdat(display0); /高位數(shù)顯示 display1=(Temp&0x0f); if(display1>9) display1=display1+0x37; else display1=display1+0x30; lcd_wdat(display1); /低位數(shù)顯示 /*/*
16、 */* 讀取溫度 */* */*/Read_Temperature(void) uchar i; TR0=0; /關(guān)中斷,防止讀數(shù)錯誤 Init_DS18B20(); WriteOneChar(0xCC); /跳過讀序號列號的操作 WriteOneChar(0x44); /啟動溫度轉(zhuǎn)換 Init_DS18B20(); WriteOneChar(0x55); /匹配ROM命令 for(i=0;i<8;i+) WriteOneChar(RomCodei); WriteOneChar(0xBE); /讀取溫度寄存器 temp_data0 = ReadOneChar(); /溫度低8位 tem
17、p_data1 = ReadOneChar(); /溫度高8位 temp_alarm0 = ReadOneChar(); /溫度報警THtemp_alarm1 = ReadOneChar(); /溫度報警TLtemp_comp=(temp_data0&0xf0)>>4)|(temp_data1&0x0f)<<4); /取溫度整數(shù)值 TR0=1; /開中斷/*/* */* 數(shù)據(jù)轉(zhuǎn)換與溫度顯示 */* */*/Disp_Temperature() uchar s=0; if(temp_data1>127) /溫度為負值 temp_data0=(temp
18、_data0)+1; /取反加一,將補碼變成原碼 if(temp_data0)>=0xff) temp_data1=(temp_data1)+1; else temp_data1=temp_data1; s=1; display4=temp_data0&0x0f; display0=(display4*10/16)+0x30; display4=(temp_data0&0xf0)>>4)|(temp_data1&0x0f)<<4); display3=display4/100+0x30; display1=display4%100; dis
19、play2=display1/10+0x30; display1=display1%10+0x30; if(display3=0x30) /高位為0,不顯示 display3=0x20; if(display2=0x30) /次高位為0,不顯示 display2=0x20; if(s) display3=0x2d; /顯示負號 lcd_pos(0x07); lcd_wdat(display3); /百位數(shù)顯示 lcd_wdat(display2); /十位數(shù)顯示 lcd_wdat(display1); /個位數(shù)顯示 lcd_wdat('.'); lcd_wdat(display
20、0); /小數(shù)位數(shù)顯示lcd_wdat(0x00); /顯示自定義字符 lcd_wdat('C'); /顯示C /*/* */* 蜂鳴器響一聲 */* */*/void beep() unsigned char y; for (y=0;y<100;y+) Delay(70); BEEP=!BEEP; /BEEP取反 BEEP=1; /關(guān)閉蜂鳴器Delay(25000);/*/* */* ROMCORD 顯示菜單 */* */*/void RomCode_Menu () uchar m; lcd_init(); /初始化LCD lcd_pos(0); /設(shè)置顯示位置為第一行
21、 for(m=0;m<16;m+) /顯示字符 lcd_wdat(cdis1m); Read_RomCord(); /讀取64位序列碼 CRC8(); /CRC效驗 if(crc=0) /CRC效驗正確 Disp_RomCode(2); /顯示64位序列碼 /*/* */* DS18B20 ERROR 顯示菜單 */* */*/void Error_Menu () uchar m; lcd_init(); /初始化LCD lcd_pos(0); /設(shè)置顯示位置為第一行的第1個字符 for(m=0;m<16;m+) lcd_wdat(cdis3m); /顯示字符 lcd_pos(0x
22、40); /設(shè)置顯示位置為第二行第1個字符 for(m=0;m<16;m+) lcd_wdat(cdis4m); /顯示字符/*/* */* DS18B20 正常顯示菜單 */* */*/void Natural_Menu () uchar m; lcd_init(); /初始化LCD lcd_pos(0); /設(shè)置顯示位置為第一行的第1個字符 for(m=0;m<16;m+) lcd_wdat(cdis5m); /顯示字符 lcd_pos(0x40); /設(shè)置顯示位置為第二行第1個字符 for(m=0;m<16;m+) lcd_wdat(cdis6m); /顯示字符 Rea
23、d_Temperature(); Disp_Temp_alarm(0x43,0); /顯示TH值 Disp_Temp_alarm(0x4b,1); /顯示TL值 Disp_Temperature(); /顯示實時溫度值/*/* */* 主函數(shù) */* */*/void main() uchar m; TMOD=0x01; TH0=0x4c; TL0=0x00; /50ms定時 EA=1; ET0=1; TR0=1; while(1) Init_DS18B20(); if(presence) Error_Menu ();do Init_DS18B20(); beep(); while(prese
24、nce); RomCode_Menu (); /顯示RomCode for(m=0;m<10;m+) Delay(50000); Natural_Menu (); do Read_Temperature(); Disp_Temperature(); temp_compare(); set_temp_alarm(); if(!K4) beep();while(!K4); /等待鍵釋放 alarm_on_off=alarm_on_off; if(!K1) beep();while(!K1); /等待鍵釋放 RomCode_Menu (); /顯示RomCode while(K2); /等待K
25、2鍵按下 beep(); Natural_Menu (); while(!presence); /end of while(1) /end of main()/*/ 顯示報警溫度/*/void Disp_Temp_alarm(uchar addr,uchar num) /0=TH,1=TL display12=temp_alarmnum/100+0x30; display10=temp_alarmnum%100; display11=display10/10+0x30; display10=display10%10+0x30; if(display12=0x30) /高位為0,不顯示 display12=0x20; if(display11=0x30) /次高位為0,不顯示 display11=0x20; lcd_pos(addr); lcd_wdat(display12); /百位數(shù)顯示 lcd_wdat(display11); /十位數(shù)顯示 lcd_wdat(display10); /個位數(shù)顯示 /
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 保定吊車出租合同范本
- 修建門樓合同范本
- 廠房代理托管合同范本
- 福建2025年02月福州市鼓樓區(qū)鼓東街道公開招考1名社區(qū)工作人員筆試歷年典型考題(歷年真題考點)解題思路附帶答案詳解
- ktv供貨協(xié)議合同范本
- 取土合同范例
- 買房贈予協(xié)議合同范本
- 四川雅茶集團茶業(yè)有限公司2024年第一期公開招聘人員總排名及考察人員筆試參考題庫附帶答案詳解
- 焦炭買賣合同范本
- 應(yīng)用類課題申報書范文
- 2025年黑龍江交通職業(yè)技術(shù)學(xué)院單招職業(yè)技能測試題庫必考題
- 個人畫協(xié)議合同范本
- 2024-2025學(xué)年高一下學(xué)期開學(xué)第一節(jié)課(哪吒精神)主題班會課件
- 人教版2025-初中物理實驗室實驗課程安排
- 2024年無錫科技職業(yè)學(xué)院高職單招語文歷年參考題庫含答案解析
- 舞蹈藝術(shù)賞析課件
- 2025江蘇泰州興化市陳堡鎮(zhèn)村級后備干部招聘10人歷年高頻重點提升(共500題)附帶答案詳解
- 2025中冶建工集團限公司校園招聘114人高頻重點提升(共500題)附帶答案詳解
- (完整版)python學(xué)習(xí)課件
- CNAS-RL01:2019實驗室認可規(guī)則
- 2025中國人民解放軍空軍部隊軍工廠招聘21人管理單位筆試遴選500模擬題附帶答案詳解
評論
0/150
提交評論