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