|
|||||||||||
| 技術(shù)交流 | 電路欣賞 | 工控天地 | 數(shù)字廣電 | 通信技術(shù) | 電源技術(shù) | 測(cè)控之家 | EMC技術(shù) | ARM技術(shù) | EDA技術(shù) | PCB技術(shù) | 嵌入式系統(tǒng) 驅(qū)動(dòng)編程 | 集成電路 | 器件替換 | 模擬技術(shù) | 新手園地 | 單 片 機(jī) | DSP技術(shù) | MCU技術(shù) | IC 設(shè)計(jì) | IC 產(chǎn)業(yè) | CAN-bus/DeviceNe |
我真是暈啦! |
| 作者:ihafd 欄目:單片機(jī) |
18B20的讀寫程序,原先是用在,AT2051上的,現(xiàn)在把它放到STC89C52上,32MHZ晶振,雙倍速,(相當(dāng)于64MHZ)不管我怎樣修收它的延時(shí)時(shí)間還是不可以正常讀寫. 調(diào)了兩天還是不行.大家有什么辦法啊?是不是18B20不支持那高的頻率啊? 用在2051上不管是12MHZ和24MHZ我都用這個(gè)程序的,只要改延時(shí)單間變可以用了,但現(xiàn)在用在STC上,而且是32MHZ 雙倍速,(相當(dāng)于64MHZ) 不管我怎樣調(diào)時(shí)間還是不行啊!!!!!!!! 加長(zhǎng)了延時(shí)間的程序如下: (延時(shí)函數(shù)longdelay2(unsigned int i) 后的那個(gè)數(shù)字就是用在AT2051 12MHZ 上的延時(shí)時(shí)間 現(xiàn)在用在STC上,不行。) //////////////////////////////////////////////////////// //****************溫度采集部分************************// //////////////////////////////////////////////////////// void longdelay2(unsigned int i) // [32MHZ晶振] { while(i--); } //初始化函數(shù) void Init_DS18B20(void) { unsigned CHAR x=0; DQ = 1; //DQ復(fù)位 longdelay2(60); // 8 DQ = 0; //單片機(jī)將DQ拉低 longdelay2(470); //80 DQ = 1; //拉高總線 longdelay2(80); //14 x=DQ; //稍做延時(shí)后 如果x=0則初始化成功 x=1則初始化失敗 if(x == 0) month1 = 3; longdelay2(220); //(延時(shí)了213us); 20 } //讀一個(gè)字節(jié) uCHAR ReadOneChar(void) { unsigned CHAR i=0; unsigned CHAR dat = 0; for (i=8;i>0;i--) { DQ = 0; // 給脈沖信號(hào) dat>>=1; DQ = 1; // 給脈沖信號(hào) if(DQ) dat|=0x80; longdelay2(40); //4 } return(dat); } //寫一個(gè)字節(jié) void WriteOneChar(unsigned CHAR dat) { unsigned CHAR i=0; for (i=8; i>0; i--) { DQ = 0; DQ = dat&0x01; longdelay2(50); //5 DQ = 1; dat>>=1; } //delay(4); } //讀取溫度 uCHAR ReadTemperature(void) { unsigned CHAR a=0; unsigned CHAR b=0; unsigned CHAR t=0; //float tt=0; Init_DS18B20(); WriteOneChar(0xCC); // 跳過(guò)讀序號(hào)列號(hào)的操作 WriteOneChar(0x44); // 啟動(dòng)溫度轉(zhuǎn)換 Init_DS18B20(); WriteOneChar(0xCC); //跳過(guò)讀序號(hào)列號(hào)的操作 WriteOneChar(0xBE); //讀取溫度寄存器等(共可讀9個(gè)寄存器) 前兩個(gè)就是溫度 a=ReadOneChar(); b=ReadOneChar(); //t=b; b<<=4; t=(a&0xF0)>>4; b=b|t; //t= tt*10+0.5; //放大10倍輸出并四舍五入---此行沒(méi)用 return(b); } * - 本貼最后修改時(shí)間:2007-1-20 15:06:29 修改者:ihafd |
| 2樓: | >>參與討論 |
| 作者: shiyang800 于 2007/1/20 15:21:00 發(fā)布:
建議有條件的話,用示波器測(cè)試一下總線上的波形! |
|
| 3樓: | >>參與討論 |
| 作者: shiyang800 于 2007/1/20 15:22:00 發(fā)布:
程序肯定是沒(méi)什么問(wèn)題拉, 看看CPU設(shè)置啊什么的有沒(méi)有問(wèn)題 |
|
| 4樓: | >>參與討論 |
| 作者: ihafd 于 2007/1/20 15:23:00 發(fā)布:
我沒(méi)有好的示波器 CPU應(yīng)該還有什么東西要設(shè)置? |
|
| 5樓: | >>參與討論 |
| 作者: 一級(jí)菜鳥 于 2007/1/20 15:32:00 發(fā)布:
嘿嘿 void longdelay2(unsigned int i) // [32MHZ晶振] { while(i--); } 改成: void longdelay2(volatile unsigned int i) // [32MHZ晶振] { while(i--); } 試試? |
|
| 6樓: | >>參與討論 |
| 作者: ihafd 于 2007/1/20 15:40:00 發(fā)布:
一樣不行啊。 !! |
|
| 7樓: | >>參與討論 |
| 作者: 一級(jí)菜鳥 于 2007/1/20 15:44:00 發(fā)布:
呵呵,那你該找示波器或仿真器了,多半不出在延時(shí)的問(wèn)題上 |
|
| 8樓: | >>參與討論 |
| 作者: bh_wang 于 2007/1/20 15:56:00 發(fā)布:
模擬時(shí)序的代碼要關(guān)中斷。! |
|
| 9樓: | >>參與討論 |
| 作者: hotpower 于 2007/1/20 16:29:00 發(fā)布:
菜農(nóng)對(duì)模擬總線的菜經(jīng) 1-wire總線的讀估計(jì)領(lǐng)會(huì)的不好~~~ 建議: //讀一個(gè)字節(jié) uCHAR ReadOneChar(void) { unsigned CHAR i=0; unsigned CHAR dat = 0; for (i=8;i>0;i--) { DQ = 0; // 給脈沖信號(hào)//應(yīng)該注解為發(fā)送同步脈沖 dat>>=1;//估計(jì)時(shí)間太小 DQ = 1; // 給脈沖信號(hào)//應(yīng)該注解為釋放數(shù)據(jù)總線 //在此處加延時(shí),我認(rèn)為16.4KBPS的速率應(yīng)該在3uS~15uS處再讀 //否則你速度太快,可能測(cè)不出1820的寫'1'數(shù)據(jù) if(DQ)//以上不延時(shí),DQ=1將釋放不了1-wire總線//讀數(shù)據(jù)信號(hào) dat|=0x80;//釋放不了總線,DQ恒為0,故該句永遠(yuǎn)"休眠"~~~ longdelay2(40); //4 } return(dat); } //寫一個(gè)字節(jié) void WriteOneChar(unsigned CHAR dat) { unsigned CHAR i=0; for (i=8; i>0; i--) { DQ = 0;發(fā)送同步脈沖 //在此處加延時(shí),否則你速度太快,1820可能測(cè)不出下降沿 DQ = dat&0x01;//發(fā)送數(shù)據(jù) longdelay2(50); //5 DQ = 1;//釋放總線 //倒塌了,此處應(yīng)該加延時(shí)!!! dat>>=1;//該句有點(diǎn)延時(shí)效果但太小!!! } //delay(4); } 菜農(nóng)對(duì)模擬總線的菜經(jīng): 總線協(xié)議都會(huì)照顧到雙方的利益,不會(huì)因?yàn)樽约猴w快就不照顧對(duì)方,只要對(duì)方符合參賽條件. 1-wire應(yīng)該算串行同步協(xié)議,復(fù)位,寫'1',寫'0'都是用低電平觸發(fā)對(duì)方,以達(dá)到同步對(duì)方的目的. 同步過(guò)程是需要時(shí)間的,故特別在寫'1'或讀'1'時(shí),都應(yīng)該在同步完成后再讀寫. 所以應(yīng)該在3uS~15uS內(nèi)再執(zhí)行此操作. 一般模擬IO時(shí),信號(hào)跳變需要延時(shí). 例如: DQ = 0;//發(fā)送同步脈沖,通知對(duì)方開始準(zhǔn)備發(fā)送數(shù)據(jù) dat>>=1;//此句雖然做移位操作,對(duì)硬件來(lái)說(shuō)可以認(rèn)為是延時(shí) DQ = 1;//釋放數(shù)據(jù)總線 delay(xxx);//必須在此處加延時(shí),等待本方真正釋放總線,即完成對(duì)總線的充電過(guò)程!!! //本來(lái)可以用while(!DQ);//等待總線釋放,但由于是在接收過(guò)程,對(duì)方可能發(fā)送'1'而導(dǎo)致該語(yǔ)句死機(jī)!!!故應(yīng)該加延時(shí)等待才是!!! if(DQ)//此時(shí)才該讀數(shù)據(jù)信號(hào) //...... 如果樓主的程序在2051上運(yùn)行的很好,真是樓主的服氣~~~因?yàn)?a target="_blank" href="http://m.58mhw.cn/stock-ic/1820.html">1820速度很快.
|
|
| 10樓: | >>參與討論 |
| 作者: hotpower 于 2007/1/20 16:37:00 發(fā)布:
當(dāng)然在時(shí)序要求很嚴(yán)時(shí)應(yīng)該關(guān)中斷,不過(guò)樓主的病因不單于此處
|
|
| 11樓: | >>參與討論 |
| 作者: shiyang800 于 2007/1/20 18:03:00 發(fā)布:
同意hotpower 的觀點(diǎn),樓主的程序都運(yùn)行不起來(lái)哈! |
|
| 免費(fèi)注冊(cè)為維庫(kù)電子開發(fā)網(wǎng)會(huì)員,參與電子工程師社區(qū)討論,點(diǎn)此進(jìn)入 |
Copyright © 1998-2006 m.58mhw.cn 浙ICP證030469號(hào) |