}
/*以上为一些常规设定*/
//*******************************************************************
/****************时钟*******************************************/
voidinit()
{
TMOD=0x21;//工作在方式1定时器T0
TH0=0x3c;//设定初值3cb0为50ms延时
TL0=0xb0;
ET0=1;
EA=1;
TR0=1;
}
uintaa1,db,bb,cc,dd,c1,c2,d1,d2;
voidt0()interrupt1//时钟中断入口
{
if(TZTLL)
{fmq=1;g=1;}
TH0=0x3c;//重新装初值
TL0=0xb0;
aa1++;
if(aa1==10)
{db=1;}
if(aa1==20)
{db=0;
bb++;//秒位
aa1=0;
if(bb==60)
{
cc++;//分位
bb=0;aa1=0;
if(cc==60)
{
dd++;//小时位
aa1=0;bb=0;cc=0;
if(dd==24)
{
aa1=0;bb=0;cc=0;dd=0;
}
}}}}
ucharb1,b2;
szm()
{
b1=bb/10;
b2=bb%10;
led=smg34[b1];
s3=0;
delayms
(1);
s3=1;
led=smg34[b2];
s4=0;
delayms
(1);
s4=1;
}
szxs()
{
c1=cc/10;
c2=cc%10;
d1=dd/10;
d2=dd%10;
if(db)
{
led=smg34[c1];
}
else
led=dian34[c1];
s3=0;
delayms
(1);
s3=1;
led=smg34[c2];
s4=0;
delayms
(1);
s4=1;
led=smg12[d1];
s1=0;
delayms
(1);
s1=1;
if(db)
{
led=smg12[d2];
}
else
led=dian12[d2];
s2=0;
delayms
(1);
s2=1;
}
//********************************************************************
/*一下为温度18b20程序*/
uchartime;
bitinit18b20(void)//初始化
{
bitflag;
wd=0;
for(time=0;time<200;time++);//拉低480us到960us
wd=1;
for(time=0;time<10;time++);//拉高15到60us
flag=wd;
for(time=0;time<200;time++);//主机接收480us左右
return(flag);
}
ucharreadonechar(void)//读取18b20的一个字节
{
uchari;
uchardat;
for(i=0;i<8;i++)
{
wd=1;
_nop_();
wd=0;
dat>>=1;
_nop_();
wd=1;
for(time=0;time<2;time++);//延时6us让主机采样
if(wd==1)
dat|=0x80;//如果读到的是,则将1存入dat
else
dat|=0x00;
for(time=0;time<5;time++);//延时3us,两个读时序之间必须有大于1us的恢复期
}
return(dat);
}
writeonechar(uchardat)//向18b20写一个字节
{
uchari=0;
for(i=0;i<8;i++)
{
wd=1;
_nop_();
wd=0;
wd=dat&0x01;//利用与运算取出要写的某位二进制数据,并将其送到数据线上等待DS18B20采样
for(time=0;time<10;time++);//延时约30us,DS18B20在拉低后的约15~60us期间从数据线上采样
wd=1;
for(time=0;time<1;time++);//延时3us,两个写时序间至少需要1us的恢复期
dat>>=1;//将dat中的各二进制位数据右移1位
}
for(time=0;time<4;time++);//稍作延时,给硬件一点反应时间
}
voidreadtmp()//准备读温度
{
init18b20();
writeonechar(0xcc);//跳过读序号列号的操作
writeonechar(0x44);//启动温度转换
for(time=0;time<100;time++);//300us左右转化
init18b20();
writeonechar(0xcc);
writeonechar(0xbe);//存储温度的高低位
}
/*以上为18b20程序*/
//*******************************************************************
//********************************************************************
/*以下为键盘识别程序*/
//键盘选择程序
voidkeyz()
{
uchara;
key=0xf0;
a=key;
a&=0xf0;
a|=0xf0;
if(a!
=0)
{
//按键24
if(key24==0)
{
delayms(20);
if(key24==0)
{
key=0xef;
_nop_();
//按键2420温度加按键
if(key20==0)
{
delayms(20);
if(key20==0)
{
while(key20!
=0);
delayms
(1);
while(key20!
=0);
if(flagw==0)//设定温度上下限值
{
if(flags)
{
if(THH<125&&THH>=TLL)
{
THH++;
}
}
if(flagx)
{
if(TLL>=0&&TLL{
TLL++;
}
}
}
flagbjg=0;//报警开
flagbjk=1;
if(flagsz)//时钟小时加
{dd++;
if(dd==24)
{dd=0;
}
}
}
}
//按键2421//功能切换键
if(key21==0)
{
delayms(20);
if(key21==0)
{
while(key21!
=0);
delayms
(1);
while(key21!
=0);
if(flagw)
{flagw=0;flags=1;flagx=0;flagsz=0;}
elseif(flags)
{flags=0;flagx=1;flagw=0;flagsz=0;}
elseif(flagx)
{flags=0;flagw=0;flagx=0;flagsz=1;}
else
{flags=0;flagw=1;flagx=0;flagsz=0;}
}
}
//按键2422温度减按键
if(key22==0)
{
delayms(20);
if(key22==0)
{
while(key22!
=0);
delayms
(1);
while(key22!
=0);
if(flagw==0)//设定温度上下限减
{
if(flags)
{
if(THH<=125&&THH>TLL)
{
THH--;
}}
if(flagx)
{
if(TLL>0&&TLL<=THH)
{
TLL--;}}
}
flagcj=0;
flagbjg=1;//报警关
flagbjk=0;
if(flagsz)//时钟分钟加
{cc++;
if(cc==60)
{cc=0;
}
}
}
}
//按键2423
if(key23==0)
{
delayms(20);
if(key23==0)
{
while(key23!
=0);
delayms
(1);
while(key23!
=0);
//处理程序
}
}
}
}//到此为设置24按键
//按键25
if(key25==0)
{
delayms(20);
if(key25==0)
{
key=0xdf;
_nop_();
//按键2520
if(key20==0)
{
delayms(20);
if(key20==0)
{
while(key20!
=0);
delayms
(1);
while(key20!
=0);
}
}
//按键2521
if(key21==0)
{
delayms(20);
if(key21==0)
{
while(key21!
=0);
delayms
(1);
while(key21!
=0);
flagckf=1;
if(flagsz)
{
if(flagsm==0)
flagsm=1;
else
flagsm=0;
}
if(flags)
{
flagcj=1;
}
if(flagx)
{
flagcj=1;
}
}
}
//按键2522
if(key22==0)
{
delayms(20);
if(key22==0)
{
while(key22!
=0);
delayms
(1);
while(key22!
=0);
}
}
//按键2523
if(key23==0)
{
delayms(20);
if(key23==0)
{
while(key23!
=0);
delayms
(1);
while(key23!
=0);
//处理程序
}
}
}
}//到此为设置25按键
}
}
/*以上为按键识别程序*/
//*******************************************************************
//*******************************************************************
/*以下为串口发送程序*/
ckinit()
{
TMOD=0x21;
SCON=0x50;
TH1=0xf3;
TL1=0xf3;
PCON=0x80;
ES=1;
EA=1;
TR1=1;
}
ucharaa;ucharckjs;
voidserial()interrupt4
{
if(TZTLL)
{fmq=1;g=1;}
if(flags)
{
if(flagcj)
{
if(RI)
{
RI=0;
ckjs=SBUF;
THH=ckjs;
}
}
}
if(flagx)
{
if(flagcj)
{
if(RI)
{
RI=0;
ckjs=SBUF;
TLL=ckjs;
}
}
}
}
//*********************以上为串口发送程序*****************************
//********************************************************************
/*以下为温度上下限显设定示*/
wds()//设置上限
{
uchara,b,c;
ckinit();
a=THH/100;//上限百位温度
b=(THH%100)/10;//上限十位温度
c=THH%10;
//上限个位温度
if(a>0)
{
led=smg12[a];
s1=0;
delayms
(1);
s1=1;
}
if(b>0||a>0)
{
led=smg12[b];
s2=0;
delayms
(1);
s2=1;
}
led=smg34[c];
s3=0;
delayms
(1);
s3=1;
led=0x7f;
s4=0;
delayms
(1);
s4=1;
}
ucharckjsx;
wdx()//设置下限
{
uchara1,b1,c1;
ckinit();
a1=TLL/100;//下限百位温度
b1=(TLL%100)/10;//下限十位温度
c1=TLL%10;//下限个位温度
if(a1>0)
{
led=smg12[a1];
s1=0;
delayms
(1);
s1=1;
}
if(b1>0||a1>0)
{
led=smg12[b1];
s2=0;
delayms
(1);
s2=1;
}
led=smg34[c1];
s3=0;
delayms
(1);
s3=1;
led=0x7f;
s1=0;
delayms
(1);
s1=1;
}
/*以上为温度上下限显示设定*/
//*******************************************************************
//********************************************************************
/*以下为温度显示程序*/
xianshiwendu()//显示温度程序
{
ucharj,k,l,m;//定义个十百小数
readtmp();
TL=readonechar();
TH=readonechar();
TZ=TH*16+TL/16;
TX=(TL%16)*10/16;
j=TZ/100;//温度百位
k=(TZ%100)/10;//温度十位
l=TZ%10;//温度个位
m=TX;//温度小数位
if(flagbjg==0)
{
if(TZ>=THH||TZ<=TLL)//上下限报警
{
fmq=0;
g=0;
led=0x5a;
delayms
(1);
}
else
{fmq=1;
g=1;
}
}
g=1;
if(flagbjk==0)
{fmq=1;}
led=smg12[k];
s1=0;
delayms
(1);
s1=1;
led=dian[l];
s2=0;
delayms
(1);
s2=1;
led=smg34[m];
s3=0;
delayms
(1);
s3=1;
led=0x70;
s4=0;
delayms
(1);
s4=1;
//发送温度
ckinit();
while(flagckf)
{
ES=0;
SBUF=tab[k];
while(!
TI);
TI=0;
SBUF=tab[l];
while(!
TI);
TI=0;
SBUF=46;
while(!
TI);
TI=0;
SBUF=tab[m];
while(!
TI);
TI=0;
SBUF=32;
while(!
TI);
TI=0;
ES=1;
flagckf=0;
}
}
/*以上为温度显示程序*/
//*******************************************************************
//********************************************************************
/*以下为主函数*/
voidmain()
{
THH=30;
TLL=10;
flagw=1;
flags=0;
flagx=0;
flagbjg=0;
flagbjk=1;
flagsz=0;
g=1;
flagsm=0;
init();
while
(1)
{
keyz();
if(flagw==1)
{
xianshiwendu();
}
if(flags==1)
{
wds();
}
if(flagx==1)
{
wdx();
}
if(flagsz)
{
TR1=0;ES=0;
if(flagsm==0)
{
szxs();
}
if(flagsm==1)
szm();
}
}
}
//*****程序结束***********************/