#define nop _nop_() #define uchar unsigned char #define uint unsigned int
unsigned char code Disp_Tab[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40}; unsigned long LedOut[5],LedNumVal; sbit DS18B20=P3^7;
sbit LS138A=P2^2; //管脚定义 sbit LS138B=P2^3; sbit LS138C=P2^4;
uchar flag,Temperature;
void delay(uchar x) { uchar a,b; for(a=x;a>0;a--) for(b=10;b>0;b--); }
void init_18B20() { DS18B20=1; nop; DS18B20=0; delay(10); DS18B20=1; delay(1); if(DS18B20==0) flag=1; else flag=0; delay(2); DS18B20=1; }
void Write(uchar deta) { uchar i; DS18B20=1; nop; for(i=0;i<8;i++)
{ DS18B20=0; DS18B20=deta&0x01; delay(1); DS18B20=1; deta>>=1; } }
unsigned char read () //读取单字节 { unsigned char idata i,u=0; for(i=0;i<8;i++) { DS18B20 = 0; u >>= 1; DS18B20 = 1; if(DS18B20==1) u |= 0x80; delay(1) ; } return u; }
void Config18b20 (void) //重新配置报警限定值和分辨率 {
init_18B20();
Write(0xcc); //skip rom
Write(0x4e); //write scratchpad Write(0x19); //上限 Write(0x1a); //下限
Write(0x7f); //set 12 bit (0.125) init_18B20();
Write(0xcc); //skip rom Write(0x48); //保存设定值 init_18B20();
Write(0xcc); //skip rom Write(0xb8); //回调设定值 }
void GemTemp () { Temperature = read()*0x100; Temperature=Temperature+read();
Temperature /= 16; delay(1); }
void GetTemp() { uchar i,j; for(j=255;j>0;j--) delay(255); Config18b20(); init_18B20(); GemTemp () ; }
void main() { uchar i,j; while(1) { GetTemp() ; LedNumVal=Temperature; //把实际温度送到LedNumVal变量中 LedOut[0]=Disp_Tab[LedNumVal%10000/1000]; LedOut[1]=Disp_Tab[LedNumVal%1000/100];
LedOut[2]=Disp_Tab[LedNumVal%100/10]; //十位 LedOut[3]=Disp_Tab[LedNumVal%10]; //个位
for(i=0; i<4; i++) { P0 = LedOut[i] ; switch(i) { //138译码 case 0:LS138A=0; LS138B=0; LS138C=0; break;
case 1:LS138A=1; LS138B=0; LS138C=0; break; case 2:LS138A=0; LS138B=1; LS138C=0; break; case 3:LS138A=1; LS138B=1; LS138C=0; break; } delay(100); } P0 = 0;
}
}