一、定时器
1.理解
2.相关寄存器
#include "reg52.h"
sbit led = P3^6;
void delay10ms()
{
//1. 配置定时器0工作模式16位计时
TMOD = 0X01;
//2. 给初值,定一个10ms出来
TL0 = 0x00;
TH0 = 0xDC;
//3. 开始计时
TR0 = 1;
TF0 = 0;
}
void main()
{
int cnt = 0;
led = 1;
delay10ms();
while(1){
if(TF0 == 1){//当爆表的时候,硬件会修改bit5(TF0)位上面的数据,改成1(置1)
TF0 = 0;//不用中断,软件清零
cnt++;//统计爆表次数
TL0 = 0x00;//重新给初值
TH0 = 0xDC;//重新给初值
if(cnt == 100){//爆表100次,经过了1s
cnt = 0;//当100次表示1s,重新让cnt从0开始,计算下一次的1s
led = !led;//每经过1s,翻转LED状态
}
}
}
}
二、定时器中断
#include "reg52.h"
#include <intrins.h>
sbit led = P3^6;
sbit led1 = P3^7;
int cnt = 0;
void Time0Init()
{
//1. 配置定时器0工作模式16位计时
TMOD = 0X01;
//2. 给初值,定一个10ms出来
TL0 = 0x00;
TH0 = 0xDC;
//3.打开定时器0中断
ET0 = 1;
//4.打开总中断EA
EA = 1;
//5. 开始计时
TR0 = 1;
TF0 = 0;
}
void Delay300ms() //@11.0592MHz
{
unsigned char i, j, k;
_nop_();
i = 3;
j = 26;
k = 223;
do
{
do
{
while (--k);
} while (--j);
} while (--i);
}
void main()
{
led = 1;
Time0Init();
while(1){
led1 = 0;
Delay300ms();
led1 = 1;
Delay300ms();
}
}
void Time0Handler() interrupt 1
{
cnt++;
TL0 = 0x00;
TH0 = 0xDC;
if(cnt == 100){
cnt = 0;
led = !led;
}
}