#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
/* sbit LSA=P2^1;
sbit LSB=P2^2;
sbit LSC=P2^3; */
sbit a1=P1^0;
sbit a2=P1^1;
sbit a3=P1^2;
sbit a4=P1^3;
sbit dq=P2^0;
sbit beep=P2^1;
sbit du=P3^7;
sbit key1=P2^4; //DS18B20选择按键
sbit key2=P2^5; //报警上下限温度设置键
sbit key3=P2^6; //温度设置加1键
sbit key4=P2^7; //温度设置减1键
unsigned char code table[]={0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x00 };
uchar code table1[]={
0xbf,0x86,0xdb,0xcf, //共阴极数码管字型码,带小数点
0xe6,0xed,0xfd,0x87,
0xff,0xef,0x00};
// unsigned char Data[8];
uchar SN[3][8];
uchar ba,sh,ge,aa,tmh,tml;
uint max,min,ID,keycon,t,xs,m,temp1;
void rom();
void key(void);
void alarm();
void display1(int m);
void keyselect(void);
void increase();
void decrease();
void readtemp();
uchar Ds18b20Init();
void Ds18b20WriteByte(uchar dat);
uchar Ds18b20ReadByte();
void display(uchar ba,uchar sh,uchar ge,uchar aa);
void delay1ms(uint y)
{
uint x;
for( ; y>0; y--)
{
for(x=110; x>0; x--);
}
}
void main()
{
//float a;
//int tp;
// unsigned char i;
// unsigned int j;
max=40;
min=20;
ID=0;
keycon=0;
rom();
while(1)
{key();
keyselect();
Ds18b20Init();
delay1ms(1);
Ds18b20WriteByte(0xcc);
Ds18b20WriteByte(0x44);//温度转换
readtemp();
/* Ds18b20WriteByte(0xbe);//发送读取命令
tml=Ds18b20ReadByte();
tmh=Ds18b20ReadByte();*/
}
alarm();
ba=t/100;
sh=t%100/10;
ge=t%10;
aa=xs%10;
if(ID==0) //没有任何设定按键按下,显示温度
{
display(ba,sh,ge,aa);
}
/*if(tp<0)
tp=tmh;
tp<<=8;
tp|=tml;
a=tp;
{
Data[0]=0x40;
tp=tp-1;
tp=~tp;
a=tp;
tp=a*0.0625*100+0.5;
}
else
{
Data[0]=0x00;
a=tp;
tp=a*0.0625*100+0.5;
}
Data[1]=table[tp/10000];
Data[2]=table[tp%10000/1000];
Data[3]=table[tp%1000/100]|0x80;
Data[4]=table[tp%100/10];
Data[5]=table[tp%10];
for(i=0;i<8;i++)
{switch(i)
{case(0):
LSA=0;LSB=0;LSC=0; break;//显示第0位
case(1):
LSA=1;LSB=0;LSC=0; break;//显示第1位
case(2):
LSA=0;LSB=1;LSC=0; break;//显示第2位
case(3):
LSA=1;LSB=1;LSC=0; break;//显示第3位
case(4):
LSA=0;LSB=0;LSC=1; break;//显示第4位
case(5):
LSA=1;LSB=0;LSC=1; break;//显示第5位
case(6):
LSA=0;LSB=1;LSC=1; break;//显示第6位
case(7):
LSA=1;LSB=1;LSC=1; break;//显示第7位
}
P0=Data[i];
j=300;
while(j--);
P0=0x00;
}*/
}
uchar Ds18b20Init()
{
uchar i;
dq = 0; //将总线拉低480us~960us
i = 70;
while(i--);//延时642us
dq = 1; //然后拉高总线,如果DS18B20做出反应会将在15us~60us后总线拉低
i = 0;
while(dq) //等待DS18B20拉低总线
{
delay1ms(1);
i++;
if(i>5)//等待>5MS
{
return 0;//初始化失败
}
}
return 1;//初始化成功
}
void Ds18b20WriteByte(uchar dat)
{
uint i, j;
for(j=0; j<8; j++)
{
dq = 0; //每写入一位数据之前先把总线拉低1us
i++;
dq = dat & 0x01; //然后写入一个数据,从最低位开始
i=6;
while(i--); //延时68us,持续时间最少60us
dq = 1; //然后释放总线,至少1us给总线恢复时间才能接着写入第二个数值
dat >>= 1;
}
}
uchar Ds18b20ReadByte()
{
uchar byte, bi;
uint i, j;
for(j=8; j>0; j--)
{
dq = 0;//先将总线拉低1us
i++;
dq = 1;//然后释放总线
i++;
i++;//延时6us等待数据稳定
bi = dq; //读取数据,从最低位开始读取
/*将byte左移一位,然后与上右移7位后的bi,注意移动之后移掉那位补0。*/
byte = (byte >> 1) | (bi << 7);
i = 4; //读取完之后等待48us再接着读取下一个数
while(i--);
}
return byte;
}
void readtemp()
{
uchar i,j;
uchar tml,tmh,t;
i=0;
if(keycon==0) //按键寻址,选择要显示的检测器件
{
j=1;
}
if(keycon==1)
{
j=2;
}
if(keycon==2)
{
j=3;
}
Ds18b20Init(); //复位
delay1ms(1000); //延时
Ds18b20WriteByte(0x55); //发送ROM匹配命令
for(i=0;i<8;i++)
{
Ds18b20WriteByte(SN[j][i]); //发送64位序列号
}
Ds18b20WriteByte(0xbe); //发送读取命令
tml=Ds18b20ReadByte(); //读取温度值低位
tmh=Ds18b20ReadByte(); //度取温度值高位
tmh=(i<<4)&0x7f; //屏蔽最高位(一位符号位)
tml=tml>>4; //低位右移,舍弃小数位。
t=tmh|tml; //实际温度整数部分
temp1=tml&0x0f;
xs=temp1*0.0625*10; //小数部分,若为0.5则算为了5来显示
}
void key(void)
{
do
{
if(key2==0) //判断SET键是否按下
{
delay1ms(20); //延时去抖
if(key2==0)
{
ID++;
if(ID>=3)
{
ID=0;
}
while(key2==0);
}
}
if(ID==1) //ID=1进入报警温度上限值设定
{
display1(max); //显示报警温度上限值
if(key3==0)
{
delay1ms(20);
if(key3==0) //判断加1键是否按下
{
increase(); //加"1"
display1(max); //重新显示报警温度上限值
}
while(key3==0);
}
if(key4==0)
{
delay1ms(20);
if(key4==0) //判断减1键是否按下
{
decrease(); //减"1"
display1(max); //重新显示报警温度上限值
}
while(key4==0); //知道释放按键,退出循环
}
}
if(ID==2) //ID=2进入报警温度下限值设定
{
display1(min); //重新显示报警温度下限值
if(key3==0)
{
delay1ms(20);
if(key3==0) //判断加1键是否按下
{
increase(); //加"1"
display1(min);
}
while(key3==0);
}
if(key4==0)
{
delay1ms(20);
if(key4==0) //判断减1键是否按下
{
decrease(); //减"1"
display1(min); //重新显示报警温度下限值
}
while(key4==0);
}
}
}
while(ID==0); //进入循环,知直到D=0,即SET按键要按第三下才能退出该温度设定程序
}
void rom()
{
uchar sn1; //以下是定义8个序列号变量
uchar sn2;
uchar sn3;
uchar sn4;
uchar sn5;
uchar sn6;
uchar sn7;
uchar sn8;
Ds18b20Init(); //复位
delay1ms(1000); //延时1S
Ds18b20WriteByte(0x33); //发送读序列号子程序
sn1=Ds18b20ReadByte(); //读取第一个序列号,
sn2=Ds18b20ReadByte(); //读取第二个序列号
sn3=Ds18b20ReadByte();
sn4=Ds18b20ReadByte();
sn5=Ds18b20ReadByte();
sn6=Ds18b20ReadByte();
sn7=Ds18b20ReadByte();
sn8=Ds18b20ReadByte();
}
void keyselect(void)
{
keycon=0; //器件选择标志位
if(key1==0)
{
delay1ms(20);
if(key1==0)
{
keycon++; //通过器件选择按键自加,标志位值代表三个不同器件
if(keycon>=3)
{
keycon=0;
}
while(key1==0);
}
}
}
void increase()
{
if(ID==1)
{
max++;
if(max>=70) //设定上限温度不得超过70,超过就默认为70
{
max=70;
}
}
if(ID==2)
{
if(min<max-10)
{
min++;
}
else
{
min=max-10;
}
}
}
void decrease()
{
if(ID==1)
{
if(max<min+10)
{
max--;
}
else
{
max=min+10;
}
}
if(ID==2)
{
min--;
if(min<=0) //下限设定不得低于0,若低于就默认为0
{
min=0;
}
}
}
void alarm()
{
beep=1;
if(t>=max) //温度大于设定最大值进入报警循环
{
beep=0; //打开蜂鸣器
delay1ms(500); //延时
beep=1; //关闭蜂鸣器
delay1ms(500); //延时
}
if(t<=min) //温度小于设定最小值进入报警循环
{
beep=0;
delay1ms(500);
beep=1;
delay1ms(500);
}
}
void display1(int m)
{
a1 = a2 = a3 = a4 = 1;
/*P0 = 0xff;
P0 = table[11];
a1 =0;
delay1ms(1);
P0 = 0xff;
a1 =1;
P0=0xfe;
a1 =0;
delay1ms(2);
P0 = 0xff;
P0 = table[T/10];
a2 =0;
delay1ms(1);
P0 = 0xff;
a2 =1;
P0=0xfd;
a2 =0;
delay1ms(2);*/
du=1; //段选打开,让十位要显示字符的代码传到所有位中
P0=table[m/10];
du=0;
delay1ms(1);
P0=0xff;
a2=0; //位选打开,选择第二个数码管,即十位显示
P0=0xfd;
delay1ms(2);
/*P0 = 0xff;
P0 = table[T%10];
a3 =0;
delay1ms(1);
P0 = 0xff;
a3 =1;
P0=0xfb;
a3 =0;
delayms(2); */
du=1; //段选打开,让个位要显示字符的代码传到所有位中
P0=table1[m%10];
du=0;
delay1ms(1) ;
P0=0xff;
a3=0; //位选打开,选择第三个数码管,即个位显示
P0=0xfb;
delay1ms(2);
/*P0 = 0xff;
P0 = table[1];
a4 =0;
delay1ms(1);
P0 = 0xff;
a4 =1;
P0=0xf7;
a4 =0;
delay1ms(2);*/
du=1; //段选打开,让小数位要显示字符的代码传到所有位中
P0=table[1]; //小数位一直显示0
du=0;
delay1ms(1);
P0=0xff;
a4=0; //位选打开,选择第四个数码管,即小数位显示
P0=0xf7;
delay1ms(2);
}
void display(uchar ba,uchar sh,uchar ge,uchar aa)
{
a1=a2=a3=a4=1;
P0 = 0xff;
P0 = table[ba];
a1 = 0;
delay1ms(5);
P0 = 0xff;
P0 = table[sh];
a2 = 0;
delay1ms(5);
P0 = 0xff;
P0 = table1[ge];
a3 = 0;
delay1ms(5);
P0 = 0xff;
P0 = table[aa];
a4 =0;
delay1ms(5);
}
|
|