记录自己学习51单片机的过程,主要是一些顿悟,碎语较多不成篇幅。


一些符号和术语

PXX的含义

原理图:
原理图

其中P2代表P2寄存器,P20代表该寄存器的第零位,P21代表第一位,以此类推。

所以可以写出如下代码使得P2接口的0号位处于低电位状态即亮起状态(LED灯是二极管,只有一头为高一头为低时才会通过电流,初始状态时都为高,所以没有电流通过也就都不会亮):

1
2
3
4
5
6
7
8
9
#include<REGX52.h>
int main(){
P2 = 0xFE; //1111 1110
while(1)
{

}
return 0;
}

如果想让LED模块依次亮起(流水灯),那么就可以写出以下代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
#include <REGX52.H>
#include <stdio.h>

void Delay_ms(unsigned int ms) {
unsigned int i, j;
for (i = 0; i < ms; i++) {
for (j = 0; j < 120; j++) {

}
}
}

int main()
{
int codes[8] = {0xFE, 0xFD, 0xFB, 0xF7, 0xEF, 0xDF, 0xBF, 0x7F};
int len = 8;
int curIndex = 0;
P2 = codes[curIndex];
// 1111 1111 FF
// 1111 1110 FE
// 1111 1101 FD
// 1111 1011 FB
// 1111 0111 F7
// 1110 1111 EF
// 1101 1111 DF
// 1011 1111 BF
// 0111 1111 7F
while (1)
{
Delay_ms(100);
curIndex = (curIndex + 1) % len;
P2 = codes[curIndex];
}
return 0;
}

位运算的一些技巧

对二进制数据进行快捷操作,而不需要列举出所有可能,比如对共阴/共阳极的循环设置操作

1
2
3
4
P2 = ~ (0x01 >> 1); 
// 0000 0001 -> 0000 0010 -> 1111 1101
// 这样就使得第1位为低电平,那么共阳极二极管的第1位就会通电
// 左移2位就是第2位通电,以此类推可以实现对二极管的快捷操作

在八位二进制数中修改其中几位相连的位数时,不用按位操作,可以预先定义目标数,然后用左/右移运算符将目标数移动到八位二进制数中要修改的那几位中即可