本项目由定时器中断方式实现LED闪烁,
#include "reg52.h"
sbit led = P3^6;
int cnt = 0;
void timeinit()
{
//1. 配置定时器0工作模式位16位计时,为2的六次方65536
TMOD = 0x01;
//2. 给初值,定一个10ms出来
由于52单片机晶振频率为11.0592MHZ为11059200HZ
跳一次一个机器周期,一个机器周期等于12个时钟周期
而一个时钟周期等于晶振频率的倒数
跳一次为 12/11059200s=1.085us
想让他定时10ms,10ms=10000us
10000us/1.085us=9216 65536-9216为56320,转换为16进制
为DC00
TL0=0x00;//低位
TH0=0xDC;//高位
//3. 开始计时
TR0 = 1;
TF0 = 0;
ET0=1;
EA=1;
}
void main()
{
led=1;
timeinit();
while(1)
{
}
}
void Time0hander() interrupt 1
{
cnt++; //统计爆表的次数
//重新给初值
TL0=0x00;
TH0=0xDC;
if(cnt == 100){//爆表100次,经过了1s
cnt = 0; //当100次表示1s,重新让cnt从0开始,计算下一次的1s
led = !led;//每经过1s,翻转led的状态
}
}
实验结果
定时器中断控制LED
如果想要定时50ms,则需要计数50000次,晶振跳一次1.085us,
50000/1.085=19454
只需将代码中定时器低位高位
改为 TL0=0xfe;
TH0=0x4b;
实验结果
定时器定时50ms
此实验还可进行推广,比如可以在主函数里根据软件延时函数使另外LED闪烁,在中断里使第一个LED根据内部定时器延时50ms闪烁。