|
最近调试的18b20一直是一个值--我这边显示的是25.5度,试问是时序的问题?还是其他什么?附上部分程序
#include "18b20.h"
#include "delay.h"
void delay2us(unsigned char t) //2us
{
while(t--);
}
bit init_ds18b20(void)
{
bit initflag = 0;
DQ = 1;
delay2us(1);
DQ = 0;
delay2us(250);
DQ = 1;
delay2us(10);
initflag = DQ;
delay2us(40);
return initflag;
}
void wr_ds18b20(unsigned char byt)
{
unsigned char i;
for(i=0;i<8;i++)
{
DQ = 1;
_nop_();
DQ = 0;
DQ = byt&0x01;
delay2us(15);
DQ = 1;
byt >>= 1;
}
delay2us(5);
}
unsigned char rd_ds18b20(void)
{
unsigned char i;
unsigned char byt;
for(i=0;i<8;i++)
{
DQ = 0;
byt >>= 1;
DQ = 1;
if(DQ)
byt |= 0x80;
delay2us(30);
}
return byt;
}
unsigned int rd_temperature(void)
{
unsigned char low,high;
unsigned int temp;
init_ds18b20();
wr_ds18b20(0xCC);
wr_ds18b20(0x44);
init_ds18b20();
wr_ds18b20(0xCC);
wr_ds18b20(0xBE);
low = rd_ds18b20();
high = rd_ds18b20();
temp = high<<8;
temp += low;
return temp;
}
void timer0_init()
{
TMOD = 0x01;
TH0 = 0x3C;
TL0 = 0xB0;
TR0 = 1;
ET0 = 1;
EA = 1;
}
void main()
{
uint i;
DelayMs(500);
init_ds18b20();
LCD_Init();
DelayMs(20);
LCD_Clear();
delay(10);
for(i=0;i<5;i++)
{
buzz=0;
delay(10);
buzz=1;
delay(10);
}
timer0_init();
while (1)
{
dis[0]=value%10+'0';
dis[1]=value%100/10+'0';
dis[2]=value%1000/100+'0';
dis[3]=value/1000+'0';
if(t_flag==1)
{
value=rd_temperature();
if(value &0x8000)
{
LCD_Write_Char(7,1,0x2d);
value = ~value;
value +=1;
}
else
{
LCD_Write_Char(7,1,0x20);
}
t_flag=0;
}
display();
delay(100);
}
}
void timer0(void) interrupt 1
{
TH0=0x3c;
TL0=0xb0;
//TH0 = 0xD8; //10
//TL0 = 0xF0;
TIM++;
if(TIM==10)
{
t_flag=1;
TIM=0;
}[/code] |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?注册
x
阿莫论坛20周年了!感谢大家的支持与爱护!!
你熬了10碗粥,别人一桶水倒进去,淘走90碗,剩下10碗给你,你看似没亏,其实你那10碗已经没有之前的裹腹了,人家的一桶水换90碗,继续卖。说白了,通货膨胀就是,你的钱是挣来的,他的钱是印来的,掺和在一起,你的钱就贬值了。
|