编译通不过的主要原因是你添加的语句部分使用了中文{ }符号,现在已经改正并做了调整,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; //继电器断开
}
}
} |