8位led流水灯,每1s切换一次,亮灭时间为0、5s,利用内部定时器计时,并将改变方向的次数显示在数码管上
时间: 2024-03-24 14:38:47 浏览: 69
51单片机一个LED流水灯(由8个LED灯组成),单向流水,时间间隔为200ms。
5星 · 资源好评率100%
好的,这是一个比较简单的任务,我可以帮你写出一个基于定时器的代码,让LED流水灯可以每1秒切换一次并且亮灭时间为0、5秒,同时还可以计算改变方向的次数并在数码管上显示出来。
以下是代码示例:
```C
#include <reg52.h>
#include <intrins.h>
typedef unsigned char uchar;
typedef unsigned int uint;
sbit D1 = P1^0;
sbit D2 = P1^1;
sbit D3 = P1^2;
sbit D4 = P1^3;
sbit D5 = P1^4;
sbit D6 = P1^5;
sbit D7 = P1^6;
sbit D8 = P1^7;
sbit L1 = P2^0;
sbit L2 = P2^1;
sbit L3 = P2^2;
sbit L4 = P2^3;
sbit L5 = P2^4;
sbit L6 = P2^5;
sbit L7 = P2^6;
sbit L8 = P2^7;
sbit B1 = P3^0;
sbit B2 = P3^1;
sbit B3 = P3^2;
sbit B4 = P3^3;
uchar cnt = 0; // 改变方向的次数
uint timer_count = 0; // 定时器计数器
void delay(uint n) { // 延时函数
uint i, j;
for(i = n; i > 0; i--)
for(j = 110; j > 0; j--);
}
void timer0_init() { // 定时器初始化函数
TMOD |= 0x01; // 设置定时器0为模式1
TH0 = (65536 - 50000) / 256; // 设置定时器0计数初值,50ms中断一次
TL0 = (65536 - 50000) % 256;
ET0 = 1; // 开启定时器0中断
EA = 1; // 开启总中断
TR0 = 1; // 启动定时器0
}
void timer0_isr() interrupt 1 { // 定时器0中断处理函数
uchar i;
timer_count++;
if(timer_count == 20) { // 20个50ms计数,1s
timer_count = 0;
cnt++; // 改变方向计数器加1
if(cnt % 2 == 0) { // 每两次改变方向亮灭一次
L1 = ~L1;
L2 = ~L2;
L3 = ~L3;
L4 = ~L4;
L5 = ~L5;
L6 = ~L6;
L7 = ~L7;
L8 = ~L8;
}
for(i = 0; i < 5; i++) { // 亮灭时间为0、5秒
D1 = 1;
D2 = 1;
D3 = 1;
D4 = 1;
D5 = 1;
D6 = 1;
D7 = 1;
D8 = 1;
delay(1000);
D1 = 0;
D2 = 0;
D3 = 0;
D4 = 0;
D5 = 0;
D6 = 0;
D7 = 0;
D8 = 0;
delay(1000);
}
}
}
void main() {
timer0_init();
while(1) {
B1 = ~(cnt % 10); // 数码管显示改变方向的次数的个位数
B2 = ~((cnt / 10) % 10); // 数码管显示改变方向的次数的十位数
B3 = ~(cnt / 100); // 数码管显示改变方向的次数的百位数
B4 = 0x0f; // 关闭数码管的数字显示
}
}
```
这个代码中,我们使用了定时器0来计时,每50ms定时器中断一次,20次中断就是1秒,同时我们使用一个计数器`cnt`来统计改变方向的次数,每两次改变方向就会让LED流水灯亮灭一次,并且亮灭时间为0、5秒。数码管显示的是改变方向的次数的个位数、十位数和百位数,每秒更新一次。
这个代码可以直接在51单片机上运行,如果你需要在其他平台上运行,可能需要做一些修改。
阅读全文