#include <reg52.h> // 包含51系列单片机的特殊功能寄存器的定义
// 定义LED灯的接口
sbit LED = P1^0;
// 定义74LS164的输入/输出端口
sbit D0 = P2^0;
sbit D1 = P2^1;
sbit D2 = P2^2;
sbit D3 = P2^3;
sbit D4 = P2^4;
sbit D5 = P2^5;
sbit D6 = P2^6;
sbit D7 = P2^7;
// 定义定时器中断服务程序
void Timer0_ISR() interrupt 1 {
// 清除定时器中断标志位
TF0 = 0;
// 重载定时器初值
TH0 = 0xFF; // 高8位装入0xFF,表示定时器计数的最大值
TL0 = 0xFF; // 低8位装入0xFF,表示定时器计数的最大值
// 控制LED灯的亮灭
if (i % 2 == 0) { // 向上流水灯操作
D7 = 1 << (i / 2); // 将数据写入到数据输出寄存器中,输出到外部设备
} else { // 向下流水灯操作或跑马灯闪烁(齐亮齐灭)操作
D7 = ~(1 << (i / 2)); // 将数据写入到数据输出寄存器中,输出到外部设备,取反操作即可实现灭灯效果
}
}
void delay(unsigned int time) { // 延时函数,使用定时器中断实现精确延时
unsigned int i, j;
for (i = 0; i < time; i++) {
for (j = 0; j < 1275; j++); // 根据晶振频率和需要延时的时间计算出需要计数的次数,这里假设晶振频率为11.0592MHz,需要精确延时1ms
}
}
void main() {
unsigned char i; // 定义循环变量
// 设置定时器0工作模式为16位自动重载模式,并启用定时器中断
TMOD = 0x01; // 设置定时器模式,这里使用模式0(16位自动重载模式)
ET0 = 1; // 开启定时器0中断允许位
EA = 1; // 开启总中断允许位
TR0 = 1; // 启动定时器0
// 循环控制LED灯的亮灭效果,向上流水灯、向下流水灯和跑马灯闪烁交替进行
while (1) {
for (i = 0; i < 8; i++) { // 向上流水灯操作
D0 = 0; // 将数据写入到数据输出寄存器中,输出到外部设备
D1 = 0;
D2 = 0;
D3 = 0;
D4 = 0;
D5 = 0;
D6 = 0;
D7 = 1 << i; // 将数据写入到数据输出寄存器中,输出到外部设备
delay(1000); // 延时一段时间,假设LED灯亮的时间为1秒,需要使用定时器中断实现精确延时,而不是简单的循环延时