![DS18B20多點測溫51C程序_第1頁](http://file4.renrendoc.com/view2/M02/15/2A/wKhkFmbEGqWAAT0HAAFwdVhEi8Q203.jpg)
![DS18B20多點測溫51C程序_第2頁](http://file4.renrendoc.com/view2/M02/15/2A/wKhkFmbEGqWAAT0HAAFwdVhEi8Q2032.jpg)
![DS18B20多點測溫51C程序_第3頁](http://file4.renrendoc.com/view2/M02/15/2A/wKhkFmbEGqWAAT0HAAFwdVhEi8Q2033.jpg)
![DS18B20多點測溫51C程序_第4頁](http://file4.renrendoc.com/view2/M02/15/2A/wKhkFmbEGqWAAT0HAAFwdVhEi8Q2034.jpg)
![DS18B20多點測溫51C程序_第5頁](http://file4.renrendoc.com/view2/M02/15/2A/wKhkFmbEGqWAAT0HAAFwdVhEi8Q2035.jpg)
版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
第頁DS18B20多點測溫由于本人在前兩天找DS18B20多點測溫(51C程序),網(wǎng)上下載了很多,但是都不是很理想,后來,自己總結前人的知識,重新寫了這個程序。其中包括程序一:單個讀序列號。程序二,匹配并且讀兩個DS18B20,當然,讀多個及讀兩個基本原理一樣,只要加上其序列號等即可。本程序所有顯示都是用LCD1602顯示。程序一:度序列號,并用1602顯示,1602從左到右分別是低到高位。#include<reg51.h>#defineucharunsignedchar#defineuintunsignedintsbitDQ=P3^7;//ds18b20及單片機連接口sbitRS=P3^0;sbitRW=P3^1;sbitEN=P3^2;unsignedcharcodestr1[]={""};unsignedcharcodestr2[]={""};ucharfCode[8];uchardatadisdata[5];uinttvalue;//溫度值uchartflag;//溫度正負標志/*************************lcd1602程序**************************/voiddelay1ms(unsignedintms)//延時1毫秒(不夠精確的){unsignedinti,j;for(i=0;i<ms;i++)for(j=0;j<100;j++);voidwr_com(unsignedcharcom)//寫指令//{delay1ms(1);RS=0;RW=0;EN=0;P2=com;delay1ms(1);EN=1;delay1ms(1);EN=0;voidwr_dat(unsignedchardat)//寫數(shù)據(jù)//{delay1ms(1);;RS=1;RW=0;EN=0;P2=dat;delay1ms(1);EN=1;delay1ms(1);EN=0;voidlcd_init()//初始化設置//{delay1ms(15);wr_com(0x38);delay1ms(5);wr_com(0x08);delay1ms(5);wr_com(0x01);delay1ms(5);wr_com(0x06);delay1ms(5);wr_com(0x0c);delay1ms(5);voiddisplay(unsignedchar*p)//顯示//while(*p!='\0')wr_dat(*p);p++;delay1ms(1);voidinit_play()//初始化顯示{lcd_init();wr_com(0x80);display(str1);wr_com(0xc0);display(str2);/******************************ds1820*********************/voiddelay_18B20(unsignedinti)//延時1微秒while(i--);voidds1820rst()/*ds1820復位*/{ucharx=0;DQ=1;//DQ復位delay_18B20(4);//延時DQ=0;//DQ拉低delay_18B20(100);//精確延時大于480usDQ=1;//拉高delay_18B20(40);uchards1820rd()/*讀數(shù)據(jù)*/{uchari=0;uchardat=0;for(i=8;i>0;i--){DQ=0;//給脈沖信號dat>>=1;DQ=1;//給脈沖信號if(DQ)dat|=0x80;delay_18B20(10);return(dat);voidds1820wr(ucharwdata)/*寫數(shù)據(jù)*/{uchari=0;for(i=8;i>0;i--){DQ=0;DQ=wdata&0x01;delay_18B20(10);DQ=1;wdata>>=1;read_temp()/*讀取溫度值并轉換*/{uchara,b;ds1820rst();ds1820wr(0xcc);//*跳過讀序列號*/ds1820wr(0x44);//*啟動溫度轉換*/ds1820rst();ds1820wr(0xcc);//*跳過讀序列號*/ds1820wr(0xbe);//*讀取溫度*/a=ds1820rd();b=ds1820rd();tvalue=b;tvalue<<=8;tvalue=tvalue|a;if(tvalue<0x0fff)tflag=0;else{tvalue=~tvalue+1;tflag=1;tvalue=tvalue*(0.625);//溫度值擴大10倍,精確到1位小數(shù)return(tvalue);voidds1820disp()//溫度值顯示{ucharflagdat;disdata[0]=tvalue/1000+0x30;//百位數(shù)disdata[1]=tvalue%1000/100+0x30;//十位數(shù)disdata[2]=tvalue%100/10+0x30;//個位數(shù)disdata[3]=tvalue%10+0x30;//小數(shù)位if(tflag==0)flagdat=0x20;//正溫度不顯示符號elseflagdat=0x2d;//負溫度顯示負號:-if(disdata[0]==0x30){disdata[0]=0x20;//如果百位為0,不顯示if(disdata[1]==0x30){disdata[1]=0x20;//如果百位為0,十位為0也不顯示wr_com(0xc0);wr_dat(flagdat);//顯示符號位wr_com(0xc1);wr_dat(disdata[0]);//顯示百位wr_com(0xc2);wr_dat(disdata[1]);//顯示十位wr_com(0xc3);wr_dat(disdata[2]);//顯示個位wr_com(0xc4);wr_dat(0x2e);//顯示小數(shù)點wr_com(0xc5);wr_dat(disdata[3]);//顯示小數(shù)位voidDispCode()unsignedchari,temp;ds1820rst();ds1820wr(0x33);for(i=0;i<8;i++)fCode[i]=ds1820rd();wr_com(0x80+0x40);for(i=0;i<8;i++)temp=fCode[i]>>4;//顯示高四位if(temp<10)wr_dat(temp+0x30);elsewr_dat(temp+0x37);temp=fCode[i]&0x0f;//顯示低四位if(temp<10)wr_dat(temp+0x30);elsewr_dat(temp+0x37);/********************主程序***********************************/voidmain() init_play();//初始化顯示 DispCode(); //系列號顯示 delay1ms(1000);while(1){//read_temp();//讀取溫度//ds1820disp();//顯示程序二:匹配序列號,并讀溫度。#include<reg51.h>#include<intrins.h>#defineucharunsignedchar#defineuintunsignedintsbitRS=P3^0; sbitRW=P3^1;sbitEN=P3^2;sbitDQ=P3^7; ucharcodestr1[]={0x28,0x08,0xA7,0xBA,0x02,0x00,0x00,0x18}; //ROM1ucharcodestr2[]={0x28,0x0C,0xBA,0xBA,0x02,0x00,0x00,0x54}; //ROM2ucharcodetable[8]={0x0c,0x12,0x12,0x0c,0x00,0x00,0x00,0x00}; //攝氏溫度符號uchardatadisdata[5];uinttvalue;//溫度值uchartflag;//溫度正負標志/*************************lcd1602程序**************************/voiddelay1ms(uintms)//延時1毫秒(不夠精確的){uinti,j;for(i=0;i<ms;i++)for(j=0;j<100;j++);voidwr_com(ucharcom)//寫指令//{delay1ms(1);RS=0;RW=0;EN=0;P2=com;delay1ms(1);EN=1;delay1ms(1);EN=0;voidwr_dat(uchardat)//寫數(shù)據(jù)//{delay1ms(1);;RS=1;RW=0;EN=0;P2=dat;delay1ms(1);EN=1;delay1ms(1);EN=0;voidwr_new() 、//寫新字符 uchari; wr_com(0x40); for(i=0;i<8;i++) wr_dat(table[i]);voidlcd_init()//初始化設置//{ delay1ms(15); wr_com(0x38);delay1ms(5); wr_com(0x08);delay1ms(5); wr_com(0x01);delay1ms(5); wr_com(0x06);delay1ms(5); wr_com(0x0c);delay1ms(5); wr_new(); wr_com(0x80);wr_dat('A'); wr_com(0x81);wr_dat(':'); wr_com(0x89);wr_dat(0x00); wr_com(0x8a);wr_dat('C'); wr_com(0xc9);wr_dat(0x00); 、、//攝氏溫度字符 wr_com(0xca);wr_dat('C'); wr_com(0xc0);wr_dat('B'); wr_com(0xc1);wr_dat(':');/******************************ds1820程序***************************************/voiddelay_18B20(uinti)//延時1微秒while(i--);voidds1820rst()/*ds1820復位*/{ucharx=0; DQ=1;//DQ復位 delay_18B20(4);//延時 DQ=0;//DQ拉低 delay_18B20(100);//精確延時大于480us DQ=1;//拉高 delay_18B20(40);uchards1820rd()/*讀數(shù)據(jù)*/{uchari=0;uchardat=0;for(i=0;i<8;i++) {DQ=0;//給脈沖信號dat>>=1;DQ=1;//給脈沖信號if(DQ)dat|=0x80;delay_18B20(10);return(dat);voidds1820wr(uchardat)/*寫數(shù)據(jù)*/{ uchari=0;for(i=0;i<8;i++) {DQ=0; DQ=dat&0x01; delay_18B20(10); DQ=1; dat>>=1;voidb20_Matchrom(uchara) //匹配ROM charj; ds1820wr(0x55); //發(fā)送匹配ROM命令 if(a==1) for(j=0;j<8;j++) ds1820wr(str1[j]); //發(fā)送18B20的序列號,先發(fā)送低字節(jié) if(a==2) for(j=0;j<8;j++) ds1820wr(str2[j]); //發(fā)送18B20的序列號,先發(fā)送低字節(jié)read_temp(ucharz)/*讀取溫度值并轉換*/{ uchara,b; floattt; ds1820rst(); ds1820wr(0xcc); 、//讀序列號 ds1820rst(); if(z==1) b20_Matchrom(1); //匹配ROM1 if(z==2) b20_Matchrom(2); //匹配ROM 2 ds1820wr(0x44);//*啟動溫度轉換*/ delay1ms(5); ds1820rst(); ds1820wr(0xcc); //讀序列號 ds1820rst(); if(z==1) b20_Matchrom(1); //匹配ROM1 if(z==2) b20_Matchrom(2); //匹配ROM 2 ds1820wr(0xbe);//*讀取溫度*/ a=ds1820rd(); b=ds1820rd(); tvalue=b; tvalue<<=8; tvalue=tvalue|a;if(tvalue<0x0fff)tflag=0;else { tvalue=~tvalue+1; tflag=1; tt=tvalue*0.0625; tvalue=tt*10; return(tvalue);/*****************顯示函數(shù)******************************/voidds1820disp(ucharz)//溫度值顯示{ucharflagdat;disdata[0]=tvalue/1000+0x30;//百位數(shù)disdata[1]=tvalue%1000/100+0x30;//十位數(shù)disdata[2]=tvalue%100/10+0x30;//個位數(shù)disdata[3]=tvalue%10+0x30;//小數(shù)位if(tflag==0)flagdat=0x20;//正溫度不顯示符號elseflagdat=0x2d;//負溫度顯示負號:-if(disdata[0]==0x30){disdata[0]=0x20;//如果百位為0,不顯示if(disdata[1]==0x30){disdata[1]=0x20;//如果百位為0,十位為0也不顯示if(z==1)wr_com(0x
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025-2030年中國工程外墻乳膠漆行業(yè)深度研究分析報告
- 新能源汽車購買合同
- 蘭州二手房買賣合同協(xié)議
- 2024年大數(shù)據(jù)平臺建設項目合同
- 2025年中國肉色糖行業(yè)市場發(fā)展前景及發(fā)展趨勢與投資戰(zhàn)略研究報告
- 2025年殺蠟劑項目可行性研究報告
- 2025年熏雞項目可行性研究報告
- 年產(chǎn)1萬噸休閑食品項目可行性研究報告申請立項
- 2025年玻璃鋼管制品項目可行性研究報告
- 2025年電器絕緣套管項目可行性研究報告
- 中央2025年公安部部分直屬事業(yè)單位招聘84人筆試歷年參考題庫附帶答案詳解
- 三年級數(shù)學(上)計算題專項練習附答案
- 中醫(yī)診療方案腎病科
- 2025年安慶港華燃氣限公司招聘工作人員14人高頻重點提升(共500題)附帶答案詳解
- 人教版(2025新版)七年級下冊數(shù)學第七章 相交線與平行線 單元測試卷(含答案)
- 2025年供電所所長個人工作總結(2篇)
- 玩具有害物質風險評估-洞察分析
- 春節(jié)節(jié)后復工全員安全意識提升及安全知識培訓
- 2025四川廣安發(fā)展建設集團限公司第一批招聘6人高頻重點提升(共500題)附帶答案詳解
- 2024年3月天津第一次高考英語試卷真題答案解析(精校打?。?/a>
- 2024年河南省公務員錄用考試《行測》真題及答案解析
評論
0/150
提交評論