基于STC89C52RC单片机实现LED灯的定时闪烁
实现定时步骤:
1.确定晶振频率、分频倍数
2.确定使用的定时器、模式
3.计数脉冲源,设置C/T
4.设置TL、TH初始值
我们这里使用的是定时器0,16位定时器
1.使能定时器中断
2.使能总中断
3.编写中断处理函数
4.重新装填TL、TH初始值(可选)
程序代码:
#include <REGX52.H>
unsigned int delay_flag = 0;
//延时n ms函数
void Delaynms(unsigned int n)
{
while(1)
{
if(delay_flag >= n)
{
delay_flag = 0;
break;
}
}
}
void main()
{
//1.外部晶振为11.0592MHz,12分频
//2.使用定时器0,模式1
TMOD|=1<<0; //M0=1 置位操作:TMOD=TMOD|(1<<0) => TMOD=TMOD|1 (0000 0001)
TMOD&=~(1<<1); //M1=0 清位操作:TMOD=TMOD&~(1<<1) => TMOD=TMOD&0xFD (1111 1101)
//3.设置计数脉冲源:C/T
TMOD&=~(1<<2); //C/T=0
//4.设置TL0、TH0初始值
TL0=0x66;
TH0=0xFC;
//5.启动定时器:设置GATE、TR0
TMOD&=~(1<<3); //GATE=0
TCON|=1<<4; //TR0=1
//1.使能定时器0中断
ET0=1;
//2.使能总中断
EA=1;
while(1)
{
P2_0=0; //1111 1110
Delaynms(1000);
P2_0=1; //1111 1111
Delaynms(1000);
}
}
void time0() interrupt 1 //3.定时器0中断函数
{
TH0=0xFC; //4.给定时器赋初值,定时1ms
TL0=0x66;
delay_flag++;
}
关于置位操作与清位操作
置位操作:
TMOD |= 1
或运算:双方有1则为1
即假设TMOD为1010 0100 | (1)
1010 0100
0000 0001 //1
则为1010 0101
称此为置位操作,使得指定位的值为1,而不影响其它位。而如果将TMOD直接为1,则会影响其它位的值。
清位操作:
TMOD &=~(1
与运算:双方有0则为0
假设TMOD 1010 0111 则
1010 0111
1111 1101 //1
1010 0101
使得1位始终为0