中断系统应用实例(1)用定时器T1工作方式1控制两个LED以不同周期闪烁

1.控制目标

利用定时器T1工作方式1控制两个LED以不同周期闪烁,使得LED1每秒闪烁4次(即周期为250ms),LED2每秒闪烁1次(即周期为1s)。

2.控制分析

2.1 LED侧分析

若要使LED1每秒闪烁4次(即周期为250ms),LED2每秒闪烁1次(即周期为1s),那么需要分别给P1.0和P1.2接口分别输出周期为250ms(高低电平分别125ms)和1000ms(高低电平分别500ms)的方波。

2.2 程序分析

因为LED1和LED2的周期刚好是倍数关系,因此可以考虑定时器设置为125ms溢出,那么每溢出一次P1.0取反一次,每溢出四次P1.1取反一次。但是T1是16位定时器,那么最大仅为65535,机器周期为1.085us,则单次最多只能计时约71.1ms,因此我们可以考虑采用62.5ms溢出,那么每溢出2次P1.0取反一次,每溢出8次P1.1取反一次。
初值计算:单片机内部的时钟振荡器产生11.0529MHz的脉冲信号,经12分频后得到11.0529/12MHz的脉冲信号,那么经过62.5ms需要的脉冲信号为62.5ms/((12/11.0529)*10^(-3)ms)≈57567次,即T1设定初值应为57567次。

3.程序编写

#include<reg52.h>
#include<intrins.h>
sbit LED1=P1^0;
sbit LED2=P1^1;	//LED灯位定义
unsigned char sum1;
unsigned char sum2;//全局变量定义,用以对溢出次数计数
void main()
{
EA=1; //开总中断
ET1=1;//允许T1中断
TMOD=0X10;//M1=0,M0=1,即T1被设定为定时器、工作方式1
TH1=(65536-57567)/256;	 //T1高八位设初值
TL1=(65536-57567)%256;	 //T1低八位设初值
TR1=1; //T1启动
sum1=0;
sum2=0;
while(1)
;	//一直循环等待中断
}
void Tim1() interrupt 3//中断服务函数,T1的中断编号为3
{
	sum1++;
	sum2++;//每溢出一次sum1和sum2加1
	if(sum1==2)
	{
	LED1=~LED1;
	sum1=0;
	}
	if(sum2==8)
	{
	LED2=~LED2;
	sum2=0;
	}
TH1=(65536-57567)/256;	 //T1高八位设初值
TL1=(65536-57567)%256;	 //T1低八位设初值
//注意一定要再次对T1重新赋初值,否则溢出一次后将会从0开始计数
}

  • 6
    点赞
  • 48
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值