51单片机7.20

汐语 2023-7-20 527 7/20
51单片机7.20

第三天打卡,不知道还能坚持几天[doge]~

原理图

51单片机7.20
51单片机7.20

按键

51单片机7.20

开关在抖动状态时,由于单片机比较灵敏,故无法确定状态,此时对其进行消抖

消抖方法:硬件或软件,软件较为简单,即增加延时函数

C51数据运算

51单片机7.20

位运算:

按位左移: 0011 1100<<1 -> 0111 1000 左移就是最左边移出去,其余地方补位

按位右移: 0011 1100>>2 -> 0000 1111 同理

按位与: 0001 1000 & 0010 1010 -> 0000 1000 按位与就是把前与后对应的每一位进行操作

按位异或:0001 1000 ^ 0010 1010 -> 0011 0010

前与后对应一位,一样就是0,不一样就是1;取反则与之相反

51单片机7.20

实战小项目

独立按键控制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 -

汐语

8月01日09:34

最后修改:2023年8月1日
2

非特殊说明,本博所有文章均为博主原创。

共有 3 条评论

  1. zlprime

    大学学的物联网,当时调试一个单片机跑马灯调了好久都不能如愿。后来发现是单片机坏了 ?

    1. 汐语

      汐语博主

      @zlprime: hhhh这样子

  2. 记录美好生活

    努力看了,还是没看懂