|
在PROTEUS仿真中,用了数码管去读取温度,但是发现有些特定的温度,数据很稳定,有些温度会跳动,有些直接显示乱码
以下是仿真的18b20的代码。请问是什么问题,我用的是12MHZ的内部晶振
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;
}
|
|