LED闪烁周期为2秒,用定时器长定时实现(自动亮一秒,灭一秒,交替进行)
1.查询方式(定时器T0,采用方式二,不用重赋初值)四个灯亮
以上代码:
#include <reg51.h>
void main()
{
unsigned int flag;//定义全局变量
P0=0x00;//灯的状态一开始为全亮,为寄存器寻址
flag=0;//flag初始化
TMOD=0x02;//软启动,定时功能,定时器T0,方式2(开始定时器初始化)
TH0=156;//赋初值,因为定时器所定小时间为0.1ms,晶振频率为12MHz,经过计算初值为156,且高位低位初值一样
TL0=156;//赋初值
TR0=1;//开启计时器
while(1)
{
if(TF1==1)// 溢出,定时结束
{
TF0=0;//清标记
flag++;
}
if(flag==10000)//大时间到1秒
{
flag=0;//清零
P0=~P0;//灯灭
}
}
}
若是一个灯亮:(查询方式)
与上面只有一处不一样:这里定义了一个全局变量LED,初始化为LED=0,最后灯灭为LED=LED;
2.中断方式:(四个灯亮)
以上代码:
#include <reg51.h>
void main()
{
unsigned int flag;//定义全局变量
P0=0x00;//灯的状态初始化:全亮
flag=0;//flag初始化
ET0=1;//开开关,单独控制定时器T0的开关
EA=1;//大开关
PT0=1;//开始计时
TMOD=0x02;//软启动,定时功能,定时器T0,方式2(开始定时器初始化)
TH0=156;//赋初值,因为定时器所定小时间为0.1ms,晶振频率为12MHz,经过计算初值为156,且高位低位初值一样
TL0=156;//赋初值
TR0=1;//开启计时器
while(1)
{
if(flag==10000)//大时间到1秒
{
flag=0;//清零
P0=~P0;//灯灭
}
}
}
void one_timer0 () interrupt 1
{
ET0=0;//关开关
TF0=0;//清标记
flag++;
ET0=1;//开开关
}
若为一个灯亮,改动之处同查询方式一样。