AT89C51单片机控制心形灯实验,通过将 16 个 LED 发光二极管分别连接至单片机的 P1 和 P2 口,实现点亮所有LED灯keil完整c语言代码
时间: 2024-09-25 08:12:39 浏览: 60
AT89C51是一款常用的8位单片机,常用于教学和简单的电子项目。要控制心形灯阵列,首先需要理解单片机的I/O口操作以及基本的循环结构。这里提供一个简化版的Keil C51代码示例,假设心形灯的LED分布是P1口控制上半部分,P2口控制下半部分。
```c
#include <reg51.h> // 包含8051寄存器头文件
// 定义LED数组,注意实际电路布局
char led[16] = {0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 1, 0, 0, 1}; // 心形灯矩阵举例
void delay_ms(unsigned int m) {
for (unsigned int i = 0; i < m * 12; i++);
}
void main() {
TMOD = 0x01; // 设置TMOD为定时器T0工作于模式1,即计数器模式
TH0 = 0xFD; // 计数初值,使得T0溢出周期约为1ms
TL0 = 0xFD;
TR0 = 1; // 开启定时器T0
while(1) { // 无限循环
for(int i = 0; i < 16; i++) { // 遍历LED数组
if(led[i]) { // 如果当前LED状态为1,则点亮
P1 = 0b10000000 | P1 << i; // 对应P1口的第i位置1
P2 = 0b10000000 | P2 << (i + 8); // 对应P2口的对应位置1
delay_ms(100); // 点亮延时
}
}
for(int i = 16; i > 0; i--) { // 同样遍历LED数组,这次关闭
if(led[i - 1]) { // 当前LED状态为1,则熄灭
P1 &= ~(0b10000000 >> (i - 1)); // 关闭P1口的相应位
P2 &= ~(0b10000000 >> (i - 9)); // 关闭P2口的相应位
delay_ms(100);
}
}
}
}
```
阅读全文