#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
bit flag;
sbit ds=P2^2;
sbit beep=P1^0;
uint temp;
sbit led3=P1^2;
sbit dula=P2^6;
sbit wela=P2^7;
sbit key1=P3^4;
sbit key2=P3^6;
sbit key3=P3^7;
uchar num,num_shang=0,num_xia=0,numled,flag_qiehuan;
uchar code table_du[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};
void delay(xms) //延时函数
{
uint i,j;
for(i=xms;i>0;i--)
for(j=100;j>0;j--);
}
void delayus(uint t)
{
while(t--);
}
void init() //初始化函数
{
TMOD=0x01; //设置定时器0位工作方式(00000001)
TH0=(65536-22500)/256; //装初值
TL0=(65536-22500)%256;
EA=1; //开总中断
ET0=1; //开定时器0中断
TR0=1;
}
void display_shumaguan() //显示子函数,中间两位数码管
{
uchar qian,bai,shi,ge;;
qian=num_shang/10; //分离要显示的函数
bai=num_shang%10;
dula=1;
P0=table_du[qian]; //送千位段选
dula=0;
P0=0xff; //送位选数据前关闭所有显示
wela=1;
P0=0xfb; //送位选数据
wela=0;
delay(4);
dula=1; //送各位段选函数
P0=table_du[bai];
dula=0;
P0=0xff;
wela=1;
P0=0xf7;
wela=0;
delay(4);
shi=num_xia/10;
ge=num_xia%10;
dula=1;
P0=table_du[shi];
dula=0;
P0=0xff;
wela=1;
P0=0xef;
wela=0;
delay(4);
dula=1;
P0=table_du[ge];
dula=0;
P0=0xff;
wela=1;
P0=0xdf;
wela=0;
// delay(1);
}
void ds_reset() //复位函数
{
ds=1;
delayus(5); // 延时
ds=0;
delayus(80);
ds=1;
delayus(14);
if(ds==0)
flag=1;
else
flag=0; //flag作为标志位,等1表示18b20存在
delayus(20);
}
bit ds_read_bit(void) //读一位数据函数
{
bit dat;
ds=0;
_nop_(); //延时机器周期
_nop_();
ds=1; //释放总线
_nop_();
dat=ds;
delayus(10); //延时100us
return dat;
}
uchar ds_read_byte() //读一个字节函数
{
uchar i,j,k;
for(i=0;i<8;i++) //一个字节8位组成,循环八次
{
j=ds_read_bit();
k=(j<<7)|(k>>1); //读出的数据最低位在最前面
}
return k;
}
void ds_write_byte(uchar dat) //写一个字节的函数
{
uchar i;
for(i=0;i<8;i++) //循环八位将一个字节由低到高写入
{
ds=0;
_nop_();
ds=dat&0x01; //保留dat的最低位
delayus(6);
ds=1; //释放总线
dat=dat>>1;
}
delayus(6);
}
uint read_temp() //读取温度函数
{
uchar a,b;
ds_reset();
ds_write_byte(0xcc);
ds_write_byte(0xbe);
a=ds_read_byte(); //读低八位
b=ds_read_byte(); //读高八位
temp=b;
temp=temp<<8;
temp=temp|a;
temp=temp*0.0625; //得到实际温度值
return temp;
}
void display(uint temp)
{
P0=table_du[temp/10];
dula=1;
dula=0;
P0=0xff;
wela=1;
P0=0xfe;
wela=0;
delay(4);
P0=table_du[temp%10];
dula=1;
dula=0;
P0=0xff;
wela=1;
P0=0xfd;
wela=0;
// delay(1);
}
void keyscan()
{
if(key1==0)//按键1处理
{
if(flag_qiehuan==0)
{
flag_qiehuan=1; //切换设置上限
}
else if(flag_qiehuan==1)
{
flag_qiehuan=0; //切换设置下限
}
}
if((key2==0)&&(flag_qiehuan==0)) //k2长按
{
delay(30);
if((key2==0)&&(flag_qiehuan==0))
{
num_xia++;
}
}
else if((key2==0)&&(flag_qiehuan==0)) //K2短按
{
delay(3);
if((key2==0)&&(flag_qiehuan==0))
{
num_xia++;
while(!key2);
}
}
if((key3==0)&&(flag_qiehuan==0))
{
delay(30);
if((key3==0)&&(flag_qiehuan==0))
{
num_xia--;
}
}
else if((key3==0)&&(flag_qiehuan==0)) //K3短按
{
delay(3);
if((key3==0)&&(flag_qiehuan==0))
{
num_xia--;
while(!key3);
}
}
if((key2==0)&&(flag_qiehuan==1))
{
delay(30);
if((key2==0)&&(flag_qiehuan==1))
{
num_shang++;
}
}
else if((key2==0)&&(flag_qiehuan==1))
{
delay(3);
if((key2==0)&&(flag_qiehuan==1))
{
num_shang++;
while(!key2);
}
}
if((key3==0)&&(flag_qiehuan==1))
{
delay(30);
if((key3==0)&&(flag_qiehuan==1))
{
num_shang--;
}
}
else if((key3==0)&&(flag_qiehuan==1))
{
delay(3);
if((key3==0)&&(flag_qiehuan==1))
{
num_shang--;
while(!key3);
}
}
}
void deal()
{
if((temp>=num_xia)||(temp<=num_shang))
{
beep=0;
}
if((temp<num_xia)&&(temp>num_shang))
{
beep=1;
}
}
void main()
{
init(); //初始化函数
while(1)
{
ds_reset();
ds_write_byte(0xcc);
ds_write_byte(0x44);
keyscan();
deal();
}
}
void T0_time() interrupt 1
{
TH0=(65536-22500)/256; //装初值
TL0=(65536-22500)%256;
numled++;
if(numled==50)
{
numled=0;
led3=~led3;
}
display_shumaguan();
display(read_temp());
}
|