//共阳数码管段码表
unsigned char code Segment[10]=
{0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
//数码管位控制
sbit P20=P2^0;
sbit P21=P2^1;
sbit P22=P2^2;
sbit P23=P2^3;
sbit P24=P2^4;
sbit P25=P2^5;
sbit P26=P2^6;
sbit P27=P2^7;
sbit DQ=P3^6;
sbit Led0=P3^7; //指示DQ的状态
unsigned char RAMchar,TempertureH,TempertureL;
unsigned char TempertureFlag,Temperture;
void DS18B20Reset();
void Writechar(unsigned char CMDchar);
void Readchar();
void ReadTemperture();
void Display();
void Delay5us();
void Delay60us();
void Delay480us();
void Delay2ms();
void main()
{
DS18B20Reset();
while(1)
{
ReadTemperture();
Display();
}
}
/**********ds18b20初始化函数**********************/
void DS18B20Reset()
{
DQ=0; //单片机将总线DQ电平拉低
Delay480us(); //精确延时480us~960us
DQ=1; //单片机将总线DQ电平拉高
Delay60us(); //DS18B20等待60us后发出DQ低电平信号
while(DQ); //如果初始化成功 则DQ=0
Led0=0;
DQ=1; //单片机将总线DQ电平拉高
Delay480us(); //等待设备释放数据线
}
/*************DS18B20写一个字节****************/
void Writechar(unsigned char CMDchar)
{
unsigned char i=8;
while (i--) //8位计数器
{
DQ=1;
DQ=0;
Delay5us();
DQ=CMDchar&0x01;
Delay60us();
DQ=1;
CMDchar=CMDchar>>1;
}
}
/**************读取ds18b20当前温度************/
void Readchar()
{
unsigned char i=8;
while(i--)
{
DQ=1;
DQ=0;
Delay5us();
DQ=1;
Delay5us();
RAMchar=RAMchar>>1;
if(DQ)RAMchar=RAMchar|0x80;
Delay60us();
DQ=1;
}
}
void ReadTemperture()
{
DS18B20Reset();
Writechar(0xCC); // 跳过读序列号的操作
Writechar(0x44); // 启动温度转换
DS18B20Reset();
Writechar(0xCC); // 跳过读序列号的操作
Writechar(0xBE); // 读寄存器的数据(共可读9个寄存器,前两个是温度L和H)
Readchar();
TempertureL=RAMchar; // 读温度L
Readchar();
TempertureH=RAMchar; // 读温度H
}
void Display()
{
if(TempertureH>=16)
{
TempertureFlag=1;
TempertureH=((256-TempertureH)-1)<<4;
TempertureL=(256-TempertureL)>>4;
Temperture=TempertureH+TempertureL;
}
else
{
TempertureFlag=0;
TempertureH=TempertureH<<4;
TempertureL=TempertureL>>4;
Temperture=TempertureH+TempertureL;
}
P2=0xff;
P0=0xff;
if(TempertureFlag)P0=0xbf;//10111111B
P23=0;
Delay2ms();
P2=0xff;
P0=Segment[Temperture/100];
P22=0;
Delay2ms();
P2=0xff;
P0=Segment[Temperture%100/10];
P21=0;
Delay2ms();
P2=0xff;
P0=Segment[Temperture%10];
P20=0;
Delay2ms();
}
void Delay5us()
{
TMOD=0x02;
TH0=256-5;
TL0=256-5;
TF0=0;
TR0=1;
while(!TF0);
TF0=0;
}
void Delay60us()
{
TMOD=0x02;
TH0=256-60;
TL0=256-60;
TR0=1;
while(!TF0);
TF0=0;
}
void Delay480us()
{
TMOD=0x02;
TL0=256-240;
TH0=TL0;
TF0=0;
TR0=1;
while(!TF0);
TF0=0;
while(!TF0);
TF0=0;
}
void Delay2ms()
{
unsigned char i=4,j=250;
while(i--)
while(j--);
}
******************************************************************************
这是调试好的程序,至于电路图还没画呢,我是在开发板上运行的。