#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit LS138A = P2^2; //138译码器
sbit LS138B = P2^3;
sbit LS138C = P2^4;
sbit DQ = P2^5;//DS18B20数据口
sbit dula=P2^7; //段选位
sbit BELL = P2^6;//设置P2.6口,为控制蜂鸣器发声的引脚
void init_ds18b20(void);
void delay(uint t);
void write_byte(uchar dat);
uchar read_byte(void);
uchar readtemperature(void);
void display(void);
uchar code table[ ] = { 0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71
};
void delay_50us(uint t)
{
uchar j;
for(;t>0;t--)
for(j=19;j>0;j--);
}
void main(void)
{
while(1)
{float temp;
display();
if(temp>=30) //蜂鸣器发生条件
{
BELL=0;
}
else
{
BELL=1;
}
}
}
void delay(uint t)
{
while(t--);
}
void init_ds18b20(void) //初始化函数
{
uchar n;
DQ=1; //DQ先置高
delay(8);//延时
DQ=0; //发送复位脉冲
delay(80); //延时(>480us)
DQ=1; //拉高数据线 ,释放总线
delay(8);
n=DQ;
delay(4);
}
void write_byte(uchar dat) //写函数
{
uchar i;
for(i=0;i<8;i++)
{
DQ=0;
DQ=dat&0x01; //最低位开始写
delay(4); //延时40us
DQ=1;
dat>>=1;//右移一位
}
delay(4);
}
uchar read_byte(void) //读函数
{
uchar i,value;
for(i=0;i<8;i++)
{
DQ=0;
value>>=1; //右移一位,也起延时作用
DQ=1;
if(DQ) //判断
value|=0x80; //读出来的数据放入高位,最后右移到低位
delay(4);
}
return value;
}
uchar readtemperature(void) //读温度函数
{
uchar a,b;
float c;
init_ds18b20();
write_byte(0xcc);// 跳过ROM
write_byte(0x44);//启动温度测量
delay(300);
init_ds18b20(); //初始化
write_byte(0xcc);// 跳过ROM
write_byte(0xbe);//读寄存器
a=read_byte(); //保存低位L
b=read_byte(); //保存高位H
//b<<=4;
//b+=(a&0xf0)>>4;
//c=(((b*256)+a)*0.0625*10+0.5);
//delay(200);
c=((b<<=4)+((a&0xf0)>>4))+((a&0x0f)*0.0625);
c=c*10+0.5;
return c;
}
void display(void) //显示函数
{ uint temp;
temp= readtemperature();
dula=1;
 0 = table[temp/100];
dula=0;
LS138A=1; LS138B=1; LS138C=0;
delay_50us(20);
dula=1;
 0 = table[temp%100/10]|0x80;
dula=0;
LS138A=0; LS138B=1; LS138C=0;
delay_50us(20);
dula=1;
 0=table[temp%10];
dula=0;
LS138A=1; LS138B=0; LS138C=0;
delay_50us(20);
dula=1;
 0=table[temp/100];
dula=0;
LS138A=0; LS138B=0; LS138C=0;
delay_50us(20);
}
为何温度到达25.5时会清零,请大神解决,谢谢 |