51单片机定时器控制LED闪烁

//## 定时器控制 LED闪烁 (500MS) ##//

/*** 关于定时器0方式1初值的设置 ***/
预备知识:
首先我们要知道 51单片机普遍是1个机器周期 = 12 个时钟周期(晶振周期),频率与周期互为倒数关系。
示例:
假定晶振频率为12MHZ
时钟周期:1/12(MHZ)==1/12(μs)。
机器周期:12 x 1/12(μs)=1(μs)。
定时1ms,即1000(μs),要经过X个机器周期得到1000(μs),求得X=1000(μs)/1(μs)=1000个机器周期。16位定时器的溢出值是65536(因65535再加1才是溢出)。
所以我们可以先给TH0和TL0一个初始值,每过一个机器周期+1,经过1000个机器周期后刚好达到65536,也就是溢出,溢出后的事件处理通常有2种方式:
①通过软件查询TF0位是否置1,注意要将TF0软件清零。
②进入定时器中断服务函数,中断号注意别写错,本文用的就是进入定时器 中断服务函数的方式。
TH0=(65536-X)/256;
TL0=(65536-X)%256;

#include "reg51.h"

typedef unsigned int u16;
typedef unsigned char u8;

#define LED P1
#define LED_ON()  LED = 0xfe
#define LED_OFF() LED = 0xff

static u8  LedState = 0;//LED状态标志,0表示亮,1表示灭
static u16 LedTimeCount = 0;//LED计数器

void LedProcess(void)
{
	if(LedState == 0)//
	{
		LED_ON();
	}
	else
	{
		LED_OFF();
	}
}

void LedStateChange(void)
{
		if(LedTimeCount >= 500)//
		{
			LedTimeCount = 0;
			LedState =!LedState;//LED状态标志取反
		}	
}

void Timer0Init(void)
{
	TMOD = 0X01;//定时器0工作方式1
	TH0 = (65536 - 1000)/256;//定时器赋初值
	TL0 = (65536 - 1000)%256;
	ET0 = 1;
	TR0 = 1;
	EA = 1;
}

void main()
{
	 Timer0Init();
	 while(1)
	 {
		 LedProcess();
		 LedStateChange();	
	 }
}

void timer0Isr(void)interrupt 1
{
	TH0 = (65536 - 1000)/256;//定时器重装初值
	TL0 = (65536 - 1000)%256;
	LedTimeCount++;//LED计数器加1
}
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值