51单片机——定时器
扫描二维码
随时随地手机看文章
1、定时器和计数器
时钟周期:单片机时序中的最小单位,集体计算的放法就是时钟源分之一
机器周期:单片机完成一个操作的最短时间,=12个时钟周期
定时器:打开定时器后,定时器“存储寄存器”的值经过一个机器周期自动加1,也就是说,机器周期是定时器的计数周期。
2、定时器的寄存器
TMOD —— 工作模式选择寄存器——常用模式1和模式2.
TCON —— 控制寄存器(TRn定时器开关)
TH/TL —— 定时计数器
3、定时器应用
第一步:设置特殊功能寄存器TMOD,配置好工作模式。
第二步:设置计数寄存器TH0和TL0的初值。
第三步:设置TCON,通过TR0置1来让定时器开始计数。
第四步:判断TCON寄存器的TF0位,监测定时器溢出情况。
写程序之前,我们要先来学会计算如何用定时器定时时间。我们的晶振是 11.0592M,时钟周期就是 1/11059200,机器周期是12/11059200,时器定时值最大也就是 71ms 左右。
(65536-N)*12/11.0592M = time ---计算出N转换成十六进制
1ms的例子:
TMOD = 0X01;
TH0 = 0XFC;
TL0 = 0X67;
TR0 = 1;
#include
typedefunsignedcharuchar;
sbitLED=P0^0;
intmain(void)
{
ucharcnt=0;//定义一个计数变量,记录T0溢出次数
TMOD=0x01;//设置T0为模式1
TH0=0xFC;//为T0赋初值0xB800
TL0=0x67;
TR0=1;//启动T0
while(1)
{
if(1==TF0)//判断T0是否溢出
{
TF0=0;//T0溢出后,清零中断标志
TH0=0xFC;//并重新赋初值
TL0=0x67;
cnt++;//计数值自加1
if(cnt>=1000)//判断T0溢出是否达到50次
{
cnt=0;//达到50次后计数值清零
LED=~LED;//LED取反:0-->1、1-->0
}
}
}
return0;
}
4、数码管
共阴与共阳数码管 ——8个LED灯
位选——控制选择多个数码管中的哪一个
段选——选择数码管显示的值
//秒定时器:
#include
typedefunsignedintuint;
typedefunsignedcharuchar;
ucharcodecount[]=
{
0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,
0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E
};
intmain(void)
{
ucharcnt=0;//记录T0中断次数
ucharsec=0;//记录经过的秒数
TMOD=0x01;//设置T0为模式1
TH0=0xFC;//为T0赋初值0xB800
TL0=0670;
TR0=1;//启动T0
while(1)
{
if(TF0==1)//判断T0是否溢出
{
TF0=0;//T0溢出后,清零中断标志
TH0=0xFC;//并重新赋初值
TL0=0x67;
cnt++;//计数值自加1
if(cnt>=1000)//判断T0溢出是否达到1000次
{
cnt=0;//达到1000次后计数值清零
P0=count[sec];//当前秒数对应的真值表中的值送到P0口
sec++;//秒数记录自加1
if(sec>=16)//当秒数超过0x0F(15)后,重新从0开始
{
sec=0;
}
}
}
}
return0;
}