发表于:2007-07-07 14:55:00
370楼
这是我的程序,为什么总是检测不到18B20,哪位高手给我看看啊,谢谢!!
#include "SPCE061V004.H"
#define uchar unsigned char
#define uint unsigned int
void init_1820();
write_1820(uchar x);
uchar read_1820();
void send_byte(uchar x);
void delay(uint x);
disp_led(long exact_temp);
//void disp_l();
uchar disp_table[16] = {
0x003f,0x0006,0x005b,0x004f,0x0066,0x006d,0x007d,0x0007,
0x007f,0x006f,0x0077,0x007c,0x0039,0x005e,0x0079,0x0071};
//uchar dp;
//long exact_temp;
long k;
void main()
{
int i;
uchar templ,temph;
long exact_temp;
//disp_led(0,0);
*P_SystemClock=0x0040;//32.765MHz
delay(3000);
*P_IOA_Dir=0xffff;
*P_IOA_Attrib=0xffff;
*P_IOA_Data=0x0000;
*P_Watchdog_Clear=0x0001;
*P_IOB_Dir=0xffff;
*P_IOB_Attrib=0xffff;
*P_IOB_Data=0x0000;
while(1)
{
init_1820();
write_1820(0xcc);
write_1820(0x44);
delay(600);
init_1820();
*P_Watchdog_Clear=0x0001;
write_1820(0xcc);
write_1820(0xbe);
for(i=0;i<750;i++) //每次转换需要延时750ms以上
{
disp_led(exact_temp);
delay(500);
}
templ=read_1820();
temph=read_1820();
exact_temp=(temph*256+templ)*0.0625;
//k=exact_temp;
*P_Watchdog_Clear=0x0001;
//exact_temp=46;
disp_led(exact_temp);
}
}
void delay(uint x)//1us
{
while(x--);
}
void init_1820()
{
long exact_temp;
*P_IOA_Data|=(1<<2);
*P_IOA_Data&=~(1<<2);
delay(600);//至少480us
*P_IOA_Data|=(1<<2);
*P_IOA_Dir=0x0000;
*P_IOA_Attrib=0x0000;
delay(30);//15-60us
while(!(*P_IOA_Data&(1<<2)))//测试用,但一直检测不到?是什么原因??
{
exact_temp=20;
disp_led(exact_temp);
}
//k=40;
//while(k--);
*P_IOA_Data&=~(1<<2);
delay(200);//60-240us
*P_IOA_Dir=0xffff;
*P_IOA_Attrib=0xffff;
}
write_1820(uchar x)
{
uchar i;
for(i=0;i<8;i++)
{
*P_IOA_Data=0x0000;
if(x&(1<<i))
*P_IOA_Data|=(1<<2);
else
*P_IOA_Data&=~(1<<2);
delay(30);//15-60us
*P_IOA_Data|=(1<<2);
}
*P_IOA_Data|=(1<<2);
}
uchar read_1820()
{
uchar i,temp=0;
for(i=0;i<8;i++)
{
*P_IOA_Data&=~(1<<2);
delay(3);
*P_IOA_Data|=(1<<2);
delay(30);//>15us
*P_IOA_Dir=0x0000;
*P_IOA_Attrib=0x0000;
if(*P_IOA_Data&(1<<2))
temp|=(1<<i);
else
temp&=~(1<<i);
delay(100);//60-120us
*P_IOA_Data|=(1<<2);
}
return (temp);
}
disp_led(long exact_temp)
{
uchar e_temp,e_temp1,e_temp2,e_temp3;
e_temp=exact_temp;
e_temp1=e_temp%10;
e_temp2=e_temp/10;
e_temp3=e_temp2%10;
*P_IOB_Data=(0x0100|disp_table[e_temp1]);
delay(500);
*P_IOB_Data=(0x0200|disp_table[e_temp3]);
//delay(50);
}