国产三级在线看完整版-内射白嫩大屁股在线播放91-欧美精品国产精品综合-国产精品视频网站一区-一二三四在线观看视频韩国-国产不卡国产不卡国产精品不卡-日本岛国一区二区三区四区-成年人免费在线看片网站-熟女少妇一区二区三区四区

儀器網(wǎng)(yiqi.com)歡迎您!

| 注冊2 登錄
網(wǎng)站首頁-資訊-話題-產(chǎn)品-評測-品牌庫-供應商-展會-招標-采購-知識-技術-社區(qū)-資料-方案-產(chǎn)品庫-視頻

問答社區(qū)

單片機控制DS18B20的主程序

xjq469 2016-06-13 08:32:13 723  瀏覽
  • 我只想知道單片機讀取DS18B20的程序,不需要數(shù)碼管或者液晶屏顯示,該怎么編程???... 我只想知道單片機讀取DS18B20的程序,不需要數(shù)碼管或者液晶屏顯示,該怎么編程??? 展開

參與評論

全部評論(1條)

  • 累累的老巢 2016-06-14 00:00:00
    /***溫度傳感器DS18B20驅(qū)動——火柴天堂作品-20120622***/ /***源程序硬件環(huán)境:52單片機,12MHz晶振,P37接 DS18B20 數(shù)據(jù)引腳,非寄生電源(即外部電源接法)***/ /***DS18B20 測量溫度范圍:-55℃~+125℃***/ #define DS18B02_H #include"reg52.h" //包含52頭文件 #include"DS18B20.h" //包含DS1302宏定義文件 sbit DS18B20_DQ=P3^7; //定義 DS18B20 數(shù)據(jù)口 #define DQ_High DS18B20_DQ=1 //拉高 數(shù)據(jù)口 #define DQ_Low DS18B20_DQ=0 //拉低 數(shù)據(jù)口 uchar code CRC_List[256]={//8540 CRC-8校驗列表 //x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, xa, xb, xc, xd, xe, xf, 0, 94, 188, 226, 97, 63, 221, 131, 194, 156, 126, 32, 163, 253, 31, 65, //0x 157, 195, 33, 127, 252, 162, 64, 30, 95, 1, 227, 189, 62, 96, 130, 220, //1x 35, 125, 159, 193, 66, 28, 254, 160, 225, 191, 93, 3, 128, 222, 60, 98, //2x 190, 224, 2, 92, 223, 129, 99, 61, 124, 34, 192, 158, 29, 67, 161, 255, //3x 70, 24, 250, 164, 39, 121, 155, 197, 132, 218, 56, 102, 229, 187, 89, 7, //4x 219, 133, 103, 57, 186, 228, 6, 88, 25, 71, 165, 251, 120, 38, 196, 154, //5x 101, 59, 217, 135, 4, 90, 184, 230, 167, 249, 27, 69, 198, 152, 122, 36, //6x 248, 166, 68, 26, 153, 199, 37, 123, 58, 100, 134, 216, 91, 5, 231, 185, //7x 140, 210, 48, 110, 237, 179, 81, 15, 78, 16, 242, 172, 47, 113, 147, 205, //8x 17, 79, 173, 243, 112, 46, 204, 146, 211, 141, 111, 49, 178, 236, 14, 80, //9x 175, 241, 19, 77, 206, 144, 114, 44, 109, 51, 209, 143, 12, 82, 176, 238, //ax 50, 108, 142, 208, 83, 13, 239, 177, 240, 174, 76, 18, 145, 207, 45, 115, //bx 202, 148, 118, 40, 171, 245, 23, 73, 8, 86, 180, 234, 105, 55, 213, 139, //cx 87, 9, 235, 181, 54, 104, 138, 212, 149, 203, 41, 119, 244, 170, 72, 22, //dx 233, 183, 85, 11, 136, 214, 52, 106, 43, 117, 151, 201, 74, 20, 246, 168, //ex 116, 42, 200, 150, 21, 75, 169, 247, 182, 232, 10, 84, 215, 137, 107, 53};//fx void Delay(uint delay_time) //延時函數(shù),非精確延時,F(xiàn)osc=12MHz { while(delay_time--); } uchar CRC_18b20(uchar *buf_p,uchar leng) //CRC校驗函數(shù),*buf_p指向待檢驗數(shù)組,leng進行校驗的個數(shù),若含CRC碼進行校驗,結果應為0 { uchar i,crc_data=0; for(i=0;i<leng;i++) crc_data = CRC_List[crc_data^*buf_p++]; //查表校驗 return crc_data; } void Reset_18b20() //DS18B20復位函數(shù) { DQ_Low; //拉低 數(shù)據(jù)口 Delay(80); //==延時500us== DQ_High; //拉高 數(shù)據(jù)口,等待DS18B20回應 Delay(2); //==延時16~60us== if(DS18B20_DQ) Delay(3); //若DS18B20無回應,再等待一段時間 //if(DS18B20_DQ) return FALSE; //依然無回應,返回 復位失敗(帶布爾量返回時使用) while(!DS18B20_DQ); //若有回應,等待回應結束 //return TRUE; //返回 復位成功 } uchar Read_18b20() //DS18B20讀函數(shù) { uchar i,temp=0; for(i=0;i<8;i++) //讀8個位 { DQ_Low; //拉低 數(shù)據(jù)口 ==延時1us== DQ_High; //拉高 數(shù)據(jù)口, //Delay(1); //==延時1us== if(DS18B20_DQ) temp|=1<<i; //若DS18B20回應高,則相應位置1 Delay(2); //==延時== } return temp; //返回 讀取結果 } void Write_18b20(uchar comm) //DS18B20寫函數(shù) { uchar i; for(i=0;i<8;i++) //寫8個位 { DQ_Low; //拉低 數(shù)據(jù)口 //Delay(1); //==延時5us== DS18B20_DQ=comm&0x01; //將數(shù)據(jù)Z低位賦于 數(shù)據(jù)口 //if(comm &(1<<i)) DQ_High; //執(zhí)行周期過長,錯過DS18B20讀取時間 Delay(2); //==延時50us 以上== DQ_High; //拉高 數(shù)據(jù)口 comm >>= 1; //將下一位發(fā)送數(shù)據(jù)移到Z低位 //Delay(1); //恢復時間 } } //uchar ReadB20Power() //讀DS18B20電源模式,返回:0 寄生電源模式, FF 外部電源模式(20130120增) //{ // Reset_18b20(); //復位DS18B20 // Write_18b20(SkipRom); //寫"跳過ROM"指令,只能用于單器件 // Write_18b20(ReadPower); //寫"讀電源"指令 // return Read_18b20(); //讀取1個字節(jié),并返回 //} void GetB20SN(uchar *buf_p,uchar start_loca) //獲取DS18B20系列號函數(shù),*buf_p指向存儲數(shù)組,start_loca為存儲的起始位置 { uchar i=8; buf_p+=start_loca; //指向數(shù)組中的存儲起始位置 Reset_18b20(); //復位DS18B20 Write_18b20(ReadRom); //寫"讀存儲器"指令 while(i--) *buf_p++=Read_18b20(); //讀8個字節(jié)系列號 } /******************************************************************************/ /***函數(shù)名稱:ChangeTempValue(轉換溫度值) ***/ /***功能描述:將讀取18B20所得的16位溫度值(temp_buf指向的2個連續(xù)字節(jié)), ***/ /*** 轉換成1Byte整數(shù)部分,和2Byte小數(shù)部分,存于save_buf指向的3個連續(xù)字節(jié), ***/ /*** 其中第1個字節(jié)為整數(shù)部分,第2字節(jié)為0.01小數(shù)部分,第3字節(jié)為0.0001小數(shù)部分 ***/ /*** 返回值:0溫度為正值,1溫度為負值 ***/ /******************************************************************************/ bit ChangeTempValue(uchar *temp_buf,uchar reso_bit,uchar *save_buf,uchar save_start) //返回:0正溫度,1負溫度 { // 9bit(SSSS SSSS DDDD DDDD): S符號位:0正1負,D數(shù)據(jù)位,0.5℃單位(/2) //10bit(SSSS SSSD DDDD DDDD): S符號位:0正1負,D數(shù)據(jù)位,0.25℃單位(/4) //11bit(SSSS SSDD DDDD DDDD): S符號位:0正1負,D數(shù)據(jù)位,0.125℃單位(/8) //12bit(SSSS SDDD DDDD DDDD): S符號位:0正1負,D數(shù)據(jù)位,0.0625℃單位(/16) bit polar=0; //溫度極性:0正溫度,1負溫度 uchar temp_int,reso_value; uint temp_dec,temp_A; reso_value=(reso_bit>>5)+9; //分辨率指令碼轉換數(shù)值:Reso_9bit/10bit/11bit/12bit→9/10/11/12 if(reso_value>12) reso_value=12; //默認 12bit分辨率精度 if(*(temp_buf+1)>>3)//正負值識別,溫度值高5位為1則為 負值 { polar=1; //負極性 temp_A=(~*(temp_buf+1)<<8 | ~*temp_buf)+1; //取 補碼(取反+1) } else temp_A=*(temp_buf+1)<<8 | *temp_buf; //正值,合成16位數(shù)據(jù) temp_int=(uchar)(temp_A>>(reso_value-8)); //取整數(shù)部分,8bit(可以不加強制轉換(uchar)) temp_dec=temp_A & (0x0f>>(12-reso_value)); //取小數(shù)部分 switch(reso_bit) //小數(shù)轉換需進行精度選擇 { case Reso_9bit: //9位精度,0.5℃ temp_dec*=5000; //小數(shù)擴大10000倍 break; case Reso_10bit: //10位精度,0.25℃ temp_dec*=2500; //小數(shù)擴大10000倍 break; case Reso_11bit: //11位精度,0.125℃ temp_dec*=1250; //小數(shù)擴大10000倍 break; case Reso_12bit: //12位精度,0.0625℃ default: //其他精度,按12位精度算 temp_dec*=625; //小數(shù)擴大10000倍 break; } save_buf+=save_start; //指向存儲數(shù)組中的存儲起始位置 *save_buf++=temp_int; //存溫度值整數(shù)部分 *save_buf++=temp_dec/100; //存溫度值小數(shù)點 十分位、百分位 *save_buf=temp_dec%100; //存溫度值小數(shù)點 千分位、萬分位 return polar; //返回溫度極性:0正溫度,1負溫度 } bit GetTemp(uchar rom_mode,uchar *sn_p,uchar reso_bit,uchar *get_buf,uchar start_loca) //返回:0正溫度,1負溫度 { uchar i,read_buf[9]; //定義數(shù)組以存儲DS18B20的9字節(jié)溫度結果 uchar read_count=8; //讀次數(shù) Reset_18b20(); //復位 DS18B20 Write_18b20(rom_mode); //寫入"ROM操作"模式代碼,MatchRom,SkipRom if(rom_mode==MatchRom) for(i=0;i<8;i++) Write_18b20(*sn_p++); //若ROM操作 為匹配Rom,則寫入8字節(jié)系列號 Write_18b20(TempChange); //寫入"溫度轉換"指令 sn_p-=8; //指向"系列號起始地址" do //讀暫存器 操作 { Reset_18b20(); //復位 DS18B20 Write_18b20(rom_mode); //寫入"ROM操作"模式代碼,MatchRom,SkipRom if(rom_mode==MatchRom) for(i=0;i<8;i++) Write_18b20(*sn_p++); //若ROM操作 為匹配Rom,則寫入8字節(jié)系列號 Write_18b20(ReadScr); //寫入"讀暫存器"指令 for(i=0;i<9;i++) read_buf[i]=Read_18b20(); //讀取暫存器9字節(jié)數(shù)據(jù) sn_p-=8; //指向"系列號起始地址" }while(CRC_18b20(read_buf,9) && --read_count); //若校驗失敗,則重新"讀暫存器",Z多讀read_count次 return ChangeTempValue(read_buf,reso_bit,get_buf,start_loca); //進行溫度轉換,將溫度結果存于get_buf指向的數(shù)組,并返回溫度極性:0正溫度,1負溫度 } void Config_18b20(uchar rom_mode,uchar *sn_buf,uchar sn_start,uchar up_limit,uchar low_limit,uchar reso_bit) //DS18B20配置函數(shù) { //形參:rom_mode操作ROM(SkipRom,MatchRom),up_limit上限,low_limit下限,reso_bit分辨率(Reso_9bit/10bit/11bit/12bit) uchar i,read_buf[9]; //定義數(shù)組以存儲DS18B20的8字節(jié)系列號與1字節(jié)CRC校驗碼 uchar read_count=8; //讀次數(shù) sn_buf+=sn_start; //指向 系列號起始地址 do //寫暫存器 操作 { Reset_18b20(); //復位 DS18B20 Write_18b20(rom_mode); //寫入"ROM操作"模式代碼,MatchRom,SkipRom if(rom_mode==MatchRom) for(i=0;i<8;i++) Write_18b20(*(sn_buf+i)); //若ROM操作 為匹配Rom,則寫入8字節(jié)系列號 Write_18b20(WriteScr); //寫暫存器 指令 Write_18b20(up_limit); //寫入報警上限溫度 Write_18b20(low_limit); //寫入報警下限溫度 Write_18b20(reso_bit); //寫入分辨率 do //讀暫存器 操作 { Reset_18b20(); //復位 DS18B20 Write_18b20(rom_mode); //寫入"ROM操作"模式代碼,MatchRom,SkipRom if(rom_mode==MatchRom) for(i=0;i<8;i++) Write_18b20(*(sn_buf+i)); //若ROM操作 為匹配Rom,則寫入8字節(jié)系列號 Write_18b20(ReadScr); //寫入"讀暫存器"指令 for(i=0;i<9;i++) read_buf[i]=Read_18b20(); //讀取暫存器9個字節(jié)數(shù)據(jù) }while(CRC_18b20(read_buf,9) && --read_count); //若校驗失敗,則重新"讀暫存器",Z多讀read_count次 }while(read_buf[2]!=up_limit || read_buf[3]!=low_limit); //若讀取結果與寫入數(shù)據(jù)不同,則重新 寫暫存器 Reset_18b20(); //復位 DS18B20 Write_18b20(rom_mode); //寫入"ROM操作"模式代碼,MatchRom,SkipRom if(rom_mode==MatchRom) for(i=0;i<8;i++) Write_18b20(*(sn_buf+i)); //若ROM操作 為匹配Rom,則寫入8字節(jié)系列號 Write_18b20(CopyScr); //"復制暫存器"指令,將暫存器內(nèi)容復制到DS18B20 EEPROM Reset_18b20(); //復位 DS18B20 Write_18b20(rom_mode); //寫入"ROM操作"模式代碼,MatchRom,SkipRom if(rom_mode==MatchRom) for(i=0;i<8;i++) Write_18b20(*(sn_buf+i)); //若ROM操作為匹配Rom,則寫入8字節(jié)系列號 Write_18b20(RecallEE); //調(diào)EEPROM數(shù)據(jù) 指令,將 DS18B20 EEPROM內(nèi)的數(shù)據(jù)寫到暫存器 } /* uint GetTempData(uchar rom_mode,uchar *sn_p) //返回:16位 溫度結果 { uchar i,read_buf[9]; //定義數(shù)組以存儲DS18B20的9字節(jié)溫度結果 uchar read_count=8; //讀次數(shù) Reset_18b20(); //復位 DS18B20 Write_18b20(rom_mode); //寫入"ROM操作"模式代碼,MatchRom,SkipRom if(rom_mode==MatchRom) for(i=0;i<8;i++) Write_18b20(*sn_p++); //若ROM操作 為匹配Rom,則寫入8字節(jié)系列號 Write_18b20(TempChange); //寫入"溫度轉換"指令 sn_p-=8; //指向"系列號起始地址" do //讀暫存器 操作 { Reset_18b20(); //復位 DS18B20 Write_18b20(rom_mode); //寫入"ROM操作"模式代碼,MatchRom,SkipRom if(rom_mode==MatchRom) for(i=0;i<8;i++) Write_18b20(*sn_p++); //若ROM操作 為匹配Rom,則寫入8字節(jié)系列號 Write_18b20(ReadScr); //寫入"讀暫存器"指令 for(i=0;i<9;i++) read_buf[i]=Read_18b20(); //讀取暫存器9字節(jié)數(shù)據(jù) sn_p-=8; //指向"系列號起始地址" }while(CRC_18b20(read_buf,9) && --read_count); //若校驗失敗,則重新"讀暫存器",Z多讀read_count次 return ((read_buf[1]<<8)|read_buf[0]); //進行溫度轉換,將溫度結果存于get_buf指向的數(shù)組,并返回溫度極性:0正溫度,1負溫度 }*/

    贊(7)

    回復(0)

    評論

熱門問答

單片機控制DS18B20的主程序
我只想知道單片機讀取DS18B20的程序,不需要數(shù)碼管或者液晶屏顯示,該怎么編程???... 我只想知道單片機讀取DS18B20的程序,不需要數(shù)碼管或者液晶屏顯示,該怎么編程??? 展開
2016-06-13 08:32:13 723 1
DS18B20溫度傳感器如何與單片機相連接
單片機是at89s52單片機,引腳該如何相連順便問下7段LED數(shù)碼顯示管該如何連到單片機上才能顯示溫度呢... 單片機是at89s52單片機,引腳該如何相連 順便問下 7段LED數(shù)碼顯示管該如何連到單片機上 才能顯示溫度呢 展開
2010-06-15 11:30:55 483 4
ds18b20 單片機測溫 干擾疑惑 謝謝
工業(yè)環(huán)境下,上電運行一切正常,但過幾小時后會有一定的概率(一百多臺中會有隨機出現(xiàn)十幾臺)出現(xiàn)復位不正常,即沒有應答信號,或者讀到的溫度值不在PDF的正常溫度范圍內(nèi)。而如果拔掉18B20傳感器再插或者設備重新上電就恢復如常,但過段時間還是有可能會出現(xiàn),... 工業(yè)環(huán)境下,上電運行一切正常,但過幾小時后會有一定的概率(一百多臺中會有隨機出現(xiàn)十幾臺)出現(xiàn)復位不正常,即沒有應答信號,或者讀到的溫度值不在PDF的正常溫度范圍內(nèi)。而如果拔掉18B20傳感器再插或者設備重新上電就恢復如常,但過段時間還是有可能會出現(xiàn),查了很長時間查不出具體原因,哪位大師能指點一下,萬分感謝。 展開
2012-11-07 02:48:37 437 2
基于AT89C52單片機和DS18B20溫度傳感器的實物圖,急用?。。。?
就是基于單片機溫度傳感器的控制設計,實物圖,老師要,不會做,求幫助?。。。?.. 就是基于單片機溫度傳感器的控制設計,實物圖,老師要,不會做,求幫助!?。?! 展開
2016-05-02 04:57:33 276 1
單片機控制的信號發(fā)生器
我要做個系統(tǒng),把傳感器的數(shù)據(jù)傳給單片機,然后單片機調(diào)節(jié)信號發(fā)生器的頻率,這個的程序怎么寫?。磕睦镉蓄愃频某绦虬??... 我要做個系統(tǒng),把傳感器的數(shù)據(jù)傳給單片機,然后單片機調(diào)節(jié)信號發(fā)生器的頻率,這個的程序怎么寫???哪里有類似的程序?。? 展開
2014-05-21 06:25:17 339 1
用單片機測溫,ds18b20一直顯示95。0
不知道是哪里出現(xiàn)了問題
2017-08-19 21:27:34 357 1
若采用多點測溫,單片機如何識別ds18b20?
 
