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