- 没有使用软件延时的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;
- }
- }
|