📄 display.c
字号:
#include"reg52.h"
#define period 20 //设定占空比信号输出的周期,单位:5ms
sfr WDTRST = 0xA6;
sbit ge=P2^7;
sbit shi=P2^6;
sbit k_temp=P2^3; //调温键sw6
sbit k_power=P3^3; //休眠/唤醒键sw5
sbit k_warm=P2^5; //加热键sw8
sbit k_motor=P2^4; //电机键sw7
sbit led_run=P1^0; //运行灯
sbit led_motor=P1^1; //冲水指示灯
sbit led_warm=P1^2; //空比加热指示灯
sbit led_err=P1^3; //缺水信号灯
sbit warmer=P1^4; //普通发热器
sbit motor_out1=P1^5;
sbit motor_out2=P1^6;
sbit motor_out3=P1^7; //三个电机信号
sbit kongbi_delay=P3^6; //空比加热器散热器
sbit fmq=P3^5; //定义蜂鸣器P35
//unsigned char flag_system=1; //系统运行中标志
unsigned char tab[]={ 0x3f,0x30,0x6d,0x79,0x72,0x5b,0x5f,0x31,0x7f,0x7b,0x40};
//0, 1, 2 3 4 5 6 7 8 9 -
extern unsigned char temp;
extern unsigned char flag_tempset;
extern unsigned char flag_temp;
extern unsigned char flag_wat;
extern unsigned char temp_set[];
extern unsigned char ReadTemperature();
extern void delay(unsigned int);
unsigned int total_time; //系统运行总时间
unsigned int kongbi[]={0,2,4,6,8,10}; //初始化空比,单位为:5ms,为整数,且小于period
unsigned char key_scan(void);
void sleep(void);
void start_t1(void);
unsigned int time_int;
timer0() interrupt 1 using 1
{TH0=(65536-5000)/256; //定时器5ms中断一次
TL0=(65536-5000)%256;
if(++time_int==kongbi[flag_temp])
led_warm=0;
else if(time_int==period)
{time_int=0;
led_warm=1;
}
}
void timer1(void) interrupt 3
{TH1=(65536-50000)/256; //定时器50ms中断一次
TL1=(65536-50000)%256; //无按键动作延时
total_time+=1;
if(total_time==6000) //工作300S
{TR1=0;
total_time=0;
sleep();
}
}
void intter0(void) interrupt 0 //缺水信号
{unsigned char keyflag;
EA=0;
fmq=0;
led_err=0;
motor_out1=1;
motor_out2=1;
motor_out3=1;
warmer=1;
P0=tab[10];
ge=0;
shi=1;
while(1)
{WDTRST=0x1E;
WDTRST=0xE1;
keyflag=key_scan();
if(keyflag!=0)
{ EA=1;
fmq=1;
break;
}
}
}
intter1() interrupt 2 using 0 //唤醒
{unsigned int i;
for(i=0;i<10000;i++)
{WDTRST=0x1E;
WDTRST=0xE1;}
EX1=0;
led_run=0;
start_t1();
}
void start0(void) //启动定时器0控制空比加热
{
//TR0=0;
TH0=(65536-5000)/256; //定时器初值为5000,即5ms中断一次
TL0=(65536-5000)%256;
kongbi_delay=0; //启动散热器
EA=1;
ET0=1;
TR0=1;
}
void start_t1(void) //系统运行总时间
{
TH1=(65536-50000)/256;
TL1=(65536-50000)%256;
EA=1;
ET1=1;
TR1=1;
}
void display_temp(unsigned char i) //温度显示函数
{
P0=tab[i/10];
shi=0;
ge=1;
delay(500);
P0=tab[i%10];
shi=1;
ge=0;
delay(500);
}
void display_tempmain(unsigned char i) //主程序温度显示函数
{
P0=tab[i/10];
shi=0;
ge=1;
delay(1000);
P0=tab[i%10];
shi=1;
ge=0;
}
void display_dang(unsigned char i)//占空比加热时温度档位与冲水档位显示
{
P0=tab[i];
ge=0;
shi=1;
delay(100);
}
unsigned char key_scan() //扫描键盘
{ unsigned char ret;
unsigned int i;
unsigned int j;
j=50000;
k_temp=1;
k_warm=1;
k_motor=1;
k_power=1;
ret=0;
if(k_power==0) //进入休眠
{for(i=0;i<30000;i++)
{WDTRST=0x1E;
WDTRST=0xE1;}
if(k_power==0)
ret=4;
}
if(k_temp==0) //调温键
{
fmq=0; //蜂鸣器响
for(i=0;i<13;i++)
display_temp(temp_set[flag_tempset]);
fmq=1;
if(k_temp==0)
{while(j--)
{display_temp(temp_set[flag_tempset]);
if(k_temp==1)
{ret=1;
break;}
}
}
}
if(k_warm==0) //空比加热键
{
fmq=0; //蜂鸣器响
for(i=0;i<13;i++)
display_dang(flag_temp);
fmq=1;
if(k_warm==0)
{while(j--)
{display_dang(flag_temp);
if(k_warm==1)
{ret=2;
break;}
}
}
}
if(k_motor==0) //电机键空比控制
{
fmq=0; //蜂鸣器响
for(i=0;i<13;i++)
display_dang(flag_wat);
fmq=1;
if(k_motor==0)
{ while(j--)
{display_dang(flag_wat);
if(k_motor==1)
{ret=3;
break;
}
}
}
}
if(ret!=0)
total_time=0;
return ret;
}
void key_back(unsigned char i) //按键响应程序
{unsigned int j,loop;
unsigned char keyflag;
j=5000;
switch(i)
{
case 1: //按下调温键
{
j=5; //调温结束后闪烁j次退出调温程序
while(j--)
{ temp=ReadTemperature();
warmer=0; //普通加热器开始工作
if(temp>=temp_set[flag_tempset]) //温度达到设定值
warmer=1; //停止加热
for(loop=0;loop<=50;loop++) //闪烁状态数码管亮起的时长
{
display_temp(temp_set[flag_tempset]);
keyflag=key_scan(); //扫描键盘
if(keyflag==1) //该键继续按下
{if(flag_tempset++==2) //达到最高温度
flag_tempset=0;
j=5;
}
if(keyflag==2) //其他按键按下
j=0;
if(keyflag==3)
j=0;
if(keyflag==4)
j=0;
}
ge=1;
shi=1;
for(loop=0;loop<=50;loop++) //闪烁状态数码管关闭的时长
{
delay(1000);
keyflag=key_scan(); //扫描键盘
if(keyflag==1) //该键继续按下
{if(flag_tempset++==2) //达到最高温度
flag_tempset=0;
j=10;
}
if(keyflag==2) //其他按键按下
j=0;
if(keyflag==3)
j=0;
if(keyflag==4)
j=0;
}
}
break;
}
case 2: //按下空比加热键
{
warmer=1; //空比加热时停止普通加热器
start0();
motor_out1=1;
motor_out2=1;
motor_out3=1; //加热时关闭电机
while(1)
{
kongbi_delay=0;
if(flag_temp==4)
{
led_warm=0;
}
display_dang(flag_temp);
keyflag=key_scan();
if(keyflag==2)
{flag_temp+=1;
start0();
if(flag_temp==5)
{flag_temp=0; //停止加热
TR0=0;
led_warm=1;
kongbi_delay=1;
}
else
{TR0=1;
kongbi_delay=0;
}
}
if(keyflag!=2&&keyflag!=0) //其他按键按下
{led_warm=1;
TR0=0;
kongbi_delay=1;
break;
}
}
break;
}
case 3: //按下电机键
{
TR0=0;
//停止加热
led_warm=1;
led_motor=0;
if(flag_wat==1)
{motor_out1=0;
motor_out2=1;
motor_out3=1;
}
if(flag_wat==2)
{
motor_out2=0;
motor_out1=1;
motor_out3=1;
}
if(flag_wat==3)
{
motor_out3=0;
motor_out1=1;
motor_out2=1;
}
if(flag_wat==0) //停止所有电机
{
motor_out1=1;
motor_out2=1;
motor_out3=1;
}
while(j--)
{
display_dang(flag_wat); //显示冲水等级
keyflag=key_scan();
temp=ReadTemperature();
if(temp<temp_set[flag_tempset])
warmer=0;
else
warmer=1;
if(keyflag==3)
{if(flag_wat++==3)
flag_wat=0;
if(flag_wat==1)
{motor_out1=0;
motor_out2=1;
motor_out3=1;
led_motor=0;
}
if(flag_wat==2)
{
motor_out2=0;
motor_out1=1;
motor_out3=1;
}
if(flag_wat==3)
{
motor_out3=0;
motor_out1=1;
motor_out2=1;
}
if(flag_wat==0) //停止所有电机
{
motor_out1=1;
motor_out2=1;
motor_out3=1;
led_motor=1;
}
j=5000;
}
if(keyflag!=3&&keyflag!=0) //其他按键按下
{led_motor=1;
motor_out1=1;
motor_out2=1;
motor_out3=1;
break;
}
}
break;
}
case 4:
{sleep();
break;
}
default:
break;
}
}
void sleep(void)
{
unsigned char i;
WDTRST=0x1E;
WDTRST=0xE1;
P1=0xFF;
P0=0xFF;
P2=0xFF;
P3=0xFF;
for(i=0;i<100;i++)
delay(1000);
EX1=1;
EA=1;
PCON=0X02;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -