51单片机使用定时器进行流水灯设计

本文介绍了一个在使用8051单片机控制LED灯时,通过C语言实现流水灯效果的小型bug修正。原始代码仅使用左移导致额外点亮,修正后使用左移和逐位取反确保精确控制。

图1

由于图片刷新率不高所以显示不全,实际上,上图是依次亮灯,实现逐渐点亮的效果,下图是依次亮灯后灭灯,实现流水灯的效果。

图2

这两部分的代码的区别在于:
图1是只用了左移,而左移的填充是0,这就会导致LED灯被逐个点亮。

图2是用了左移和逐位取反,先逐位取反后,要点亮的灯为1,不点亮的为0,此时进行左移填充的0就不会导致额外的LED灯被点亮。最后再取反回来就实现所需功能。

算是一个小BUG的修正。

完整代码:

#include <reg51.h>
#include<intrins.h>

sbit LED = P2;

typedef unsigned int u16;    //对系统默认数据类型进行重定义
typedef unsigned char u8;

u16 aa=0xfe;
u16 num;

void timer0() interrupt 1
{
	TF0 = 0;
	TH0=(65535-50000)/256;    //50ms定时20次
    TL0=(65535-50000)%256;
	num++;
	num %= 8;
	P2=aa << num;
	//P2=~(~aa << num);
}


void main()
{
	LED = ~0x01;		
	TMOD = 0x01;
    TH0=(65535-50000)/256;
    TL0=(65535-50000)%256;
	TR0 = 1;		// 启动定时器0
	ET0 = 1;		// 打开T0中断
	EA = 1;			// 开总中断
	while(1);
}

### C51单片机定时器实现流水灯的代码示例 以下是基于C51单片机使用定时器实现流水灯效果的一个完整示例代码: ```c #include <reg52.h> sbit LED_P0_0 = P0^0; sbit LED_P0_1 = P0^1; sbit LED_P0_2 = P0^2; sbit LED_P0_3 = P0^3; unsigned char count = 0; // 计数变量用于延时控制 void Timer0_Init() { TMOD &= 0xF0; // 清除T0模式位 TMOD |= 0x01; // 设置T0为工作方式1(16位定时器) TH0 = (65536 - 50000) / 256; // 定时初值计算,约20ms溢出一次 TL0 = (65536 - 50000) % 256; ET0 = 1; // 开启T0中断允许 EA = 1; // 总中断使能 } void Delay_ms(unsigned int ms) { unsigned int i, j; for (i = 0; i < ms; i++) { for (j = 0; j < 123; j++); } } void main() { P0 = 0xFF; // 初始化P0口为高电平 Timer0_Init(); // 初始化定时器0 while (1) { // 主循环无需操作,由定时器中断完成流水灯逻辑 } } // 定时器0中断服务程序 void Timer_ISR() interrupt 1 { TH0 = (65536 - 50000) / 256; // 重装载初值 TL0 = (65536 - 50000) % 256; count++; if (count >= 50) { // 延时大约1秒 count = 0; static unsigned char state = 0b0001; // 初始状态 // 左移一位并更新到端口 state <<= 1; if (!(state & 0b1000)) { state |= 0b0001; // 如果超出范围,则回到最低位 } P0 = ~state; // 输出反向信号点亮LED } } ``` #### 说明 - **硬件配置**: 上述代码假设LED连接至P0端口的不同引脚。实际应用中需根据具体电路调整。 - **定时器初始化**: `Timer0_Init` 函数设置了定时器的工作模式以及初始值[^1]。 - **中断处理**: 在定时器中断服务程序中实现了流水灯的状态转移逻辑[^2]。 --- ### 关键技术点解析 1. **定时器配置** - 单片机中的定时器通常被用来生成精确的时间间隔。在此案例中,通过设置TH0和TL0寄存器来定义时间延迟[^1]。 2. **中断机制** - 当定时器达到预设值时触发中断,进入对应的中断服务程序(ISR),从而改变LED的状态以形成流水灯效果[^2]。 3. **状态管理** - 使用一个静态变量保存当前LED显示状态,并利用位运算(`<<`, `|`)动态修改该状态,确保流畅的视觉体验[^1]。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值