第三天打卡,不知道还能坚持几天[doge]~
原理图
按键
开关在抖动状态时,由于单片机比较灵敏,故无法确定状态,此时对其进行消抖
消抖方法:硬件或软件,软件较为简单,即增加延时函数
C51数据运算
位运算:
按位左移: 0011 1100<<1 -> 0111 1000 左移就是最左边移出去,其余地方补位
按位右移: 0011 1100>>2 -> 0000 1111 同理
按位与: 0001 1000 & 0010 1010 -> 0000 1000 按位与就是把前与后对应的每一位进行与操作
按位异或:0001 1000 ^ 0010 1010 -> 0011 0010
前与后对应一位,一样就是0,不一样就是1;取反则与之相反
实战小项目
独立按键控制LED_1
这里开关按下就亮,松手就灭
#include <REGX52.H>
void main()
{
while(1)
{
if(P3_1==0 || P3_0==0) //按下第一个或者第二个按钮LED都会亮
{
P2_0=0;
}
else
{
P2_0=1;
}
}
}
独立按键控制LED_2
注意:此处与前面不同的地方在于,此处更像是正常的开关,开关来切换LED灯的状态
#include <REGX52.H>
void Delay(unsigned int xms) //@12.000MHz
{
unsigned char i, j;
while(xms)
{
i = 2;
j = 239;
do
{
while (--j);
} while (--i);
xms--;
}
}
void main()
{
while(1)
{
if(P3_1==0)
{
Delay(20);
while(P3_1==0);
Delay(20);
P2_0=~P2_0; //此处的按位取反属于常见用法,用来改变LED的状态
}
}
}
独立按键控制LED显示二进制
解释:当我第一次读到这个实际是不太明白的,具体就是:
注意每次最后有个取反的过程,
刚开始 0000 0000 -> 0000 0001 -> 0000 0010 -> 0000 0011 以此类推
取反之后可实现LED显示二进制
#include <REGX52.H>
void Delay(unsigned int xms) //@12.000MHz
{
unsigned char i, j;
while(xms)
{
i = 2;
j = 239;
do
{
while (--j);
} while (--i);
xms--;
}
}
void main()
{
unsigned char LED_num=0;
while(1)
{
if(P3_1==0)
{
//下面这三步是消抖操作
Delay(20);
while(P3_1==0);
Delay(20);
//这两步是精髓
LED_num++;
P2=~LED_num; //注意这里体现了读入写出,即LED_num的值不变,但是 P2的值发生改变
}
}
}
分析:
为什么上面那两步不用
P2++;
P2=~P2;
原因在于:此时的P2为1111 1111,加1会造成溢出,即变为0000 0000;按位取反后仍为1111 1111,无法满足题意
- THE END -
最后修改:2023年8月1日
非特殊说明,本博所有文章均为博主原创。
如若转载,请注明出处:https://xyhelper.top/680
zlprime
大学学的物联网,当时调试一个单片机跑马灯调了好久都不能如愿。后来发现是单片机坏了 ?
汐语博主
@zlprime: hhhh这样子
记录美好生活
努力看了,还是没看懂