全部評論(1條)
-
- 僬耐呵撬爻 2016-11-30 14:33:17
- /******************************************************** * DS18B20溫度傳感器 * * C51 * * yajou 2008-06-28 無CRC * ********************************************************/ #include "reg51.h" #include "intrins.h" #include "DS18B20.h" /******************************************************** * us延時程序 * ********************************************************/ void Delayus(uchar us) { while(us--); //12M,一次6us,加進入退出14us(8M晶振,一次9us) } /******************************************************** * DS18B20初始化 * ********************************************************/ bit Ds18b20_Init(void) //存在返0,否則返1 { bit temp = 1; uchar outtime = ReDetectTime; //超時時間 while(outtime-- && temp) { Delayus(10); //(250)1514us時間可以減小嗎 ReleaseDQ(); Delay2us(); PullDownDQ(); Delayus(100); //614us(480-960) ReleaseDQ(); Delayus(10); //73us(>60) temp = dq; Delayus(70); //us } return temp; } /******************************************************** * 寫bit2DS18B20 * ********************************************************/ void Ds18b20_WriteBit(bit bitdata) { if(bitdata) { PullDownDQ(); Delay2us(); //2us(>1us) ReleaseDQ(); //(上述1-15) Delayus(12); //86us(45- x,總時間>60) }else { PullDownDQ(); Delayus(12); //86us(60-120) } ReleaseDQ(); Delay2us(); //2us(>1us) } /******************************************************** * 寫Byte DS18B20 * ********************************************************/ void Ds18b20_WriteByte(uchar chrdata) { uchar ii; for(ii = 0; ii < 8; ii++) { Ds18b20_WriteBit(chrdata & 0x01); chrdata >>= 1; } } /******************************************************** * 寫 DS18B20 * ********************************************************/ //void Ds18b20_Write(uchar *p_readdata, uchar bytes) //{ // while(bytes--) // { // Ds18b20_WriteByte(*p_readdata); // p_readdata++; // } //} /******************************************************** * 讀bit From DS18B20 * ********************************************************/ bit Ds18b20_ReadBit(void) { bit bitdata; PullDownDQ(); Delay2us(); //2us( >1us) ReleaseDQ(); Delay8us(); //8us( <15us) bitdata = dq; Delayus(7); //86us(上述總時間要>60us) return bitdata; } /******************************************************** * 讀Byte DS18B20 * ********************************************************/ uchar Ds18b20_ReadByte(void) { uchar ii,chardata; for(ii = 0; ii < 8; ii++) { chardata >>= 1; if(Ds18b20_ReadBit()) chardata |= 0x80; } return chardata; } /******************************************************** * 讀 DS18B20 ROM * ********************************************************/ bit Ds18b20_ReadRom(uchar *p_readdata) //成功返0,失敗返1 { uchar ii = 8; if(Ds18b20_Init()) return 1; Ds18b20_WriteByte(ReadROM); while(ii--) { *p_readdata = Ds18b20_ReadByte(); p_readdata++; } return 0; } /******************************************************** * 讀 DS18B20 EE * ********************************************************/ bit Ds18b20_ReadEE(uchar *p_readdata) //成功返0,失敗返1 { uchar ii = 2; if(Ds18b20_Init()) return 1; Ds18b20_WriteByte(SkipROM); Ds18b20_WriteByte(ReadScr); while(ii--) { *p_readdata = Ds18b20_ReadByte(); p_readdata++; } return 0; } /******************************************************** * 溫度采集計算 * ********************************************************/ bit TempCal(float *p_wendu) //成功返0,失敗返1 (溫度范圍-55 --- +128) { uchar temp[9],ii; uint tmp; float tmpwendu; TR1 = 0; TR0 = 0; //讀暫存器和CRC值----------------------- if(Ds18b20_ReadEE(temp)) { TR1 = 1; TR0 = 1; return 1; } //------------------------------------- //CRC校驗------------------------------ // //此處應加入CRC校驗等 // // //------------------------------------- //使溫度值寫入相應的wendu[i]數組中----- for(ii = i; ii > 0; ii--) { p_wendu++; } i++; if(i > 4) i = 0; //------------------------------------- //溫度正負數處理----------------------- // //------------------------------------- //溫度計算----------------------------- tmp = temp[1]; // tmp <<= 8; // tmp |= temp[0]; //組成溫度的兩字節合并 tmpwendu = tmp; *p_wendu = tmpwendu / 16; //------------------------------------- //開始溫度轉換------------------------- if(Ds18b20_Init()) { TR1 = 1; TR0 = 1; return 1; } Ds18b20_WriteByte(SkipROM); Ds18b20_WriteByte(Convert); ReleaseDQ(); //寄生電源時要拉高DQ //------------------------------------ TR1 = 1; TR0 = 1; return 0; } //////////DS18B20.h///////////////////////// /******************************************************** * I/O口定義 * ********************************************************/ sbit dq = P1^3; sbit dv = P1^4; //DS18B20強上拉電源 /******************************************************** * 命令字定義 * ********************************************************/ #define uchar unsigned char #define uint unsigned int #define ReleaseDQ() dq = 1; //上拉/釋放總線 #define PullDownDQ() dq = 0; //下拉總線 #define Delay2us() _nop_();_nop_(); //延時2us,每nop 1us #define Delay8us() _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_(); //設置重復檢測次次數,超出次數則超時 #define ReDetectTime 20 //ds18b20命令 #define SkipROM 0xCC #define MatchROM 0x55 #define ReadROM 0x33 #define SearchROM 0xF0 #define AlarmSearch 0xEC #define Convert 0x44 #define WriteScr 0x4E #define ReadScr 0xBE #define CopyScr 0x48 #define RecallEE 0xB8 #define ReadPower 0xB4 /******************************************************** * 函數 * ********************************************************/ void Delayus(uchar us); //void Dog(void); bit Ds18b20_Init(void); //DS18B20初始化,存在返0,否則返1 void Ds18b20_WriteBit(bit bitdata); //寫bit2DS18B20 void Ds18b20_WriteByte(uchar chrdata); //寫Byte DS18B20 void Ds18b20_Write(uchar *p_readdata, uchar bytes); //寫 DS18B20 bit Ds18b20_ReadBit(void); //讀bit From DS18B20 uchar Ds18b20_ReadByte(void); //讀Byte DS18B20 bit Ds18b20_ReadRom(uchar *p_readdata); //讀 DS18B20 ROM:成功返0,失敗返1 bit Ds18b20_ReadEE(uchar *p_readdata); //讀 DS18B20 EE :成功返0,失敗返1 bit TempCal(float *p_wendu); //成功返0,失敗返1 (溫度范圍-55 --- +128)
-
贊(5)
回復(0)
熱門問答
- 請教高手,基于單片機的人體溫度測量
2016-11-30 12:40:14
339
1
- 基于單片機的頻率計
- 哪位大俠有基于單片機頻率計的設計,范圍1HZ到100MHZ,希望能不吝賜教啊。自己做的頻率計仿真達不到要求。只能達到10M,卡在哪了,做不下去了。O(∩_∩)O謝謝了。
2012-05-08 03:40:25
230
3
- 基于單片機的信號發生器
- 請問有哪位知道這個圖里面的這些元器件在哪個ISIS7里面的名稱是啥,有些我找不到啊... 請問有哪位知道這個圖里面的這些元器件在哪個ISIS7里面的名稱是啥,有些我找不到啊 展開
2017-09-11 15:37:20
379
4
- 基于單片機的頻率計設計
- 設計要求設計一個以單片機為核心的頻率測量裝置。使用AT89C51單片機的定時器/計數器的定時和計數功能,外部擴展6位LED數碼管,要求累計每秒進入單片機的外部脈沖個數,用LED數碼管顯示出來。(1)被測頻率fx<110Hz,采用測周法,顯示頻率×××. ×××;fx>1... 設計要求設計一個以單片機為核心的頻率測量裝置。使用AT89C51單片機的定時器/計數器的定時和計數功能,外部擴展6位LED數碼管,要求累計每秒進入單片機的外部脈沖個數,用LED數碼管顯示出來。(1)被測頻率fx<110Hz,采用測周法,顯示頻率×××. ×××;fx>110Hz,采用測頻法,顯示頻率××××××。(2)利用鍵盤分段測量和自動分段測量。(3)完成單脈沖測量,輸入脈沖寬度范圍是100ms~0.1s。(4)顯示脈沖寬度要求如下。Tx<1000ms,顯示脈沖寬度×××。Tx>1000ms,顯示脈沖寬度××××。 求大神給個程序,給個設計方,您之前給的失效了,謝謝大神 展開
2016-07-07 19:24:28
303
1
- 基于51單片機的溫度控制器
2012-04-13 16:49:36
321
2
- 基于單片機的微波爐控制系統
- 基于單片機的微波爐控制系統單片機課程設計-基于微波爐控制系統設計(1)可設置三種Z高溫度值,如低溫(20°),中溫(30°),高溫(50°);(2)可設置Z長10分鐘定時;(3)用DS... 基于單片機的微波爐控制系統單片機課程設計-基于微波爐控制系統設計 (1)可設置三種Z高溫度值,如低溫(20°),中溫(30°),高溫(50°); (2)可設置Z長10分鐘定時; (3)用DS18B20感知溫度,當溫度達到設置溫度值,并持續設定時間長度時,蜂鳴器報警提示,LED燈閃爍,同時時間歸零; (4)設計控制電路總體方案; 求大神幫助 展開
2017-12-24 14:21:01
337
1
- 基于C51單片機的信號發生器
- 求各位前輩和同學指點下該怎么開始各個部分有什么作用怎么組成總之就是整體的設計思路謝謝... 求各位前輩和同學指點下該怎么開始 各個部分有什么作用 怎么組成 總之就是整體的設計思路 謝謝 展開
2016-10-28 15:46:50
380
1
- 基于單片機的數字頻率計的研究
- 利用AT89C51單片機設計一個測量頻率范圍為1Hz-10KHz的正弦波、方波、三角波信號的數字頻率計,要求用單片機實現自動測量功能。設計基于AT89C51單片機控制的數字頻率計的硬件電路;完成相關的系統軟件設計,并通過試驗儀驗證通過。
2009-05-27 03:47:42
297
3
- 基于單片機的溫度控制器的畢業論文
- 基于AT89C2051單片機的水溫控制電路的設計,希望有相關資料的好心人能幫幫忙,郵箱:henryjason@126.com感激不盡... 基于AT89C2051單片機的水溫控制電路的設計,希望有相關資料的好心人能幫幫忙,郵箱:henryjason@126.com 感激不盡 展開
2010-05-14 03:21:10
256
2
- 基于單片機C51的頻率計電路圖
- 1、要共陰數碼顯示。2、頻率超過2K報警。3、蜂鳴器報警。可測1Hz到5KHz
2018-11-17 14:51:41
383
0
- 基于AT89C51單片機的數字頻率計畢業設計
- AT89C51單片機 測頻范圍10HZ-10MHZ 多種波形 ZD是需要添加其他功能 比如測幅值 之類的 (添加功能任意 保證畢業設計的工作量不會太簡單) 不支持私下交易,求淘寶鏈接之類的
2015-11-09 03:36:40
479
2
- 基于單片機的數據采集器采集什么東西
2017-05-24 16:17:02
447
1
- 基于單片機的熱電偶測溫電路圖
- 要求有電路圖,編程等
2017-11-23 02:27:45
346
1
- 基于AT89S51單片機的信號發生器設計
- 波形輸出:正弦波,方波,三角波... 波形輸出:正弦波,方波,三角波 展開
2018-11-19 19:51:53
212
0
- :基于51單片機的脈沖信號發生器
- [1]輸出信號約每秒1組脈沖,脈沖組間隔0.5-2秒可設置;[2]每組脈沖個數1-50可以設置,雙極性脈沖和雙極性方波;[3]脈沖頻率5K-100K可以設置;[4]脈沖寬度可以1-100uS可以設置;我的92... [1] 輸出信號約每秒1組脈沖,脈沖組間隔0.5-2秒可設置;[2] 每組脈沖個數1-50可以設置,雙極性脈沖和雙極性方波; [3] 脈沖頻率5K-100K可以設置;[4] 脈沖寬度可以1-100uS可以設置; 我的 921313685@qq.com謝啦 展開
2014-10-15 08:40:21
211
2
- 基于單片機的鍋爐壓力控制系統設計
2018-11-20 14:06:29
349
0
- 單片機用PID控制可控硅,讓電烤箱溫度恒定的算法請教高手!
2011-10-07 05:36:44
237
2
- 為什么做的基于單片機的超聲波測距傳感器測量距離短
2017-03-24 04:05:28
328
3
- 求助,基于51單片機,激光測距
2018-11-30 04:20:40
383
0
5月突出貢獻榜
推薦主頁
最新話題
-
- #DeepSeek如何看待儀器#
- 干體爐技術發展與應用研究
- 從-70℃到150℃:一臺試驗箱如何終結智能...從-70℃到150℃:一臺試驗箱如何終結智能調光膜失效風險?解決方案:SMC-210PF-FPC溫濕度折彎試驗箱的五大核心價值1. 多維度環境模擬,覆蓋全生命周期測試需求超寬溫域:支持-70℃至+150℃的極限溫度模擬(可選配),復現材料在極寒、高溫、冷熱沖擊下的性能表現;控濕:濕度范圍20%~98%RH(精度±3%RH),模擬熱帶雨林、沙漠干燥等復雜工況,暴露材料吸濕膨脹、分層缺陷;動態折彎:0°~180°連續可調折彎角度,支持R1~R20彎曲半徑設定,模擬實際裝配中的微小應力,提前預警裂紋、斷裂風險。
參與評論
登錄后參與評論