51单片机 定时器0中断实现LED流水灯

使用51单片机定时器0 方式1实现LED流水灯

代码:

#include <reg52.h>
typedef unsigned int u16;

void timer0init()
{
	TMOD=0x01;
	ET0=1;
	EA=1;
	TR0=1;
	TH0=64736/256;
	TL0=64736%256;
}

void main()
{	
	timer0init();
	while(1);
}

void timer0() interrupt 1
{
	u16 i;
  TH0=64736/256;
	TL0=64736%256;
	i++;
	switch(i)
	{
		case(100):P2=0xfe;break;
		case(200):P2=0xfd;break;
		case(300):P2=0xfb;break;
		case(400):P2=0xf7;break;
		case(500):P2=0xef;break;
		case(600):P2=0xdf;break;
		case(700):P2=0xbf;break;
		case(800):P2=0x7f;break;
	}
	if(i==800)
	{
		i=0;
	}
}

使用51单片机定时器0 方式1实现LED流水灯往返

代码:

#include <reg52.h>
typedef unsigned int u16;

void timer0init()
{
	TMOD=0x01;
	ET0=1;
	EA=1;
	TR0=1;
	TH0=63936/256;
	TL0=63936%256;
}

void main()
{	
	timer0init();
	while(1);
}

void timer0() interrupt 1
{
	u16 i;
  TH0=63936/256;
	TL0=63936%256;
	i++;
	switch(i)
	{
		case(100):P2=0xfe;break;
		case(200):P2=0xfd;break;
		case(300):P2=0xfb;break;
		case(400):P2=0xf7;break;
		case(500):P2=0xef;break;
		case(600):P2=0xdf;break;
		case(700):P2=0xbf;break;
		case(800):P2=0x7f;break;
		case(900):P2=0x7f;break;
		case(1000):P2=0xbf;break;
		case(1100):P2=0xdf;break;
		case(1200):P2=0xef;break;
		case(1300):P2=0xf7;break;
		case(1400):P2=0xfb;break;
		case(1500):P2=0xfd;break;
		case(1600):P2=0xfe;break;
	}
	if(i==1600)
	{
		i=0;
	}
}

51单片机中,利用定时器实现流水灯通常不采用中断的方式,因为中断可能会打断程序的正常流程,对于连续点亮每一盏灯的操作不利。下面是一个基本的无中断实现流水灯的例子: 1. **初始化定时器**:首先,将T0定时器设置为工作于模式1(8位自动重装),并配置成等间隔定时模式,即计数从0到FF后自动重置。 ```c TMOD = 0x01; // 设置T0为模式1 TH0 = 0xFF; // 定时初值,让计数从FF开始 TL0 = 0x00; ``` 2. **主循环处理**:在主循环中,不断读取T0的当前值并与下一盏灯对应的时间进行比较。当计数值减至零时,说明等待时间已过,点亮下一只灯,然后继续计数。 ```c while(1) { while(TA == 0); // 等待定时溢出,这里假设TF0中断标志未用 TF0 = 0; // 清除溢出标志 if(TL0 == 0 && TH0 == 0) { // 当计数器清零,点亮下一个LED // 控制LED操作,例如P1口的第i位控制第i只灯 P1 |= (1 << i); TL0 = LED_INTERVAL; // 设置新的计数值,每个灯的亮灭时间LED_INTERVAL } } ``` 在这个例子中,`LED_INTERVAL`是每只灯的亮灭时间对应的定时器初值,你需要将其替换为你实际使用的灯泡点亮和熄灭所需的实际延时。 **注意事项:** - 由于51单片机的资源有限,这通常需要对硬件电路进行适当设计,如使用外部晶体振荡器来稳定定时器周期。 - 计算LED间隔时要考虑单片机的CPU速度以及可能的延时开销。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值