?? 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 + -