首先介绍一下定时器的使用步骤:
①设置特殊功能寄存器TMOD,配置工作模式。
②设置技数寄存器的TH0和TL0的初值。
③设置TCON,也就是TR0和TR1,让定时器开始工作。
④判断TF0或TF1溢出标志,若为1则为溢出。
注意:定时器的初值计算:
12MHz,12/12也就是1MHz,1s=1 000 000次机器周期,10ms=10 000次机器周期,65536-10000=55536;
11.0592MHz,11.0592/12=0.9216MHz,1s=921600次机器周期,10ms=9216次机器周期,65536-9216=56320 0xDC00
例子:让LED闪烁间隔为1s。
#include <reg52.h>
sbit LED=P1^0;
void main()
{
unsigned int cnt; //用于计数,计算到1s时的时间
TMOD=0x01; //定时器的工作方式
TH0=0xb8; //给计数器初值
TL0=0x00;
TR0=1; // 计时器开始计时
while(1)
{
if(TF0==1)
{
TF0=0; //重置计时器
TH0=0xb8;
TL0=0x00;
cnt++;
if(cnt>=100)
{
cnt=0;
LED=~LED;
}
}
}
}
作业:1.使用定时器来实现延时,完成左右移动的流水灯的程序。
2.编程实现数码管静态显示秒表的倒计时。
参考答案:
1.
#include <reg52.h>
void main()
{
unsigned char i=0;
unsigned int cnt=0;
TMOD=0x01;
TH0=0xb8;
TL0=0x00;
TR0=1; //开启定时器0
while(1)
{
if(TF0==1)
{
TF0=0;
TH0=0xb8;
TL0=0x00;
cnt++;
if(cnt>=1)
{
cnt=0;
if(i<=7)// 实现流水,0x01=0b0000 0001 向左移i位后补0,再取反。
{P1=~(0x01<<i);} //0000 0001
else
{P1=~(0x80>>(i-7));}
i++;
if(i>=14)
i=0;
}
}
}
}
2.
#include <reg52.h>
sbit dula=P2^6;
sbit wela=P2^7;
unsigned char code tableChar[]=
{
0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,
};
unsigned char divide[]={0,0,0,0,0,0};
unsigned char i=0;
unsigned long sec=0;
unsigned int cnt=0;
void main()
{
TMOD=0x01;
TH0=0xfc; //setting 1ms 有误差,注意数码管刷新尽量的不要超过10ms,10ms任然有问题
TL0=0x67;
TR0=1;
EA=1;
ET0=1;
while(1)
{
if(cnt>=1000)
{
cnt=0;
sec++;
divide[0]=sec%10;divide[1]=sec/10%10;divide[2]=sec/100%10;
divide[3]=sec/1000%10;divide[4]=sec/10000%10;divide[5]=sec/100000;
}
}
}
void T0_Timer() interrupt 1
{
TH0=0xfc;
TL0=0x67;
cnt++;
wela=1;
P0=0xff;//消除鬼影
switch(i)
{
case 0: P0=0xfe;wela=0;dula=1;P0=tableChar[divide[5]];dula=0;i++;break;
case 1: P0=0xfd;wela=0;dula=1;P0=tableChar[divide[4]];dula=0;i++;break;
case 2: P0=0xfb;wela=0;dula=1;P0=tableChar[divide[3]];dula=0;i++;break;
case 3: P0=0xf7;wela=0;dula=1;P0=tableChar[divide[2]];dula=0;i++;break;
case 4: P0=0xef;wela=0;dula=1;P0=tableChar[divide[1]];dula=0;i++;break; //1101 1111
case 5: P0=0xdf;wela=0;dula=1;P0=tableChar[divide[0]];dula=0;i=0;break;
default:break;
}
}