📄 温度计.c
字号:
#include <AT89X51.H>
#include <absacc.h>
#define wlcdcom XBYTE[0xf8ff]
#define rlcdcom XBYTE[0xfcff]
#define wlcddata XBYTE[0xfaff]
#define rlcddata XBYTE[0xfeff]
typedef unsigned char byte;
typedef unsigned int word;
unsigned char code tab0[]={0,0,1,1,2,3,3,4,5,5,6,6,7,8,8,9};
unsigned char code tab1[]={'T','h','e',' ','p','r','o','g','r','a','m','m','e',' ','i','s',0x00};
unsigned char code tab2[]={'d','e','s','i','g','n','e','d',' ','b','y',' ','h','i','f','i',0x00};
unsigned char code tab3[]={'0','1','2','3','4','5','6','7','8','9'};
unsigned char code tab4[16][4]={{'0','0','0','0'},{'0','6','2','5'},{'1','2','5','0'},{'1','8','7','5'},
{'2','5','0','0'},{'3','1','2','5'},{'3','7','5','0'},{'4','3','7','5'},
{'5','0','0','0'},{'5','6','2','5'},{'6','2','5','0'},{'6','8','7','5'},
{'7','5','0','0'},{'8','1','2','5'},{'8','7','5','0'},{'9','3','7','5'}};
unsigned char temp[9],time[9],high[7]={'H','T','0','0','.','0',0x00},low[7]={'L','T','0','0','.','0',0x00};
unsigned char h[3],l[3],nonce_t[3];
sbit busy=ACC^7;
sbit DQ=P3^2;
sbit time_set=P1^0;
sbit temp_set=P1^1;
sbit inc=P1^2;
sbit dec=P1^3;
sbit bell=P1^6;
sbit fan=P1^4;
sbit heater=P1^5;
sbit l_led=P2^6;
sbit h_led=P2^7;
unsigned int b,c;
unsigned char t,tf,set_coun,temp_coun;
unsigned char hour,minute,second;
bit time_flag,set_flag,temp_flag;
bit t_c,bell_flag,ring_flag;
bit flag1;flag2;
//查询忙标志位//
void wait(void)
{ do
ACC=rlcdcom;
while(busy);
}
//LCD初始化//
void lcd_init(void)
{ wlcdcom=0x38;
wait();
wlcdcom=0x06;
wait();
wlcdcom=0x0c;
wait();
wlcdcom=0x01;
wait();
}
//LCD驱动
void lcd_display(c_a,pos)
unsigned char pos;
unsigned char *c_a;
{ wlcdcom=pos;
wait();
while(*c_a!=0x00)
{ wlcddata=*c_a;
wait();
c_a++;
}
}
//延时
void delay(word useconds)
{
for(;useconds>0;useconds--);
}
//复位
byte ow_reset(void)
{
byte presence;
DQ = 0;
delay(29);
DQ = 1;
delay(3);
presence = DQ;
delay(25);
return(presence);
}
//从 1-wire 总线上读取一个字节
byte read_byte(void)
{
byte i;
byte v_alue = 0;
for (i=8;i>0;i--)
{
v_alue>>=1;
DQ = 0;
DQ = 1;
delay(1);
if(DQ) v_alue|=0x80;
delay(6);
}
return(v_alue);
}
//向 1-WIRE 总线上写一个字节
void write_byte(char val)
{
byte i;
for (i=8; i>0; i--)
{
DQ = 0;
DQ = val&0x01;
delay(5);
DQ = 1;
val=val/2;
}
delay(5);
}
//读取温度
unsigned int Read_Temperature(void)
{
union{
byte c[2];
unsigned int x;
}temp;
ow_reset();
write_byte(0xCC);
write_byte(0xBE);
temp.c[1]=read_byte();
temp.c[0]=read_byte();
ow_reset();
write_byte(0xCC);
write_byte(0x44);
return temp.x;
}
//BCD码转换
void bcd_transform(void)
{ unsigned char b,c,n;
unsigned int;
unsigned int tm,a;
tm=Read_Temperature();
a=tm>>4;
c=(unsigned char)a&0x00ff; //整数部分
n=c/100;
b=c%100;
temp[0]=tab3[n];
n=b/10;
temp[1]=tab3[n];
nonce_t[0]=n;
n=b%10;
temp[2]=tab3[n];
nonce_t[1]=n;
temp[3]='.';
a=(unsigned char)tm&0x000f; //小数部分
for(b=0;b<=4;b++)
{ temp[b+4]=tab4[a][b];
}
nonce_t[2]=tab0[a];
temp[8]=0x00;
}
//定时器0中断服务程序
void time0() interrupt 1 using 1
{ TH0=0x3c;
TL0=0xa8;
t++;
tf++;
if(tf==10)
{ time_flag=~time_flag;
tf=0;
bell=time_flag|ring_flag;
}
if(t==20)
{
t=0;
second++;
if(second==60)
{ second=0;
minute++;
if(minute==60)
{ minute=0;
hour++;
if(hour==24)
{ hour=0;
}
}
}
}
time[0]=tab3[hour/10];
time[1]=tab3[hour%10];
time[2]='-';
time[3]=tab3[minute/10];
time[4]=tab3[minute%10];
time[5]='-';
time[6]=tab3[second/10];
time[7]=tab3[second%10];
time[8]=0x00;
}
//去抖动延时
void delay(void)
{ unsigned char i,j;
for(i=20;i>0;i--)
{ for(j=255;j>0;j--);
}
}
//按键处理子程序
void keyboad(void)
{ unsigned char a,b;
if(!time_set)
delay();
if(!time_set)
{ set_flag=1;
if(++set_coun>=5)
{ set_coun=0;
set_flag=0;
}
while(!time_set);
}
if(!temp_set)
delay();
if(!temp_set)
{ temp_flag=1;
if(++temp_coun>=7)
{ temp_flag=0;
temp_coun=0;
}
while(!temp_set);
}
if(!inc)
delay();
{
if((!inc)&&set_flag)
{ switch (set_coun)
{ case 1:
{ hour=hour+10;
if(hour>=30)
{ hour=hour-30;
}
} break;
case 2:
{ a=hour%10;
b=hour/10;
if(++a>=10)
{ a=0;
}
hour=b*10+a;
} break;
case 3:
{ minute=minute+10;
if(minute>=60)
{ minute=minute-60;
}
} break;
case 4:
{ a=minute%10;
b=minute/10;
if(++a>=10)
{ a=0;
}
minute=b*10+a;
} break;
}
}
if(!inc&&temp_flag)
{ switch(temp_coun)
{ case 1:
{ if(++l[0]>9)
{ l[0]=0;
}
} break;
case 2:
{ if(++l[1]>9)
{ l[1]=0;
}
} break;
case 3:
{ if(++l[2]>9)
{ l[2]=0;
}
} break;
case 4:
{ if(++h[0]>9)
{ h[0]=0;
}
} break;
case 5:
{ if(++h[1]>9)
{ h[1]=0;
}
} break;
case 6:
{ if(++h[2]>9)
{ h[2]=0;
}
} break;
}
}
while(!inc);
}
if(!dec)
delay();
{
if((!dec)&&set_flag)
{ switch (set_coun)
{ case 1:
{ a=hour%10;
b=hour/10+1;
if(--b<=0)
{ b=3;
}
hour=(b-1)*10+a;
} break;
case 2:
{ a=hour%10+1;
b=hour/10;
if(--a<=0)
{ a=10;
}
hour=b*10+a-1;
} break;
case 3:
{ a=minute%10;
b=minute/10+1;
if(--b<=0)
{ b=6;
}
minute=(b-1)*10+a;
} break;
case 4:
{ a=minute%10+1;
b=minute/10;
if(--a<=0)
{ a=10;
}
minute=b*10+a-1;
}
}
}
if(!dec&&temp_flag)
{ switch(temp_coun)
{ case 1:
{a=l[0]+1;
if(--a<=0)
{ a=10;
}
l[0]=a-1;
} break;
case 2:
{ a=l[1]+1;
if(--a<=0)
{ a=10;
}
l[1]=a-1;
} break;
case 3:
{ a=l[2]+1;
if(--a<=0)
{ a=10;
}
l[2]=a-1;
} break;
case 4:
{ a=h[0]+1;
if(--a<=0)
{ a=10;
}
h[0]=a-1;
} break;
case 5:
{ a=h[1]+1;
if(--a<=0)
{ a=10;
}
h[1]=a-1;
} break;
case 6:
{ a=h[2]+1;
if(--a<=0)
{ a=10;
}
h[2]=a-1;
} break;
}
}
while(!dec);
}
}
//
void ASC(void)
{
high[2]=tab3[h[0]];
high[3]=tab3[h[1]];
high[5]=tab3[h[2]];
low[2]=tab3[l[0]];
low[3]=tab3[l[1]];
low[5]=tab3[l[2]];
b=l[0]*100+l[1]*10+l[2];
c=h[0]*100+h[1]*10+h[2];
}
//
void time_display(void)
{
if(set_flag)
{ switch(set_coun)
{ case 1:
{ if(time_flag)
time[0]=' ';
} break;
case 2:
{ if(time_flag)
time[1]=' ';
} break;
case 3:
{ if(time_flag)
time[3]=' ';
} break;
case 4:
{ if(time_flag)
time[4]=' ';
} break;
}
}
if(temp_flag)
{ switch(temp_coun)
{ case 1:
{ if(time_flag)
low[2]=' ';
else
low[2]=tab3[l[0]];
} break;
case 2:
{ if(time_flag)
low[3]=' ';
else
low[3]=tab3[l[1]];
} break;
case 3:
{ if(time_flag)
low[5]=' ';
else
low[5]=tab3[l[2]];
} break;
case 4:
{ if(time_flag)
high[2]=' ';
else
high[2]=tab3[h[0]];
} break;
case 5:
{ if(time_flag)
high[3]=' ';
else
high[3]=tab3[h[1]];
} break;
case 6:
{ if(time_flag)
high[5]=' ';
else
high[5]=tab3[h[2]];
} break;
}
}
}
//报警子程序
void warm(void)
{ unsigned int a;
a=nonce_t[0]*100+nonce_t[1]*10+nonce_t[2];
if(b==c)
{ bell_flag=1;
}
else
bell_flag=0;
if(a<c&&a>=b)
{ heater=0;
l_led=1;
bell=1;
fan=0;
h_led=1;
ring_flag=1;
flag1=1;
flag2=1;
}
else if(a>=c&&flag1)
{ fan=1;
h_led=0;
ring_flag=bell_flag;
flag2=0;
}
else if(a<b&&flag2)
{ heater=1;
l_led=0;
bell=bell_flag;
flag1=0;
}
}
//主程序
main(void)
{
TMOD=0x01;
EA=1;
ET0=1;
TH0=0x3c;
TL0=0xa8;
TR0=1;
fan=0;
heater=0;
lcd_init();
ring_flag=1;
while(1)
{ keyboad();
time_display();
bcd_transform();
lcd_display(temp,0xc0); //第二行
lcd_display(time,0x80); //第一行
lcd_display(low,0xca);
lcd_display(high,0x8a);
ASC();
warm() ;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -