|
/*一、上電后故障燈和加水燈點亮,加熱燈熄滅;
二、開關(guān)低電平后,延時5s加熱燈亮,加水燈滅 ,故障燈熄滅。
三、開關(guān)高電平后 ,加水燈點亮,故障燈和加熱燈熄滅。
四、保護功能兩個:1、開機后六分鐘如果開關(guān)一直處于高電平,則:故障燈1秒閃爍,加熱燈加水燈熄滅。
2、在開關(guān)由低電平轉(zhuǎn)為高電平后,加水燈加熱燈都點亮,延時30秒,開關(guān)電平?jīng)]有轉(zhuǎn)換,則:故障燈閃爍,加水燈加熱燈熄滅 */
電路原理圖如下:
單片機源程序如下:
#include <STC8H.h>
#define uchar unsigned char
#define uint unsigned int
sbit LD3 = P3^3;
sbit LD2 = P5^5;
sbit KEY1 = P3^2;
sbit ERR_LED = P5^4;
bit t0zd0b=0;
bit t1zd0b=0;
uchar count;
char sec,min;
uint i=0,j=0;
uchar t0IntCnt = 0; //T0中斷計數(shù)變量
uint ledFlashCnt = 0; //ERR_LED指示燈閃爍周期計數(shù)
uchar Flag2ms = 0; //2MS到標(biāo)志
uchar u8Flag6min = 0; //6分鐘到標(biāo)志
void Timer0_Init(void);
void Timer1_Init(void);
void delay_1ms(void);
void delay_ms(uint var);
void IO_init();
void Timer0_Init(void) //5毫秒@11.0592MHz
{
AUXR &= 0x7F; //定時器時鐘12T模式
TMOD &= 0xF0; //設(shè)置定時器模式
TL0 = 0x00; //設(shè)置定時初始值
TH0 = 0xEE; //設(shè)置定時初始值
TF0 = 0; //清除TF0標(biāo)志
TR0 = 1; //定時器0開始計時
ET0 = 1; //使能定時器0中斷
}
void Timer1_Init(void) //250微秒@11.0592MHz
{
AUXR &= 0xBF; //定時器時鐘12T模式
TMOD &= 0x0F; //設(shè)置定時器模式
TL1 = 0x1A; //設(shè)置定時初始值
TH1 = 0xFF; //設(shè)置定時初始值
TF1 = 0; //清除TF1標(biāo)志
TR1 = 1; //定時器1開始計時
ET1 = 1; //開T0中斷
}
/*
必須開啟T0中斷,延時函數(shù)才起作用
*/
void delay_1ms(void)
{
uchar i = 4; //每次256us,1ms中斷4次
while (i) {
if (t1zd0b)
{
t1zd0b = 0; //清除時間中斷標(biāo)志
--i;
}
}
}
void delay_ms(uint var)//延時單位為毫秒,最多延時65.535秒(65535mS)
{
while (var--)
{
delay_1ms();
}
}
#define d_s(s) delay_ms((s)*1000ul)//延時單位為秒
void IO_init()
{
P3M0 = 0x08; P3M1 = 0x00;
P5M0 = 0x30; P5M1 = 0x00;
ERR_LED = 0;
LD2 = 1;
LD3 = 0;
}
void TM0_Isr() interrupt 1 //5毫秒
{
// ERR_LED ^= 1; //測試是否進入中斷
if(TF0) //定時器 0 上溢中斷
{
TF0 = 0;
t0zd0b = 1;
t0IntCnt++;
if(t0IntCnt>=8) //8*250 = 2ms
{
t0IntCnt = 0;
Flag2ms=1;
ledFlashCnt ++;
}
}
}
void TM1_Isr() interrupt 3 //250微秒
{
// ERR_LED ^= 1; //測試是否進入中斷
if(TF1)
TF1=0;
t1zd0b=1;
}
void main()
{
Timer0_Init();
Timer1_Init();
EA = 1; //開總中斷
IO_init();
delay_ms(80);
while (1)
{
if(KEY1 == 1 ) //缺水時
{
ERR_LED = 1;
LD2 = 1;
LD3 = 0;
if(!u8Flag6min)
{
if(Flag2ms)
{
Flag2ms=0;
if(i<0xFFFF)
i++;
if(i>=30000) //60000ms,1分鐘
{
i=0;
j++;
}
if(j>=2)
{
u8Flag6min = 1;
LD2 = 0;
LD3 = 0;
}
}
}
else //15分鐘到,執(zhí)行LED閃爍 3、如果第一個動作水位一直不能到,
//也就是開關(guān)一直斷開高電平,則故障燈閃爍,
//加水加熱電磁閥燈全部熄滅。
{
if (ledFlashCnt>=500) //500*2=1000ms
{
ledFlashCnt = 0;
ERR_LED ^= 1;
}
}
}
else if(KEY1==0) //b、第二步只要水位到了,也就是開關(guān)接通低電平,延時一秒
//加熱燈點亮,延時五秒后,電磁閥燈熄滅,又過一秒,加水燈熄滅。
{
u8Flag6min = 0;
ERR_LED = 0;
LD3 = 1;
LD2 = 0;
}
}
}
|
|