我在做自动灌溉系统题目时,发现继电器和蜂鸣器同时操作时会出现干扰。
为了避免这种情况,我发现可以使用标志位,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;
}