89C52通过定时器每10秒改变一次流水灯方向源程序
时间: 2024-02-06 09:11:44 浏览: 102
89c52控制流水灯
以下是89C52通过定时器每10秒改变一次流水灯方向的源程序:
```
#include <reg52.h>
// 定义LED流水灯的8个灯的IO口
sbit LED1 = P1^0;
sbit LED2 = P1^1;
sbit LED3 = P1^2;
sbit LED4 = P1^3;
sbit LED5 = P1^4;
sbit LED6 = P1^5;
sbit LED7 = P1^6;
sbit LED8 = P1^7;
// 定义定时器初值和重装值,使其定时时间为10秒
#define TIMER_VAL 65536 - 10000
// 定义全局变量,用于保存流水灯的方向
int direction = 1; // 初始方向为向右
// 定义定时器中断服务程序,用于改变流水灯方向
void Timer0_ISR() interrupt 1
{
// 改变流水灯方向
if (direction == 1) {
direction = -1;
} else {
direction = 1;
}
// 清除定时器中断标志位
TF0 = 0;
}
// 定义流水灯程序,控制流水灯的方向和速度
void Flowing_Light()
{
// 定义流水灯的8个状态
unsigned char light[8] = {0xFE, 0xFD, 0xFB, 0xF7, 0xEF, 0xDF, 0xBF, 0x7F};
// 定义变量,用于控制流水灯的速度
int speed = 10000;
// 定义变量,用于控制流水灯的方向
int index = 0;
// 循环控制流水灯的运行
while (1) {
// 控制流水灯的方向
index += direction;
// 控制流水灯的速度
for (int i = 0; i < speed; i++);
// 显示流水灯的状态
if (index >= 0 && index <= 7) {
P1 = light[index];
} else {
index = 0;
}
}
}
// 主程序
void main()
{
// 初始化定时器
TMOD = 0x01; // 设置定时器0为16位定时器
TH0 = TIMER_VAL / 256; // 设置定时器初值
TL0 = TIMER_VAL % 256; // 设置定时器重装值
ET0 = 1; // 开启定时器中断
EA = 1; // 开启总中断
TR0 = 1; // 开启定时器
// 初始化流水灯
P1 = 0xFE;
// 控制流水灯的运行
Flowing_Light();
}
```
注意,这只是一个简单的示例程序,您需要按照实际需求进行修改和调整。
阅读全文