DS18B20對時序要求比較苛刻,隨意套用別人的代碼不易成功。更不能隨意增減“;”號和改變數據類型。
- #include"reg52.h"
- //#include"onewire.h"
- //#include"absacc.h"
- sbit DQ=P1^4;
- code unsigned char tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff};
- unsigned char dspbuf[8]={0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff};
- unsigned char dspcom=0;
- unsigned char intr;
- bit temper_flag=0;
- bit init_ds18b20();
- void Write_DS18B20(unsigned char dat);
- unsigned char Read_DS18B20(void);
- unsigned int rd_temperature(void);
- void display(void);
- void Delay_OneWire(unsigned int t);
- void Delay_OneWire(unsigned int t)
- {
- while(t--);
- }
- void Write_DS18B20(unsigned char dat)
- {
- unsigned char i;
- for(i=0;i<8;i++)
- {
- DQ=0;
- DQ=dat&0x01;
- Delay_OneWire(5);
- DQ=1;
- dat>>=1;
- }
- Delay_OneWire(4);
- }
- unsigned char Read_DS18B20(void)
- {
- unsigned char i;
- unsigned char dat;
- for(i=0;i<8;i++)
- {
- DQ=0;
- dat>>=1;
- DQ=1;
- if(DQ)
- {
- dat|=0x80;
- }
- Delay_OneWire(4);
- }
- return dat;
- }
- bit init_ds18b20()
- {
- bit initflag=0;
- DQ=1;
- Delay_OneWire(8);
- DQ=0;
- Delay_OneWire(80);
- DQ=1;
- Delay_OneWire(10);
- initflag=DQ;
- Delay_OneWire(20);
- return initflag;
- }
- unsigned int rd_temperature(void)
- {
- unsigned char low,high;
- unsigned int temp;
- init_ds18b20();
- Write_DS18B20(0xCC);
- Write_DS18B20(0x44);
- Delay_OneWire(2000);
- init_ds18b20();
- Write_DS18B20(0xCC);
- Write_DS18B20(0xBE);
- low=Read_DS18B20();
- high=Read_DS18B20();
- temp=high<<8;
- temp|=low;
- return temp;
- }
- void main(void)
- {
- unsigned int temperature;
- unsigned char tempH,tempL;
- TMOD|=0x01;
- TH0=(65536-2000)/256;
- TL0=(65536-2000)%256;
- EA=1;
- ET0=1;
- rd_temperature();
- Delay_OneWire(0xffff);
- TR0=1;
- while(1)
- {
- if(temper_flag)
- {
- temper_flag=0;
- temperature=rd_temperature();
- tempH=temperature>>4;
- tempL=(temperature&0x0f)*0.625;
- dspbuf[5]=tab[tempH/10];
- dspbuf[6]=tab[tempH%10]&0x7f;
- dspbuf[7]=tab[tempL];
- }
- }
- }
- void _isr_timer_0(void) interrupt 1
- {
- TH0=(65536-2000)/256;
- TL0=(65536-2000)%256;
- display();
- if(++intr==100)
- {
- intr=0;
- temper_flag=1;
- }
- }
- void display(void)
- {
- P0=0xff;
- P2=0x01<<dspcom;
- P0=dspbuf[dspcom];
- dspcom=++dspcom%8;
- }
- /*
- unsigned char rd_temperature(void)
- {
- uchar low,high;
- unit temp;
- init_ds18b20();
- Write_DS18B20(0xCC);
- Write_DS18B20(0x44);
- Delay_OneWrite(400);
- init_ds18b20();
- Write_DS18B20(0xCC);
- Write_DS18B20(0xBE);
- low=Read_DS18B20();
- high=Read_DS18b20();
- temp=high;
- temp<<=8;
- temp|=low;
- temp=temp*(0.625);
- return temp;
- }
- void display(void)
- {
- P2=((P2&0x1f)|0xE0);
- P0=0xff;
- P2&=0x1f;
- P2=((P2&0x1f)|0xC0);
- P0=1<<dspcom;
- P2&=0x1f;
- P2=((P2&0x1f)|0xE0);
- if(dspcom==6)
- {
- P0=tab[dspbuf[dspcom]]&0x7f;
- }
- else
- P0=tab[dspbuf[dspcom]];
- P2&=0x1f;
- if(++dspcom==8)
- {
- dspcom=5;
- }
- }*/
復制代碼
|