【C51单片机定时器控制LED灯】

定时器工作方式2的使用

一、功能实现

采用定时器1,工作方式2,软件启动。实现下述功能:有8个LED小灯,首先8个灯同时亮1s,灭0.5s,重复3次;然后从第一个灯开始依次点亮,实现流水灯功能,每个灯亮2s;往复循环上述功能。

二、 Proteus仿真

在这里插入图片描述

三、代码

#include<reg51.h>
//采用定时器1工作方式2实现1s定时
void delay1s( )
{
		unsigned int i;
		TMOD=0x20;
		TH1=256-250;     //250us,因51单片机频率12Mhz,一个机器周期1us,计数250次即为250微秒
		TL1=256-250;
		for(i=0;i<4000;i++)  //循环4000次即为250微秒X4000=1s
		{
			TR1=1;
			while(!TF1);
			TF1=0;
		}
}
//采用定时器1工作方式2实现0.5s定时,原理同上
void delay500ms( )
{
	unsigned int i;
	
		TMOD=0x20;
		TH1=256-250;
		TL1=256-250;
		for(i=0;i<2000;i++)
		{
			TR1=1;
			while(!TF1);
			TF1=0;
		}
}

void main()
{
	unsigned char j,k,w;
	while(1)
	{
		for(j=0;j<3;j++)//8个灯同时闪烁三次,闪烁时亮1s,灭0.5s
		{
			P1=0X00;
			delay1s( );
			P1=0Xff;
			delay500ms( );
		}
		//实现8个LED循环点亮,点亮时间为2s
		w=0x01;
		for(k=0;k<8;k++)
		{
			P1=~w;
			delay1s( );  
			delay1s( );
			w<<=1;
		}
	}	
}
C51定时器有多种工作模式,其中比较常用的是定时/计数模式。在定时模式下,我们可以设置定时器的计数值和工作方式,使其每经过一定的时间就产生一个中断,从而实现定时功能。 以下是一个使用C51定时器实现LED闪烁的示例程序,闪烁频率为1秒: ```c #include <reg52.h> sbit LED = P1^0; // LED连接在P1.0引脚上 void timer0_init() { TMOD &= 0xF0; // 清除定时器0模式位 TMOD |= 0x01; // 设置定时器0为模式1(16位定时器) TH0 = 0xFC; // 设置定时器0初值为0xFC67,定时1s TL0 = 0x67; ET0 = 1; // 使能定时器0中断 EA = 1; // 使能总中断 TR0 = 1; // 启动定时器0 } void main() { timer0_init(); while(1); // 程序进入死循环 } void timer0_isr() interrupt 1 { static unsigned char count = 0; TH0 = 0xFC; // 重置定时器0初值 TL0 = 0x67; count++; if (count >= 50) { // 50次中断后切换LED状态,约1s count = 0; LED = ~LED; } } ``` 在这个程序中,我们使用定时器0来实现定时功能。首先在`timer0_init`函数中设置定时器0的工作模式为16位定时器模式,计数值为0xFC67,即65536-1000000/12=65408,定时1秒。 在`main`函数中调用`timer0_init`函数来初始化定时器,并进入死循环等待定时器中断。 当定时器产生中断时,会自动跳转到`timer0_isr`函数中处理。在这个函数中,我们使用一个静态变量`count`来记录中断次数,每50次中断(约1秒)后切换LED状态。这样就实现LED的闪烁功能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值