|
在PROTEUS仿真中,用了數(shù)碼管去讀取溫度,但是發(fā)現(xiàn)有些特定的溫度,數(shù)據(jù)很穩(wěn)定,有些溫度會(huì)跳動(dòng),有些直接顯示亂碼
以下是仿真的18b20的代碼。請問是什么問題,我用的是12MHZ的內(nèi)部晶振
void delay_us(uint i)
{
while(i--);
}
void dschushihua()
{
zong=1;
delay_us(2);
zong=0;
delay_us(100);
zong=1;
delay_us(15);
}
bit dsrebit()
{
bit dat;
zong=0;
_nop_();
_nop_();
zong=1;
_nop_();
_nop_();
_nop_();
_nop_();
dat=zong;
delay_us(37);
return (dat);
}
void dsshuju(uchar dat)//Êý¾Ý
{
uchar i=0;
for(i=0;i<8;i++)
{
zong=0;
_nop_();
_nop_();
_nop_();
_nop_();
zong=dat&0x01;
delay_us(10);
zong=1;
dat>>=1;
}
}
int dsminging()
{
uchar i,j,dat;
dat=0;
for(i=1;i<=8;i++)
{
j=dsrebit();
dat=(j<<7)|(dat>>1);
}
return (dat);
}
void dszhuanhuan()//ת»»,Óõ½³õʼ»¯£¬È»ºóÒªÖ¸Áî
{
dschushihua();
delay_us(1);
dsshuju(0xcc);//¿ÉÒÔÌø¹ýROM
dsshuju(0x44);//ζÈת»¯ÃüÁî
}
void dsdu()
{
dschushihua();
delay_us(1);
dsshuju(0xcc);
dsshuju(0xbe);//¶ÁÈ¡ÃüÁî
}
int dsre()
{
int temp=0;
uchar tmh,tml;//¸ßµÍλ
dszhuanhuan();//ת»»
dsdu();//¶ÁÈ¡
tml=dsminging();//ÒòΪ¶ÁÈ¡µÄζÈÓÐ16λ//×¢Òâ
tmh=dsminging();
temp=tmh;//·Å¸ßλ
temp<<=8;
temp|=tml;
return temp;
}
|
|