|
#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) //延時(shí)函數(shù)
{
uint i,j;
for(i=xms;i>0;i--)
for(j=100;j>0;j--);
}
void delayus(uint t)
{
while(t--);
}
void init() //初始化函數(shù)
{
TMOD=0x01; //設(shè)置定時(shí)器0位工作方式(00000001)
TH0=(65536-22500)/256; //裝初值
TL0=(65536-22500)%256;
EA=1; //開總中斷
ET0=1; //開定時(shí)器0中斷
TR0=1;
}
void display_shumaguan() //顯示子函數(shù),中間兩位數(shù)碼管
{
uchar qian,bai,shi,ge;;
qian=num_shang/10; //分離要顯示的函數(shù)
bai=num_shang%10;
dula=1;
P0=table_du[qian]; //送千位段選
dula=0;
P0=0xff; //送位選數(shù)據(jù)前關(guān)閉所有顯示
wela=1;
P0=0xfb; //送位選數(shù)據(jù)
wela=0;
delay(4);
dula=1; //送各位段選函數(shù)
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() //復(fù)位函數(shù)
{
ds=1;
delayus(5); // 延時(shí)
ds=0;
delayus(80);
ds=1;
delayus(14);
if(ds==0)
flag=1;
else
flag=0; //flag作為標(biāo)志位,等1表示18b20存在
delayus(20);
}
bit ds_read_bit(void) //讀一位數(shù)據(jù)函數(shù)
{
bit dat;
ds=0;
_nop_(); //延時(shí)機(jī)器周期
_nop_();
ds=1; //釋放總線
_nop_();
dat=ds;
delayus(10); //延時(shí)100us
return dat;
}
uchar ds_read_byte() //讀一個(gè)字節(jié)函數(shù)
{
uchar i,j,k;
for(i=0;i<8;i++) //一個(gè)字節(jié)8位組成,循環(huán)八次
{
j=ds_read_bit();
k=(j<<7)|(k>>1); //讀出的數(shù)據(jù)最低位在最前面
}
return k;
}
void ds_write_byte(uchar dat) //寫一個(gè)字節(jié)的函數(shù)
{
uchar i;
for(i=0;i<8;i++) //循環(huán)八位將一個(gè)字節(jié)由低到高寫入
{
ds=0;
_nop_();
ds=dat&0x01; //保留dat的最低位
delayus(6);
ds=1; //釋放總線
dat=dat>>1;
}
delayus(6);
}
uint read_temp() //讀取溫度函數(shù)
{
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; //得到實(shí)際溫度值
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; //切換設(shè)置上限
}
else if(flag_qiehuan==1)
{
flag_qiehuan=0; //切換設(shè)置下限
}
}
if((key2==0)&&(flag_qiehuan==0)) //k2長(zhǎng)按
{
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(); //初始化函數(shù)
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());
}
|
|