音影先锋亚洲天堂网|电影世界尽头的爱完整版播放|国产 熟女 91|高清无码免费观看欧美日韩|韩国一区二区三区黄色录像|美女亚洲加勒比在线|亚洲综合网 开心五月|7x成人在线入口|成人网站免费日韩毛片区|国产黄片?一级?二级?三级

登錄 免費(fèi)注冊(cè) 首頁(yè) | 行業(yè)黑名單 | 幫助
維庫(kù)電子市場(chǎng)網(wǎng)
技術(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上不管是12MHZ24MHZ我都用這個(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
建議有條件的話,用示波器測(cè)試一下總線上的波形!
 
3樓: >>參與討論
shiyang800
程序肯定是沒(méi)什么問(wèn)題拉, 看看CPU設(shè)置啊什么的有沒(méi)有問(wèn)題
 
4樓: >>參與討論
ihafd
我沒(méi)有好的示波器
CPU應(yīng)該還有什么東西要設(shè)置?


5樓: >>參與討論
一級(jí)菜鳥
嘿嘿
void longdelay2(unsigned int i)   // [32MHZ晶振]
{
    while(i--);
}

改成:

void longdelay2(volatile unsigned int i)   // [32MHZ晶振]
{
    while(i--);
}
試試?

6樓: >>參與討論
ihafd
一樣不行啊。
!!

7樓: >>參與討論
一級(jí)菜鳥
呵呵,那你該找示波器或仿真器了,多半不出在延時(shí)的問(wèn)題上
 
8樓: >>參與討論
bh_wang
模擬時(shí)序的代碼要關(guān)中斷。!
 
9樓: >>參與討論
hotpower
菜農(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
當(dāng)然在時(shí)序要求很嚴(yán)時(shí)應(yīng)該關(guān)中斷,不過(guò)樓主的病因不單于此處
 

11樓: >>參與討論
shiyang800
同意hotpower 的觀點(diǎn),樓主的程序都運(yùn)行不起來(lái)哈!
 
參與討論
昵稱:
討論內(nèi)容:
 
 
相關(guān)帖子
請(qǐng)問(wèn)大家在51單片機(jī)系統(tǒng)(用電源5V)中用什么復(fù)位芯片?
算波特率時(shí)遇到的一個(gè)問(wèn)題
有人知道,哪里可以買到WinCE。
這個(gè)電路升壓原理是利用短路時(shí)候使得電感產(chǎn)生的電流嗎
大家有用過(guò)wave的仿真器嗎?請(qǐng)教一個(gè)問(wèn)題
免費(fèi)注冊(cè)為維庫(kù)電子開發(fā)網(wǎng)會(huì)員,參與電子工程師社區(qū)討論,點(diǎn)此進(jìn)入


Copyright © 1998-2006 m.58mhw.cn 浙ICP證030469號(hào)