📄 tiaoshi2.c
字号:
#include<reg51.h>
#include <absacc.h>
#include<intrins.h>
#include<math.h>
#define CON_8279 XBYTE [0x5fff]
#define DAT_8279 XBYTE [0x5eff]
sbit clflag=ACC^7;
sbit sw=P1^0;
sbit set=P1^1;
sbit up=P1^2;
sbit down=P1^3;
sbit ok=P1^4;
sbit next=P1^5;
sbit buzz=P1^6;
sbit relay=P1^7;
sbit led1=P2^6;
sbit led2=P2^7;
sbit DQ=P3^7;
unsigned char data agtemp[5]={0x00,0x00,0x00,0x00,0x00};
unsigned char data Dgram[3]={0x00,0x00,0x00};
unsigned char data disgram[6]={0x00,0x00,0x00,0x00,0x00,0x00};
unsigned char data pregram[18]={0x00,0x00,0x00,0x00,0x00,0x00,\
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
unsigned char data tempdata[2]={0x00,0x00};
unsigned char data ctemp,temp,buf=0,time,hour,minute,max,min;
bit tempov,now;
/******************11us延函数*****************/
void delay(unsigned int t)
{
for(;t>0;t--);
}
//
//
/******************ms延时程序*****************/
void delayms(unsigned int dt)
{
register unsigned char bt;
for(;dt>0;dt--)
for(bt=250;bt>0;bt--);
}
//
//
/******************复位函数*****************/
ow_reset(void)
{char presence=1;
while(presence)
{
while(presence)
{
DQ=1;_nop_();_nop_();
DQ=0;
delay(50);
DQ=1;
delay(6);
presence=DQ;
}
delay(45);
presence=~DQ;
}
DQ=1;
}
//
//
/******************DS18B20写命令函数*****************/
void write_byte(unsigned char val)
{
unsigned char i;
for(i=8;i>0;i--)
{
DQ=1;_nop_();_nop_();
DQ=0;_nop_();_nop_();_nop_();_nop_();_nop_();
DQ=val&0x01;
delay(6);
val=val/2;
}
DQ=1;
delay(1);
}
//
//
/******************DS18B20读一字节函数*****************/
unsigned char read_byte(void)
{
unsigned char i;
unsigned char value=0;
for(i=8;i>0;i--)
{
DQ=1;_nop_();_nop_();
value>>=1;
DQ=0;_nop_();_nop_();_nop_();_nop_();
DQ=1;_nop_();_nop_();_nop_();_nop_();
if(DQ)
value|=0x80;
delay(6);
}
DQ=1;
return(value);
}
//
//
/******************读出温度函数*****************/
void read_temp(void)
{
ow_reset();
write_byte(0xCC);
write_byte(0xBE);
tempdata[0]=read_byte();
tempdata[1]=read_byte();
ow_reset();
}
//
//
/******************温度数据处理函数*****************/
work_temp()
{
ctemp=((tempdata[0]&0xf0)>>4)|((tempdata[1]&0x0f)<<4);
if(ctemp>65) tempov=1;
else if(ctemp<45) tempov=0;
}
//
//
/******************测温函数*****************/
void temptest (void)
{
ow_reset();
write_byte(0xCC);
write_byte(0x44);
read_temp();
work_temp();
}
//
//
void disp_initial()
{
CON_8279=0xDC;
do {ACC=CON_8279;}
while (clflag==1);
CON_8279=0x00;
CON_8279=0x34;
delayms(4);
}
/******************显示函数*****************/
void display(void)
{
unsigned char code table[18]={0xc0,0xf9,0xa4,0xb0,0x99,\
0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,\
0xbf,0xff};
unsigned char i;
for(i=0;i<6;i++)
{ CON_8279=i+0x92;
DAT_8279=table[disgram[i]];
delayms(4);
}
}
//
//
/******************一位按键函数*****************/
void abc(void)
{
unsigned char bt;
for(bt=0;bt<6;bt++)
{
do
{
if(up==0)
{
buzz=0;
delayms(30);
buzz=1;
disgram[bt]++;
}
else if(down==0)
{
buzz=0;
delayms(30);
buzz=1;
disgram[bt]--;
}
}while(ok==1);
buzz=0;
delayms(30);
buzz=1;
}
}
//
//
//
//
/******************中断服务函数*****************/
void clock(void) interrupt 1
{
TH0=0x3C;
TL0=0xB7;
buf++;
if(buf==20)
{
buf=0;
Dgram[2]++;
if(Dgram[2]==60)
{
Dgram[2]=0;
Dgram[1]++;
if(Dgram[1]==60)
{
Dgram[1]=0;
Dgram[0]++;
if(Dgram[0]==24)
Dgram[0]=0;
}
}
}
}
//
//
/******************加热控制函数*****************/
void heatctrl(void)
{
unsigned char dt;
if(!tempov)
{
buzz=1;
led1=1;
if(now)
{
if(Dgram[0]<(hour+1))
{
if(ctemp>=temp)
relay=1;
else relay=0;
}
else now=0;
}
else
{
if (time>0)
{
if(Dgram[0]==hour&&Dgram[1]==minute)
{
relay=0;
if(ctemp<temp) relay=0;
else relay=1;
if(time==1) led2=1;
else
{
for(dt=0;dt<6;dt++)
pregram[dt]=pregram[dt+6];
temp=pregram[4]*10+pregram[5];
hour=pregram[0]*10+pregram[1];
minute=pregram[2]*10+pregram[3];
time--;
}
}
else if(Dgram[0]<(hour+1))
{
if(ctemp<temp) relay=0;
else relay=1;
}
else return;
}
else led2=1;
}
}
else{relay=1;
buzz=0;
led1=0;}
}
//
//
/******************按键扫描函数*****************/
unsigned char keyscan(void)
{
unsigned char bt,k=0,ch;
if(set==0)
{
buzz=0;
delayms(30);
buzz=1;
led2=0;
if(ok==0)
{
buzz=0;
delayms(30);
buzz=1;
do{
buzz=0;
delayms(30);
buzz=1;
abc();
for(bt=0;bt<6;bt++,k++)
{
pregram[k]=disgram[bt];
display();
}
}while(next==0);
hour=pregram[0]*10+pregram[1];
minute=pregram[2]*10+pregram[3];
temp=pregram[4]*10+pregram[5];
time=3;
now=0;
return(1);
}
else
{
abc();
for(bt=0;bt<7;bt++) display();
led2=1;
return(2);
}
}
else if(sw==0)
{
buzz=0;
delayms(30);
buzz=1;
sw=1;
while(sw==0) display();
ch=IE;
IE=0x00;
P0=0xff;
P1=0xff;
P2=0xff;
P3=0xff;
disgram[0]=0x10;
disgram[1]=0x10;
disgram[2]=0x10;
disgram[3]=0x10;
disgram[4]=0x10;
disgram[5]=0x10;
display();
while(1)
{
while(sw) display();
buzz=0;
delayms(30);
buzz=1;
if(sw==0) break;
}
while(sw==0) display();
IE=ch;
return(0);
}
else if(ok==0)
{
buzz=0;
delayms(30);
buzz=1;
abc();
for(bt=0;bt<7;bt++) display();
now=1;
hour=disgram[0]*10+disgram[1];
minute=disgram[2]*10+disgram[3];
temp=disgram[4]*10+disgram[5];
return(3);
}
else return(0);
}
//
//
/*******************主函数*****************/
void main(void)
{
signed char i,j,k,h;
ctemp=15;
tempov=0;
sw=0;
while(1)
{ disp_initial();
keyscan();
for(i=1,j=0;i<6,j<3;i+=3,j++)
Dgram[j]=pregram[i]+pregram[--i]*10;
TMOD=0x01;
TL0=0xB0;
TH0=0x3C;
IE=0x82;
TR0=1;
i=1;
do
{
for(j=0;j<16;j++)
{
if(keyscan())
i=6;
for(k=3,h=1;k>=1,h>=0;k--,h--)
{
disgram[k]=Dgram[h]%10;
disgram[--k]=Dgram[h]/10;
}
disgram[4]=ctemp/10;
disgram[5]=ctemp%10;
display();
heatctrl();
}
for(k=0;k<=4;k++)
{
temptest();
agtemp[k]=ctemp;
}
max=agtemp[0];
min=agtemp[0];
for(k=0;k<=4;k++)
{
if(agtemp[k]>max) max=agtemp[k];
if(agtemp[k]<min) min=agtemp[k];
ctemp+=agtemp[k];
}
temp=(ctemp-max-min-agtemp[4])/3;
}while(i--);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -