📄 temp_control.c
字号:
if(ON_OFF==0) //若温控标志为0
{
DisplayOneChar(14,0,0x4f); // 液晶上显示不控温的标志
DisplayOneChar(15,0,0x46);
}
else
{
DisplayOneChar(14,0,0x4f); // 液晶上显示控温的标志
DisplayOneChar(15,0,0x4e);
if(outflag==1)
DisplayOneChar(0,0,0x7c);
else
DisplayOneChar(0,0,0xef);
}
}
/************液晶显示子函数2***************/
void displayfun2(void)
{
WriteCommandLCM(0x0c,1); //显示屏打开,光标不显示,不闪烁,检测忙信号
DisplayListChar(0,0,str0);
DisplayListChar(0,1,str1);
DisplayOneChar(6,0,minite/10+0x30);
DisplayOneChar(7,0,minite%10+0x30);
DisplayOneChar(9,0,seconde/10+0x30);
DisplayOneChar(10,0,seconde%10+0x30);
DisplayOneChar(4,1,T/10+0x30);
DisplayOneChar(5,1,T%10+0x30);
DisplayOneChar(11,1,temp1/10+0x30);
DisplayOneChar(12,1,temp1%10+0x30);
DisplayOneChar(14,1,temp2/10+0x30);
WriteCommandLCM(0x0f,1); //显示屏打开,光标显示,闪烁,检测忙信号
DisplayOneChar(3,0,hour/10+0x30);
DisplayOneChar(4,0,hour%10+0x30);
}
/**************液晶显示子函数3*****************/
void displayfun3(void)
{
WriteCommandLCM(0x0c,1); //显示屏打开,光标不显示,不闪烁,检测忙信号
DisplayListChar(0,0,str0);
DisplayListChar(0,1,str1);
DisplayOneChar(3,0,hour/10+0x30);
DisplayOneChar(4,0,hour%10+0x30);
DisplayOneChar(9,0,seconde/10+0x30);
DisplayOneChar(10,0,seconde%10+0x30);
DisplayOneChar(4,1,T/10+0x30);
DisplayOneChar(5,1,T%10+0x30);
DisplayOneChar(11,1,temp1/10+0x30);
DisplayOneChar(12,1,temp1%10+0x30);
DisplayOneChar(14,1,temp2/10+0x30);
WriteCommandLCM(0x0f,1); //显示屏打开,光标显示,闪烁,检测忙信号
DisplayOneChar(6,0,minite/10+0x30);
DisplayOneChar(7,0,minite%10+0x30);
}
/**************液晶显示子函数4 *****************/
void displayfun4(void)
{
WriteCommandLCM(0x0c,1); //显示屏打开,光标不显示,不闪烁,检测忙信号
DisplayListChar(0,0,str0);
DisplayListChar(0,1,str1);
DisplayOneChar(3,0,hour/10+0x30);
DisplayOneChar(4,0,hour%10+0x30);
DisplayOneChar(6,0,minite/10+0x30);
DisplayOneChar(7,0,minite%10+0x30);
DisplayOneChar(9,0,seconde/10+0x30);
DisplayOneChar(10,0,seconde%10+0x30);
DisplayOneChar(11,1,temp1/10+0x30);
DisplayOneChar(12,1,temp1%10+0x30);
DisplayOneChar(14,1,temp2/10+0x30);
WriteCommandLCM(0x0f,1); //显示屏打开,光标显示,闪烁,检测忙信号
DisplayOneChar(4,1,T/10+0x30);
DisplayOneChar(5,1,T%10+0x30);
}
/**************键盘扫描子函数******************/
void keyscan(void)
{
uchar xx; //局部变量
P1=0xff;
if(P1!=0xff)
{
delay_LCM(30);
if(P1!=0xff)
{
xx=P1;
switch(xx) // 根据按键状态,调用不同的子函数
{
case 0xfe:set_adj(); break;
case 0xfd:inc_key(); break;
case 0xfb:dec_key(); break;
case 0xf7:ON_OFF=!ON_OFF; break;
default:break;
}
}
}
}
/**************设定工作模式子函数****************/
void set_adj(void)
{
delay_LCM(100);
set++;
if(set>=4)set=0;
}
/****************按键加法子函数******************/
void inc_key(void)
{
delay_LCM(100);
switch(set)
{
case 0:if(P2==0xf7)ON_OFF=!ON_OFF; break;
case 1:hour++; if(hour>=23)hour=23; break;
case 2:minite++; if(minite>=59)minite=59;break;
case 3:T++;if(T>=99)T=99; break;
default:break;
}
}
/****************按键减法子函数*****************/
void dec_key(void)
{
delay_LCM(100);
switch(set)
{
case 0:if(P2==0xf7)ON_OFF=!ON_OFF; break;
case 1:hour--; if(hour<=0)hour=0; break;
case 2:minite--;if(minite<=0)minite=0;break;
case 3:T--;if(T<=1)T=1; break;
default:break;
}
}
/***************定时器t0初始化*******************/
void init_timer0(void)
{
TMOD=0x01; //time0为定时器,方式1
TH0=0x3c; //预置计数初值
TL0=0xb0;
EA=1;
ET0=1;
TR0=1;
}
/***********定时器t0中断子函数**************/
void timer0(void) interrupt 1 using 0 //定时器0方式1,50ms中断一次
{
TH0=0x3c;
TL0=0xb0;
mstcnt++;
if(mstcnt>=20 ) {seconde++; mstcnt=0; }
if(seconde>=60) {minite++; seconde=0;}
if(minite>=60 ) {hour++; minite=0; }
if(hour>=24 ) {hour=0;}
keyscan( ); //按键扫描
}
/*****************系统报警子函数***************************/
/*查询ISD1420_RECLED管脚的放音结束标志EOC,瞬间的低电平*/
/*调试时基本正确,但是,会发生突发的不稳定的报警*/
/**********************************************************/
void playalarm(void) //语音提示温度上升过快
{
if(temp>25&&temp<30)
{
delay_LCM(10);
if(temp>20&&temp<22)
{
RED_ALARM=0;
PLAYE_ADDR=0x11;
_nop_();
_nop_();
PLAYE_ADDR=0x10;
while(RECLED_EOC==1); //等待放音结束
RED_ALARM=1;
}
}
if(temp>30&&temp<35) //语音提示温度上升过慢
{
delay_LCM(10);
if(temp>22&&temp<25)
{
GREEN_ALARM=0;
PLAYE_ADDR=0x21;
_nop_();
_nop_();
PLAYE_ADDR=0x20;
while(RECLED_EOC==1);
GREEN_ALARM=1;
}
}
if(temp>35&&temp<40) //语音提示恒温控制
{
delay_LCM(10);
if(temp>25&&temp<30)
{
WRITE_ALARM=0;
PLAYE_ADDR=0x31;
_nop_();
_nop_();
PLAYE_ADDR=0x30;
while(RECLED_EOC==1);
WRITE_ALARM=1;
}
}
}
/***********the main funtion*************/
void main(void)
{
ad_data=0; //采样值存储单元初始化为0
P1=0xff; //初始化p1口,全设为1
delay_LCM(500); //延时500ms启动
initLCM( ); //LCD初始化
init_timer0( ); //时钟定时器0初始化
Init_DS18B20( ) ; //DS18B20初始化
DisplayListChar(0,0,str0);
DisplayListChar(0,1,str1);
while (1)
{
keyscan(); //按键扫描
ReadTemperature(); //温度采集
playalarm();
switch(set) //LCD根据工作模式显示
{
case 0:displayfun1();delay_LCM(1000);break; //正常工作显示
case 1:displayfun2();delay_LCM(1000);break; //调整时显示
case 2:displayfun3();delay_LCM(1000);break; //调整分显示
case 3:displayfun4();delay_LCM(1000);break;
default:break;
}
keyscan( ); //相当于延时
if(ON_OFF==1) //若温控标志位1, 控制LAMP动作
{
if(temp1>=T+1){outflag=1;OUT=0;}
if(temp1<T)
{
delay_LCM(1000);
if(temp1<T){outflag=0;OUT=1;}
}
}
else{outflag=0;OUT=1;}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -