主函数部分
#include <stc15f2k60s2.h>
#include <onewire.h>
#define uchar unsigned char
#define uint unsigned int
#define get() (P3&0x3f)|((P4&0x10)<<3)|((P4&0x04)<<4)
void allinit();
void Delay5ms() ; //@12.000MHz
void mkey();
void Timer0Init();
uchar tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf,0xff};
uchar disbuf[8]={0,1,2,3,11,11,11,11};
uchar discom=0,key=0;
float wendu;
uint w1;
void main()
{
Timer0Init();
allinit();
while(1)
{
w1=(uint)(gettemp()*100);
disbuf[4]=w1/1000;
disbuf[5]=w1/100%10;
disbuf[6]=w1/10%10;
disbuf[7]=w1%10;
}
}
void Timer0Init(void) //1??@12.000MHz
{
AUXR |= 0x80; //?????1T??
TMOD &= 0xF0; //???????
TL0 = 0x20; //??????
TH0 = 0xD1; //??????
TF0 = 0; //??TF0??
TR0 = 1; //???0????
ET0=1;
EA=1;
}
void time0() interrupt 1
{
P2=0x00;
P0=1<<discom;
P2=0xc0;
P2=0x00;
P0=tab[disbuf[discom]];
P2=0xe0;
P2=0x00;
if(++discom==8)discom=0;
}
void allinit()
{
P2=0x80;
P0=0xff;
P2=0xa0;
P0=0x00;
P2=0xc0;
P0=0xff;
P2=0xe0;
P0=0xff;
}
void Delay5ms() //@12.000MHz
{
unsigned char i, j;
i = 59;
j = 90;
do
{
while (--j);
} while (--i);
}
温度驱动子函数部分由官方驱动文件修改而来
#include <stc15f2k60s2.h>
sbit DQ = P1^4; //单总线接口
void Delay100us() ;//@12.000MHz
void Delay500us() ;//@12.000MHz
void Write_DS18B20(unsigned char dat);
//从DS18B20读取一个字节
unsigned char Read_DS18B20(void);
//DS18B20设备初始化
void init_ds18b20(void);
float gettemp();
//单总线延时函数
//void Delay_OneWire(unsigned int t) //STC89C52RC
//{
// while(t--);
//}
//通过单总线向DS18B20写一个字节
float gettemp()
{
unsigned int temp;
unsigned char low,high;
init_ds18b20();
Write_DS18B20(0xcc);
Write_DS18B20(0x44);
Delay500us();Delay500us();
init_ds18b20();
Write_DS18B20(0xcc);
Write_DS18B20(0xbe);
low=Read_DS18B20();
high=Read_DS18B20();
temp=(high<<8)|low;
return temp*0.0625;///要除以16分之1
}
void Write_DS18B20(unsigned char dat)
{
unsigned char i;
for(i=0;i<8;i++)
{
DQ = 0;
DQ = dat&0x01;
Delay100us() ;
DQ = 1;
dat >>= 1;
}
Delay100us() ;
}
//从DS18B20读取一个字节
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;
}
Delay100us() ;
}
return dat;
}
//DS18B20设备初始化
void init_ds18b20(void)
{
DQ = 0;
Delay500us() ;
DQ = 1;
Delay500us() ;
}
void Delay100us() //@12.000MHz
{
unsigned char i, j;
i = 2;
j = 39;
do
{
while (--j);
} while (--i);
}
void Delay500us() //@12.000MHz
{
unsigned char i, j;
i = 6;
j = 211;
do
{
while (--j);
} while (--i);
}