2013-12-17 20:42:10 452 2
51單片機 溫度控制 1602顯示 DS18B20讀取溫度
有償程序要求:恒溫控制... 有償程序 要求:恒溫控制 展開
2011-03-18 10:20:05 531 4
DS18B20與單片機結合來測量溫度。利用數(shù)字溫度傳感器DS18B20測量溫度信號
DS18B20與單片機結合來測量溫度。利用數(shù)字溫度傳感器DS18B20測量溫度信號,計算后在LED數(shù)碼管上顯示相應的溫度值。其溫度測量范圍為?55℃~125℃,精確到0.5℃。數(shù)字溫度計所測... DS18B20與單片機結合來測量溫度。利用數(shù)字溫度傳感器DS18B20測量溫度信號,計算后在LED數(shù)碼管上顯示相應的溫度值。其溫度測量范圍為?55℃~125℃,精確到0.5℃。數(shù)字溫度計所測量的溫度采用數(shù)字顯示,控制器使用單片機AT89C51,測溫傳感器使用DS18B20,用3位共陽極LED數(shù)碼管以串口傳送數(shù)據(jù),實現(xiàn)溫度顯示。 展開
2018-01-05 01:15:27 713 2
如何用pic單片機寫DS18B20數(shù)字溫度傳感器的程序
 
