既上一次发布博文,这一次发表的文章是对上一篇博文的补充改进。本着优化算法的原则,硬件简化后,软件便会变得复杂。
硬件部分使用一个按键控制继电器的通断情况,按下按键,单片机判断当前继电器的通断情况。如果当前继电器是导通的,按下按键后,单片机按位取反,继电器下一个状态就会变关闭的状态;如果当前继电器是关闭的,按下按键后,单片机按位取反,继电器下一个状态就会变导通的状态。
优化算法,C语言中,运算分成逻辑非运算和按位取反运算。经过逻辑非运算(运算符为"!")运算后,运算结果只有0或1;而经过按位取反运算(运算符为"~")后,结果取决于操作数,比如 8位无符号数0,按位取反后就变成FF 了。 应该用逻辑取反!, 不是0就是1.
#include <reg52.h>
sbit relay=P1^1; //接继电器控制端
void delay_10ms();
void main()
{
unsigned char flag = 0;
while (1)
{
if(0==P1^3) {//判断按键是否按下
delay_10ms();
if(0==P1^3) {
relay = ~flag;//继电器开
}
}
}
}
/*
单片机12M晶振下,延迟10ms函数
*/
void delay_10ms()
{
unsigned char i,j,k;
for(i=5;i>0;i--)
{
for(j=4;j>0;j--)
{
for(k=248;j>0;j--);
}
}
}
Perotues图如下: