多點(diǎn)溫度檢測系統(tǒng)_第1頁
多點(diǎn)溫度檢測系統(tǒng)_第2頁
多點(diǎn)溫度檢測系統(tǒng)_第3頁
多點(diǎn)溫度檢測系統(tǒng)_第4頁
多點(diǎn)溫度檢測系統(tǒng)_第5頁
已閱讀5頁,還剩53頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

元件型號元件名稱元件標(biāo)號數(shù)量蜂鳴器蜂鳴器B1110uF電容C1120pF電容C2,C32發(fā)光二極管發(fā)光二極管D2,D32Relay-SPDT繼電器K1,K22LCD1602液晶LCD119012三極管Q1,Q2,Q332K電阻R1,R2,R6,R7,R8,R9610K電阻R4,R52SW-PB按鍵S1,S2,S3,S44sw-灰色電源開關(guān)SW11DS18B20溫度傳感器U13STC589C51單片機(jī)U2112M晶振Y11

附錄2PCB圖

附錄3實(shí)物圖

附錄4源代碼#include<reg52.h>#include<intrins.h>#defineMAXNUM8//定義最多有8個(gè)DS18B20sbitDQ=P3^5;//定義DS18B20數(shù)據(jù)線sbitRS=P1^1; //液晶端口控制線端口定義sbitRW=P1^2; //液晶端口控制線端口定義sbitE=P1^4; //液晶端口控制線端口定義sbitkeyenter=P3^2;sbitkeyup=P1^3;sbitkeydown=P1^6;sbitled0=P2^0;sbitled1=P2^1;sbitled2=P2^2;sbitled3=P2^3;sbitled4=P2^4;sbitled5=P2^5;sbitled6=P2^6;sbitled7=P2^7;sbitbuzzer=P3^7;unsignedcharkeyflag=0;unsignedcharcodelcd0[]={"SEARCHROMING..."};unsignedcharcodelcd1[]={"SEARCHROMOK!"};unsignedcharcodelcd2[]={"Thetotalis:"};unsignedcharcodelcd3[]={"No.():"};unsignedcharcodelcd4[]={'0','1','2','3','4','5','6','7','8','9','.',0xdf,0x43,''};unsignedcharcodesetinfo[]={"SetAlarmPoint:"};unsignedcharcodepointinfo[]={"Alarm:"};signedchartempalarm=0;//0xdf在1602中是“℃”符號的左上角那個(gè)圓,0X43是大寫的"C"他們一起構(gòu)成了”℃“這個(gè)符號unsignedchardat;//用來顯示溫度的參數(shù) unsignedchartemp_l,temp_h,negetiveflag=0,temp_over,t;unsignedcharnum=0;unsignedinti;idataunsignedcharal[MAXNUM];idataunsignedcharID[MAXNUM];signedcharalarm=30;//默認(rèn)為30攝氏度報(bào)警/***********************液晶模塊**********************************/voiddelaylcd(void)//延時(shí)程序{ unsignedchary; for(y=0;y<250;y++);}voidLCD_write_com(unsignedcharcom)//液晶寫命令函數(shù){ delaylcd();RS=0;//RS為1寫命令RW=0; E=0; E=1;P0=com; E=0; delaylcd();}voidLCD_write_data(unsignedchardat)//液晶寫數(shù)據(jù)函數(shù){ delaylcd(); RS=1;//RS為1寫數(shù)據(jù) RW=0; E=0; E=1; P0=dat; E=0; delaylcd();}voidlcdinit(void)//初始化{ LCD_write_com(0x01);//液晶清屏 LCD_write_com(0x38);//1602”功能設(shè)置命令字“顯示2行每行字體用5*8ASCII顯示 8位數(shù)據(jù)接口 LCD_write_com(0x0c);//顯示控制,開始顯示,不顯示游標(biāo),游標(biāo)不閃爍 LCD_write_com(0x06);//輸入方式為增量輸入,不移屏幕}/************************ds18b20****************************/voiddelay_nus(unsignedintn)//延時(shí)程序一次8+6(進(jìn)出)=14us{ while(n--);}voidreset(void)//ds18b20初始化復(fù)位操作{ unsignedcharx=0; DQ=1; //DQ復(fù)位 delay_nus(8); //稍做延時(shí) DQ=0; //單片機(jī)將DQ拉低 delay_nus(80); //精確延時(shí)大于480us DQ=1; //拉高總線 delay_nus(10); x=DQ; //稍做延時(shí)后如果x=0則初始化成功x=1則初始化失敗 delay_nus(5);}voidwrite_bit(unsignedchardat) //DS18B20寫一位操作{ DQ=0; _nop_();_nop_(); DQ=dat&0x01;delay_nus(5); DQ=1;}voidwrite_byte(unsignedchardat)//寫一個(gè)字節(jié){ unsignedchari,j; for(i=8;i>0;i--) { j=dat&0x01; write_bit(j); dat>>=1;}}unsignedcharread_2bit(void)//讀二位子程序{ unsignedchari; unsignedchardat=0; for(i=2;i>0;i--) { DQ=0;//給脈沖信號 dat<<=1; DQ=1;//給脈沖信號 if(DQ) dat|=0x01; delay_nus(4); } return(dat);}unsignedcharread_byte(void)//讀一個(gè)字節(jié)子程序{ unsignedchari=0; unsignedchardat=0; for(i=8;i>0;i--) { DQ=0;//給脈沖信號 dat>>=1; DQ=1;//給脈沖信號 if(DQ) dat|=0x80; delay_nus(4); } return(dat);}voiddelay_nms(unsignedintn){ unsignedintj=0; unsignedchari=0; for(j=0;j<n;j++) { for(i=0;i<120;i++) { _nop_(); } }}voidread_temp(unsignedcharnum_data)//讀取溫度子程序參數(shù)表示讀第幾個(gè)傳感器{ unsignedcharf; reset(); write_byte(0xcc);//發(fā)送跳過ROM號命令 write_byte(0x44);//發(fā)送溫度轉(zhuǎn)換命令 delay_nms(2000); reset(); write_byte(0x55);//發(fā)送匹配ROM號命令 for(f=0;f<8;f++)//8字節(jié)ROM號 { write_byte(ID[num_data][f]);//發(fā)匹配ROM } delay_nus(100); write_byte(0xbe);//讀寄存器命令 delay_nus(100); temp_l=read_byte(); temp_h=read_byte();}voidtemp_convert(void)//溫度轉(zhuǎn)換{ negetiveflag=0; negetiveflag=temp_h&0x80; if(negetiveflag) { negetiveflag=1; temp_h=~temp_h; if(temp_l==0) { temp_h++;//若低8位全為0且溫度為負(fù),取補(bǔ)時(shí)就要向高位進(jìn)1 } temp_l=~temp_l+1; } temp_h<<=4; temp_l>>=4; temp_over=temp_h|temp_l; tempalarm=temp_over; if(negetiveflag==1) { tempalarm=tempalarm*(-1); }}/*******************顯示***************************/voidsearch_cartoon(void)//搜索ROM動(dòng)畫{ lcdinit(); LCD_write_com(0x80);//液晶第一行地址for(i=0;i<16;i++) { LCD_write_data(lcd0[i]); } LCD_write_com(0xc0);//液晶第二行地址for(i=0;i<16;i++) { LCD_write_data(0xff);//顯示類似進(jìn)度條的黑點(diǎn) delay_nms(num*80); } }voiddisplay_alarm_normal(signedcharalarm_data)//顯示報(bào)警溫度{ unsignedintdata_b,data_temp,l,datx={0}; data_b=alarm_data; negetiveflag=0;LCD_write_com(0x80); for(l=0;l<6;l++) { LCD_write_data(pointinfo[l]); } if(alarm_data>=0) { data_b=alarm_data/100;//百位// } else { negetiveflag=1; alarm_data=alarm_data*(-1);//變成正溫度 } data_temp=alarm_data%100;//對100取余,也就是十位數(shù)和個(gè)位數(shù) datx=data_temp/10;//十位 datx=data_temp%10;//個(gè)位 datx=13;//空格符號 datx=13;//空格符號 datx=11;//攝氏度符號 datx=12;//攝氏度符號 LCD_write_com(0x88); if(negetiveflag==1) { LCD_write_data(0x2d);//顯示"-"“負(fù)號” } else { LCD_write_data(lcd4[data_b]);//如果大于0就顯示百位數(shù),否則百位數(shù)就顯示“負(fù)號” } for(l=0;l<6;l++)//顯示報(bào)警值和攝氏度符號 { LCD_write_data(lcd4[datx[l]]); } }voiddisplay_total(void) //顯示搜索到的DS18B20傳感器數(shù)目{ lcdinit(); LCD_write_com(0x80);//第一行地址for(i=0;i<14;i++) { LCD_write_data(lcd1[i]); } LCD_write_com(0xc0);//第二行地址for(i=0;i<13;i++) { LCD_write_data(lcd2[i]); } LCD_write_data(lcd4[num]); delay_nms(2000); lcdinit(); //清屏,準(zhǔn)備顯示溫度 display_alarm_normal(alarm);//顯示報(bào)警溫度}voiddisplay_ds18b20(i)//顯示編號為i的DS18B20的溫度//{ unsignedintdata_b,data_temp,l; data_b=temp_over/100;//百位// data_temp=temp_over%100; dat=data_temp/10;//十位// dat=data_temp%10;//個(gè)位// dat=13;//空格 dat=13;//空格 dat=11;//攝氏度符號 dat=12;//攝氏度符號 LCD_write_com(0xc0); for(l=0;l<7;l++) { LCD_write_data(lcd3[l]); } LCD_write_com(0xc4); LCD_write_data(lcd4[++i]); LCD_write_com(0xc8); if(negetiveflag==1) { LCD_write_data(0x2d); } else { LCD_write_data(lcd4[data_b]); } for(l=0;l<6;l++) LCD_write_data(lcd4[dat[l]]); delay_nms(1000);}voiddisplay_alarm(signedcharalarm_data)//顯示報(bào)警溫度{ unsignedintdata_b,data_temp,l; data_b=alarm_data; negetiveflag=0; if(alarm_data>=0) { data_b=alarm_data/100;//百位// } else { negetiveflag=1; alarm_data=alarm_data*(-1);//變成正溫度 } data_temp=alarm_data%100;//對100取余,也就是十位數(shù)和個(gè)位數(shù) dat=data_temp/10;//十位 dat=data_temp%10;//個(gè)位 dat=13;//空格符號 dat=11;//攝氏度符號 dat=12;//攝氏度符號 if(keyflag==1)//剛剛進(jìn)入設(shè)置報(bào)警溫度 { lcdinit(); LCD_write_com(0x80);//第一行地址 for(l=0;l<16;l++) { LCD_write_data(setinfo[l]); } LCD_write_com(0xc0);//第二行地址 for(l=0;l<8;l++) { LCD_write_data(pointinfo[l]); } } LCD_write_com(0xc7); if(negetiveflag==1) { LCD_write_data(0x2d);//顯示"-"“負(fù)號” } else { LCD_write_data(lcd4[data_b]);//如果大于0就顯示百位數(shù),否則百位數(shù)就顯示“負(fù)號” } for(l=0;l<5;l++)//顯示報(bào)警值和攝氏度符號 { LCD_write_data(lcd4[dat[l]]); } }/***********************自動(dòng)搜索ROM*****************************/voidsearch_rom(void)//搜索ROM{ unsignedchark=0,l=0,chongtuwei=0,m=0,n=0; unsignedchars=0; unsignedcharzhan[MAXNUM]; unsignedcharss; do { reset(); write_byte(0xf0);//搜索ROM命令 for(m=0;m<8;m++) { for(n=0;n<8;n++) { k=read_2bit();//讀兩位數(shù)據(jù) k=k&0x03; s>>=1; if(k==0x01)//01讀到的數(shù)據(jù)為0寫0此位為0的器件響應(yīng) { write_bit(0); ss[(m*8+n)]=0; } elseif(k==0x02)//讀到的數(shù)據(jù)為1寫1此位為1的器件響應(yīng) { s=s|0x80; write_bit(1); ss[(m*8+n)]=1; } elseif(k==0x00)//讀到的數(shù)據(jù)為0有沖突位判斷沖突位 { //如果沖突位大于棧頂寫0小于棧頂寫以前數(shù)據(jù)等于棧頂寫1 chongtuwei=m*8+n+1; if(chongtuwei>zhan[l]) { write_bit(0); ss[(m*8+n)]=0; zhan[++l]=chongtuwei; } elseif(chongtuwei<zhan[l]) { s=s|((ss[(m*8+n)]&0x01)<<7); write_bit(ss[(m*8+n)]); } elseif(chongtuwei==zhan[l]) { s=s|0x80; write_bit(1); ss[(m*8+n)]=1; l=l-1; } } else { gotoloop; } } ID[num][m]=s; } num++; } while(zhan[l]!=0&&(num<MAXNUM)); loop: search_cartoon(); display_total();}voidmain(void){ unsignedchari=0,t=0; delay_nms(50); IT0=0; EX0=1; EA=1;search_rom();//搜索ROM并且存儲(chǔ),把18B20的每一個(gè)ROM讀取出來,方便下次調(diào)用 reset(); while(1) { if(keyflag==0) { for(i=0;i<num;i++) //每一個(gè)ds18b20循環(huán)顯示 { if(keyflag==1)break; read_temp(i);//讀編號i的ds18b20的溫度 if(keyflag==1)break; temp_convert();//調(diào)用溫度轉(zhuǎn)換 if(keyflag==1)break; if(tempalarm>alarm)//報(bào)警判斷 { for(t=0;t<3;t++) { buzzer=0;//打開報(bào)警蜂鳴器 delay_nms(100); buzzer=1;//關(guān)閉報(bào)警蜂鳴器 delay_nms(100); } if(i==0) led0=0;//打開報(bào)警指示燈 if(i==1) led1=0;//打開報(bào)警指示燈 if(i==2) led2=0;//打開報(bào)警指示燈 if(i==3) led3=0;//打開報(bào)警指示燈 if(i==4) led4=0;//打開報(bào)警指示燈 if(i==5) led5=0;//打開報(bào)警指示燈 if(i==6) led6=0;//打開報(bào)警指示燈 if(i==7) led7=0;//打開報(bào)警指示燈 } else { if(i==0) led0=1;//打開報(bào)警指示燈 if(i==1) led1=1;//打開報(bào)警指示燈 if(i==2) led2=1;//打開報(bào)警指示燈 if(i==3) led3=1;//打開報(bào)警指示燈 if(i==4) led4=1;//打開報(bào)警指示燈 if(i==5) led5=1;//打開報(bào)警指示燈 if(i==6) led6=

溫馨提示

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

評論

0/150

提交評論