|
編譯通不過的主要原因是你添加的語句部分使用了中文{ }符號,現(xiàn)在已經(jīng)改正并做了調(diào)整,K部分的語句只適合用轉(zhuǎn)換開關(guān),不適合按鈕。按住15分鐘以上顯然不合理。如果必須用按鈕那程序就要再增加一個標(biāo)志,按一次置1,執(zhí)行強(qiáng)制指令,再按一次置0,解除強(qiáng)制為自動。
#include <reg52.H>
//typedef unsigned char u8;
typedef unsigned int u16;
#define uint unsigned int
sbit iR1=P1^4; //紅外線端口1定義
sbit iR2=P1^5; //紅外線端口2定義
sbit iR3=P1^6; //紅外線端口3定義
sbit Relay1=P0^0;//繼電器1端口定義
sbit Relay2=P0^1;//繼電器2端口定義
sbit Relay3=P0^2;//繼電器3端口定義
sbit k=P1^7; //強(qiáng)制按鍵定義
bit flag_1=0,flag_2=0,flag_3=0; flag_4=0;//計時標(biāo)志
u16 temp_1,temp_2,temp_3;temp_4;//中斷計數(shù)變量
/***********************************************
定時函數(shù)
************************************************/
void Timer0Init()//50毫秒@12.000MHz
{
TMOD= 0x01; //設(shè)置定時器模式
TL0 = 0xB0; //設(shè)置定時初值
TH0 = 0x3C; //設(shè)置定時初值
TR0 = 1; //開啟定時器
EA=1; //開總中斷
ET0=1; //開定時器0中斷
}
/***********************************************
紅外開關(guān)掃描子程序
************************************************/
void iRscan() //紅外開關(guān)信號識別子程序
{
static bit iR_sign1=0; //紅外開關(guān)1有效標(biāo)志
static bit iR_sign2=0; //紅外開關(guān)2有效標(biāo)志
static bit iR_sign3=0; //紅外開關(guān)3有效標(biāo)志
static bit k_sign4=0; //強(qiáng)制開關(guān)有效標(biāo)志
static uint count=0; //計數(shù)變量
if(k==1) //檢測手動消毒開關(guān)如果為1
{
count++; //消抖計數(shù)
if((count>=500)&&(k_sign4==0)) //防止重復(fù)響應(yīng)
{
k_sign4=1; //手動消毒開關(guān)標(biāo)志置1
temp_4=0; //中斷計數(shù)變量清0
flag_4=1; //計時標(biāo)志4置1
flag_1=0; //計時標(biāo)志1清0
flag_2=0; //計時標(biāo)志2清0
flag_3=0; //計時標(biāo)志3清0
Relay1=0; //繼電器1接通
Relay2=0; //繼電器2接通
Relay3=0; //繼電器3接通
}
}
else //強(qiáng)制開關(guān)復(fù)位執(zhí)行自動檢測
{
// iR_sign1=0; //紅外開關(guān)1有效標(biāo)志清0
// iR_sign2=0; //紅外開關(guān)2有效標(biāo)志清0
// iR_sign3=0; //紅外開關(guān)3有效標(biāo)志清0
count=0; //消抖計數(shù)清0
k_sign4=0; //強(qiáng)制開關(guān)有效標(biāo)志清0
Relay1=1; //繼電器斷開
Relay2=1; //繼電器斷開
Relay3=1; //繼電器斷開
if(iR1==1) //檢測iR1信號如果為1
{
if(iR_sign1==0) //防止重復(fù)響應(yīng)
{
iR_sign1=1; //紅外開關(guān)1有效標(biāo)志置1
temp_1=0; //中斷計數(shù)變量清0
flag_1=1; //計時標(biāo)志置1
Relay1=0; //繼電器接通
}
}
else //紅外開關(guān)1信號消失
{
iR_sign1=0; //紅外開關(guān)1有效標(biāo)志清0
Relay1=1; //繼電器斷開
}
if(iR2==1) //檢測iR2信號如果為1
{
if(iR_sign2==0) //防止重復(fù)響應(yīng)
{
iR_sign2=1; //紅外開關(guān)2有效標(biāo)志置1
temp_2=0; //中斷計數(shù)變量清0
flag_2=1; //計時標(biāo)志置1
Relay2=0; //繼電器接通
}
}
else //紅外開關(guān)2信號消失
{
iR_sign2=0; //紅外開關(guān)2有效標(biāo)志清0
Relay2=1; //繼電器斷開
}
if(iR3==1) //檢測iR3信號如果為1
{
if(iR_sign3==0) //防止重復(fù)響應(yīng)
{
iR_sign3=1; //紅外開關(guān)1有效標(biāo)志置1
temp_3=0; //中斷計數(shù)變量清0
flag_3=1; //計時標(biāo)志置1
Relay3=0; //繼電器接通
}
}
else //紅外開關(guān)3信號消失
{
iR_sign3=0; //紅外開關(guān)3有效標(biāo)志清0
Relay3=1; //繼電器斷開
}
}
}
/***********************************************
主函數(shù)
************************************************/
void main()
{
Timer0Init(); //定時器0初始化
while(1)
{
iRscan(); //紅外開關(guān)信號掃描
}
}
/***********************************************
中斷函數(shù)
************************************************/
void Timer0() interrupt 1 //50毫秒@12.000MHz
{
TL0 = 0xB0; //設(shè)置定時初值
TH0 = 0x3C; //設(shè)置定時初值
if(flag_1==1) //如果計時標(biāo)志為1
{
temp_1++; //中斷計數(shù)變量自+1
if(temp_1>=(20*60)*15) //20*60為1分鐘
{
flag_1=0; //計時標(biāo)志置0
Relay1=1; //繼電器斷開
}
}
if(flag_2==1) //如果計時標(biāo)志為1
{
temp_2++; //中斷計數(shù)變量自+1
if(temp_2>=(20*60)*15) //20*60為1分鐘
{
flag_2=0; //計時標(biāo)志置0
Relay2=1; //繼電器斷開
}
}
if(flag_3==1) //如果計時標(biāo)志為1
{
temp_3++; //中斷計數(shù)變量自+1
if(temp_3>=(20*60)*15) //20*60為1分鐘
{
flag_3=0; //計時標(biāo)志置0
Relay3=1; //繼電器斷開
}
}
if(flag_4==1) //如果計時標(biāo)志為1
{
temp_4++; //中斷計數(shù)變量自+1
if(temp_4>=(20*60)*15) //20*60為1分鐘
{
flag_4=0; //計時標(biāo)志置0
Relay1=1; //繼電器斷開
Relay2=1; //繼電器斷開
Relay3=1; //繼電器斷開
}
}
} |
|