没有使用软件延时的18B20驱动程序 (STC15W204S 1T 8051) 使用标准8051单片机需要将_nop_();的个数减少到2个。
很简单,只要把定时器设置为模式1,并开启总中断,定时器中断,再把这个中断程序贴进去就可以了。
在需要使用温度数据的地方,查询convfinsh标志状态,如果这个标志变成1,那么说明一个温度数据已经采集到了。拿去用即可
if(convfinsh==1)
{
dispval=TempRes*625L;
sendbuff[5]='0'+(dispval%10000000)/1000000;
sendbuff[6]='0'+(dispval%1000000)/100000;
sendbuff[7]='0'+(dispval%100000)/10000;
sendbuff[9]='0'+(dispval%10000)/1000;
sendbuff[10]='0'+(dispval%1000)/100;
sendbuff[11]='0'+(dispval%100)/10;
sendbuff[12]='0'+(dispval%10);
send(sendbuff,17);
while(sending);
convfinsh=0;
}
以下是中断服务程序:
void timer0(void) interrupt 1
{
static unsigned char step=1,cmd,bitcount;
DQ=1;
_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
switch(step)
{
case 1:DQ=0;TH0=(65536-480)/256;TL0=(65536-480)%256;step=2;break;
case 2:DQ=1;TH0=(65536-70)/256;TL0=(65536-70)%256;step=3;break;
case 3:if(DQ==1){step=1;}else{TH0=(65536-300)/256;TL0=(65536-300)%256;step=4;}break;
case 4:cmd=0xcc;step=5;bitcount=0;break;
case 5:
DQ=0;
_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
DQ=cmd&0x01;cmd=cmd>>1;TH0=(65536-80)/256;TL0=(65536-80)%256;
bitcount++;if(bitcount==8){cmd=0x44;step=6;bitcount=0;}break;
case 6:
DQ=0;
_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
DQ=cmd&0x01;cmd=cmd>>1;TH0=(65536-80)/256;TL0=(65536-80)%256;
bitcount++;if(bitcount==8){step=7;}break;
case 7:
DQ=0;
_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
DQ=1;
_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
if(DQ==1){step=8;}TH0=(65536-6000)/256;TL0=(65536-6000)%256;break;
case 8:DQ=0;TH0=(65536-480)/256;TL0=(65536-480)%256;step=9;break;
case 9:DQ=1;TH0=(65536-70)/256;TL0=(65536-70)%256;step=10;break;
case 10:if(DQ==1){step=1;}else{TH0=(65536-300)/256;TL0=(65536-300)%256;step=11;}break;
case 11:cmd=0xcc;step=12;bitcount=0;break;
case 12:
DQ=0;
_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
DQ=cmd&0x01;cmd=cmd>>1;TH0=(65536-80)/256;TL0=(65536-80)%256;
bitcount++;if(bitcount==8){cmd=0xbe;step=13;bitcount=0;}break;
case 13:
DQ=0;
_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
DQ=cmd&0x01;cmd=cmd>>1;TH0=(65536-80)/256;TL0=(65536-80)%256;
bitcount++;if(bitcount==8){step=14;bitcount=0;}break;
case 14:
DQ=0;
_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
DQ=1;
tempbindata=tempbindata>>1;if(DQ==1){tempbindata=tempbindata|0x8000;}
bitcount++;if(bitcount==16){TempRes=tempbindata;convfinsh=1;step=1;}
TH0=(65536-80)/256;TL0=(65536-80)%256;break;
}
}
|