关于继电器和蜂鸣器的干扰问题

我在做自动灌溉系统题目时,发现继电器和蜂鸣器同时操作时会出现干扰。

为了避免这种情况,我发现可以使用标志位,relay_flag, buzz_flag,标志为1时打开,0时关闭。

因此可以写个底层来操作这两个标志位,而具体步骤则主函数运行!

标志位操作底层

void KeyAction(uchar keycode)
{
		if(keycode == '1')
		{
				buzz_flag = 1;            
		}
		else if(keycode == '2')
		{
				buzz_flag = 0;
		}
		else if(keycode == '3')
		{
				relay_flag = 1;
		}
		else if(keycode == '4')
		{
				relay_flag = 0;
		}
}

应用层

void SetFucker()
{
		if(buzz_flag)
		{
				if(relay_flag)
				{
						P2 = (P2&0x1f)|0xa0;
						buzz = 1; relay = 1;             
						P2 = P2&0x1f;
				}
				else
				{
						P2 = (P2&0x1f)|0xa0;
						buzz = 1; relay = 0;
						P2 = P2&0x1f;
				}
		}
		else if(buzz_flag == 0)
		{
				if(relay_flag)
				{
						P2 = (P2&0x1f)|0xa0;
						buzz = 0; relay = 1;
						P2 = P2&0x1f;
				}
				else
				{
						P2 = (P2&0x1f)|0xa0;
						buzz = 0; relay = 0;
						P2 = P2&0x1f;
				}
		}
}

代码

main.c

******************************************************************************
* 文件名:按键控制继电器蜂鸣器
* 描 述:
* 作 者:思索与猫 
* 日 期: 19/3/8
* 备 注:S4开蜂鸣器,S5关蜂鸣器,S6开继电器,S7关继电器
 *******************************************************************************
#include<stc15f2k60s2.h>
#define uchar unsigned char
#define uint unsigned int

sbit key_in1 = P3^3;
sbit key_in2 = P3^2;
sbit key_in3 = P3^1;
sbit key_in4 = P3^0;

sbit relay = P0^4;
sbit buzz = P0^6;

uchar KeySat[4]={1, 1, 1, 1};
uchar KeyMap[4]={'1', '2', '3', '4'};

bit relay_flag = 0, buzz_flag = 0;

void CloseFucker();
void Timer0Init();
void KeyScan();
void KeyDriver();
void KeyAction(uchar keycode);
void SetFucker();

void main()
{
		CloseFucker();
		Timer0Init();
		while(1)
		{
				KeyDriver();
				SetFucker();
		}
}
void KeyDriver()
{
		char i;
		static uchar keyback[4] = {1, 1, 1, 1};
		
		for(i=0; i<4; i++)
		{
				if(KeySat[i] != keyback[i])
				{
						if(KeySat[i] != 0)
						{
								KeyAction(KeyMap[i]);						
						}
						keyback[i] = KeySat[i];
				}
		}
}
void SetFucker()
{
		if(buzz_flag)
		{
				if(relay_flag)
				{
						P2 = (P2&0x1f)|0xa0;
						buzz = 1; relay = 1;
						P2 = P2&0x1f;
				}
				else
				{
						P2 = (P2&0x1f)|0xa0;
						buzz = 1; relay = 0;
						P2 = P2&0x1f;
				}
		}
		else if(buzz_flag == 0)
		{
				if(relay_flag)
				{
						P2 = (P2&0x1f)|0xa0;
						buzz = 0; relay = 1;
						P2 = P2&0x1f;
				}
				else
				{
						P2 = (P2&0x1f)|0xa0;
						buzz = 0; relay = 0;
						P2 = P2&0x1f;
				}
		}
}
void KeyAction(uchar keycode)
{
		if(keycode == '1')
		{
				buzz_flag = 1;
		}
		else if(keycode == '2')
		{
				buzz_flag = 0;
		}
		else if(keycode == '3')
		{
				relay_flag = 1;
		}
		else if(keycode == '4')
		{
				relay_flag = 0;
		}
}
void KeyScan()
{
		char i;
		static uchar keybuf[4] = {0xff, 0xff, 0xff, 0xff};
		
		keybuf[0] = keybuf[0]<<1|key_in1;
		keybuf[1] = keybuf[1]<<1|key_in2;
		keybuf[2] = keybuf[2]<<1|key_in3;
		keybuf[3] = keybuf[3]<<1|key_in4;
		
		for(i=0; i<4; i++)
		{
				if(keybuf[i] == 0xff)
				{
						KeySat[i] = 1; 
				}
				else if(keybuf[i] == 0x00)
				{
						KeySat[i] = 0; 
				}
		}
}
void T0_time() interrupt 1
{
		TL0 = 0x40;		
		TH0 = 0xA2;	
		KeyScan();
}
void Timer0Init()		
{
		AUXR |= 0x80;		
		TMOD &= 0xF0;		
		TL0 = 0x40;		
		TH0 = 0xA2;		
		TF0 = 0;		
		TR0 = 1;		
		ET0 = 1;
		EA = 1;
}
void CloseFucker()
{
		P2 = (P2&0x1f)|0xa0;
		P0 = 0xaf;
		P2 = P2&0x1f;
}
  • 3
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值