#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());
}
|