2016-11-07 11:36:37 472 1
單片機控制與PLC控制的區(qū)別?
 
2010-12-01 01:09:26 379 6
單片機控制步進電機調(diào)速
51單片機控制28BYJ-48步進電機我用的是中斷方式使其旋轉定時時間Z低只能設成1ms1ms時轉速差不多4s/r吧定時時間調(diào)大會更慢怎么使轉速調(diào)快點!定時時間過低或者過高電機不轉會有震動怎... 51單片機控制28BYJ-48步進電機 我用的是中斷方式使其旋轉 定時時間Z低只能設成1ms 1ms時轉速差不多4s/r吧 定時時間調(diào)大會更慢 怎么使轉速調(diào)快點! 定時時間過低或者過高電機不轉 會有震動 怎么回事 展開
2018-11-23 12:39:29 271 0
單片機PID控制問題
1.單片機在自動控制上有用到PID,比如一個恒溫發(fā)熱系統(tǒng)也可以用PID控制,但我用到現(xiàn)在單片機沒用過PID,如果用單片機恒溫可以使溫度到達預定值就停止加熱,低了就加熱,用一個溫度傳感... 1.單片機在自動控制上有用到PID,比如一個恒溫發(fā)熱系統(tǒng)也可以用PID控制,但我用到現(xiàn)在單片機沒用過PID,如果用單片機恒溫可以使溫度到達預定值就停止加熱,低了就加熱,用一個溫度傳感器反饋,這樣算是一個自動控制嗎?為什么有的用PID?是不是用PID要更精確? 2.我感覺很多單片機控制中可以用傳感器反饋再用單片機邏輯判斷,能簡單的代替PID嗎?? 哪位能簡單講下用單片機PID算法控制PWM,進行恒溫系統(tǒng)的方法? 就是PWM參數(shù)是怎么用PID確認的?? 回答了再加分。 展開
2010-11-07 02:36:50 393 5
求用51單片機與DS18B20測溫的C程序。完整的。
 
2016-05-21 11:08:36 441 1
單片機控制電磁閥的元器件的畫法
那個類似線圈的L2是什么 以及二位二通電磁閥在peotel怎么畫 謝謝
2017-05-25 06:43:42 491 1
51單片機如何控制超聲波傳感器 ?
 
2018-12-04 16:38:54 440 0
如何通過單片機控制光電傳感器?
Z近想做一臺避障小車,里面的光電傳感器需要用單片機來控制,請問用STC89C52 的單片機可以控制嗎?怎么控制呢?謝謝
2013-07-25 06:41:57 484 2
如何使用單片機控制MQ135
 
2014-11-20 19:09:11 348 3
怎么通過單片機控制蠕動泵
 
2017-04-18 13:34:43 351 1
請問有人用AT89c52單片機用DS18B20測水溫,超聲波測水位的設計?
 
2014-10-27 08:14:01 641 2

4月突出貢獻榜

推薦主頁

最新話題