/******************************************************************************************
電加熱蒸汽鍋爐全自動控制板說明
1、按上圖所示接線;
2、上電后,供水設備工作(加水指示燈亮),報警設備工作;
3、水位信號到(水位指示燈亮),供水設備延時1秒停止工作(加水指示燈熄滅),加熱設
備延時2秒工作(加熱指示燈亮)。
4、水位信號斷開(水位指示燈熄滅),加水設備延時啟動(延時時間用撥碼開關可以調節,
詳細說明見后),加熱設備延時10 秒停止。水位信號接通保持時,加熱設備不停止工作。
加熱設備也可以通過手動按鈕控制開啟或停止。
4位撥碼開關都在數字這邊時,水位信號斷開時,加水設備啟動(不延時),
“4”位往上撥,延時1秒;
“3”位往上撥,延時2秒;
“2”位往上撥,延時4秒;
“1”位往上撥,延時8秒;
也可以多種組合,如:“2”、“3”和“4”位往上撥,延時7秒。同理。
***********************************************************************************************/
#include <STC8H.h>
#define uchar unsigned char
#define uint unsigned int
sbit JR_JDQ = P3^3;
sbit JS_JDQ = P5^5;
sbit DCF_JDQ = P3^2;
sbit KEY1 = P3^0;
sbit ERR_LED = P5^4;
bit t0zd0b=0;
bit t1zd0b=0;
uchar count;
char sec,min;
bit flag;
uint i=0,j=0;
uchar t0IntCnt = 0; //T0中斷計數變量
uint ledFlashCnt = 0; //ERR_LED指示燈閃爍周期計數
uchar Flag2ms = 0; //2MS到標志
uchar u8Flag15min = 0; //15分鐘到標志
void TM0_init() //5毫秒@11.0592MHz
{
AUXR &= 0x7F; //定時器時鐘12T模式
TMOD &= 0xF0; //設置定時器模式
TMOD |= 0x01; //設置定時器模式
TL0 = 0x00; //設置定時初始值
TH0 = 0xEE; //設置定時初始值
TF0 = 0; //清除TF0標志
TR0 = 1; //定時器0開始計時
ET0 = 1; //使能定時器0中斷
EA = 1;
}
void Timer1_Init(void) //250微秒@11.0592MHz
{
AUXR &= 0xBF; //定時器時鐘12T模式
TMOD &= 0x0F; //設置定時器模式
TL1 = 0x1A; //設置定時初始值
TH1 = 0xFF; //設置定時初始值
EA = 1; //開總中斷
TF1 = 0; //清除TF1標志
TR1 = 1; //定時器1開始計時
ET1 = 1; //開T0中斷
}
/*
必須開啟T0中斷,延時函數才起作用
*/
void delay_1ms(void)
{
uchar i = 4; //每次256us,1ms中斷4次
while (i) {
if (t1zd0b)
{
t1zd0b = 0; //清除時間中斷標志
--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 = 0xe4; P3M1 = 0x00;
P5M0 = 0x00; P5M1 = 0x00;
ERR_LED = 1;
d_s(1);//延時1秒
JS_JDQ = 1;
ERR_LED = 0;
d_s(2);//延時2秒
DCF_JDQ = 1;
d_s(1);//延時1秒
JR_JDQ = 0;
}
void TM0_Isr() interrupt 1 //250毫秒
{
if(TF0) //定時器 0 上溢中斷
{
TF0 = 0;
t0zd0b = 1;
t0IntCnt++;
if(t0IntCnt>=8) //8*250 = 2ms
{
t0IntCnt = 0;
Flag2ms=1;
ledFlashCnt ++;
}
}
}
void TM1_Isr() interrupt 3
{
if(TF1)
TF1=0;
t1zd0b=1;
}
void main()
{
TM0_init();Timer1_Init();
IO_init();
delay_ms(80);
while (1)
{
if(KEY1 == 1 ) //缺水時
{
DCF_JDQ = 1;
d_s(1);//延時1秒
JS_JDQ = 1;
d_s(3);//延時1秒
DCF_JDQ = 0;
JR_JDQ = 0;
if(flag)
{
flag=0;
if(++count >= 200) //200*5=1000ms
{
count = 0;
sec++;
if(sec >= 60)
{
sec = 0;
min++;
if(min >= 1)
min=0;
u8Flag15min = 1;
}
}
JS_JDQ = 0;
DCF_JDQ = 0;
JR_JDQ = 0;
//break;
}
else //15分鐘到,執行LED閃爍 3、如果第一個動作水位一直不能到,
//也就是開關一直斷開高電平,則故障燈閃爍,
//加水加熱電磁閥燈全部熄滅。
{
if (ledFlashCnt>=200) //200*5=1000ms
{
ledFlashCnt = 0;
ERR_LED = 1;
}
}
}
else if(KEY1==0) //b、第二步只要水位到了,也就是開關接通低電平,延時一秒
//加熱燈點亮,延時五秒后,電磁閥燈熄滅,又過一秒,加水燈熄滅。
{
u8Flag15min = 0;
ERR_LED = 0;
DCF_JDQ = 0;
d_s(1);
JS_JDQ = 0;
d_s(2);
JR_JDQ = 1;
}
}
}
|