题目
制作一个流水灯,原理图[1]如下,8个发光二极管LED0-LED7经限流电阻分别接至P1口的P1.0~P1.7引脚上,阳极共同接高电平。请使用C-51语言编写程序实现发光二极管从上至下两两点亮,并实现循环。(发光二极管点亮顺序:LED0 LED1,LED2 LED3,LED4 LED5,LED6 LED7,LED4 LED5,LED2 LED3,LED0 LED1 ,LED2 LED3……)。
制作一个流水灯,原理图[1]如下,8个发光二极管LED0-LED7经限流电阻分别接至P1口的P1.0~P1.7引脚上,阳极共同接高电平。请使用C-51语言编写程序实现发光二极管从上至下两两点亮,并实现循环。(发光二极管点亮顺序:LED0 LED1,LED2 LED3,LED4 LED5,LED6 LED7,LED4 LED5,LED2 LED3,LED0 LED1 ,LED2 LED3……)。
题目解答
答案
根据题目要求,将8种状态映射为P1端口值:
- LED0 LED1:0xFC
- LED2 LED3:0xF3
- LED4 LED5:0xCF
- LED6 LED7:0x3F
按顺序排列为:`{0xFC, 0xF3, 0xCF, 0x3F, 0xCF, 0xF3, 0xFC, 0xF3}`。
程序通过`for`循环遍历数组,每次更新P1端口并延时,实现循环流水灯效果。
完整代码如下:
```c
#include
void delay(unsigned int time) {
while(time--) {
_nop_();
_nop_();
_nop_();
_nop_();
}
}
void main() {
unsigned char i;
unsigned char pattern[] = {
0xFC, 0xF3, 0xCF, 0x3F, 0xCF, 0xF3, 0xFC, 0xF3
};
while(1) {
for(i = 0; i < 8; i++) {
P1 = pattern[i];
delay(60000);
}
}
}
```
解析
本题考查C - 51语言在单片机流水灯控制中的应用,解题思路如下:
- 状态映射:
- 由于发光二极管阳极共同接高电平,所以当P1口对应引脚输出低电平时,对应的发光二极管点亮。
- 对于LED0和LED1点亮的情况,P1.0和P1.1为低电平,其余为高电平。在二进制中表示为
1111 1100,转换为十六进制就是0xFC。 - 对于LED2和LED3点亮的情况,P1.2和P1.3为低电平,其余为高电平。二进制表示为
1111 0011,十六进制为0xF3。 - 对于LED4和LED5点亮的情况,P1.4和P1.5为低电平,其余为高电平。二进制表示为
1100 1111,十六进制为0xCF。 - 对于LED6和LED7点亮的情况,P1.6和P1.7为低电平,其余为高电平。二进制表示为
0011 1111,十六进制为0x3F。 - 根据题目给定的点亮顺序,将这8种状态按顺序排列成数组
pattern,即{0xFC, 0xF3, 0xCF, 0x3F, 0xCF, 0xF3, 0xFC, 0xF3}。
- 延时函数设计:
- 定义一个延时函数
delay,它接受一个无符号整数time作为参数。 - 在函数内部,使用
while循环,循环次数为time。每次循环执行4次_nop_()空操作,通过这种方式实现简单的延时。
- 定义一个延时函数
- 主函数实现:
- 在
main函数中,使用一个无限循环while(1)来保证程序一直运行。 - 在无限循环内部,使用
for循环遍历数组pattern,循环变量i从0到7。 - 每次循环将数组中的值赋给P1端口,即
P1 = pattern[i],这样就可以控制对应的发光二极管点亮。 - 然后调用
delay(60000)函数进行延时,使流水灯的变化效果能够被观察到。
- 在