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开始计数
}