一、
与以前的软件延迟做对比:软件延迟利用若干次空循环实现,占用CPU
1、定时器的构成
定时器:硬件 ;
此件利用 T0定时器,可在四种模式下工作
实质是加1计数器(16位计数器),由高8位TH0和低8位TL0两个寄存器组成,TMOD是工作方式寄存器,TCON是控制寄存器
分开赋初始值
TH0=0x??;
TL0=0x??;
2、定时器溢出
任何一个计数范围有限的系统,都存在溢出现象。系统可表达数的个数,称为模。溢出时,会导致定时器溢出中断请求(发出中断请求),与此时是否使能无关。但是有发生中断请求,不一定会被收到
溢出=总数为11,10+5时,等于15>11,无法表示,就溢出
3、计数器的控制
TMOD是工作方式寄存器,TCON是控制寄存器(控制启动和中断申请)
①TMOD 低四位用于T0,高四位用于T1
GATE:门控位
GATE=0时,令TR0=1,可以启动工作;
GATE=1时,令TR0=1,和外部中断引脚也为高电平,才可以启动工作
C/T:模式选择位
=0为定时模式;=1为计数模式
M1M0:工作方式设置位
自动重装定时:在溢出后,发出中断请求,会自动回零
//前三个步骤
TMOD=0x01;//0x01=0000 0001,在低四位,分别为gate,c/t,m1m0
②TCON是控制寄存器(高四位进行控制)
TR1&TR0:运行控制位,=1,开始工作,=0,停止工作
TF1&TF0:中断请求标志位,溢出时硬件会自动将其置于“1”
TR0=1;//运行控制位,置1位为工作
③中断的开启
EA=1 总中断开启
ET0=1 ET0是T0的中断允许位,ET1是T1的
EA=1;//开大门
ET0=1;//定时器0的中断运行
通过公式进行计算,得到初始值,将其附上,就可以得到想要的延迟时间
//简单的利用定时器控制LED的延迟闪烁
#include <reg52.h>
#include"bstv51.h"
void dsq()
{
TMOD|=0x01;//0000 0001,最后2位-工作方式的选择,这里选择16位定时器‘01’
TH0=0X00;//给高、低四位都赋初值=0
TL0=0X00;
EA=1;//开大门
ET0=1;//定时器0的中断运行
TR0=1;//运行控制位,置1位为工作
}
void main()
{
bstv51_init();
while(1);
}
void ab(void)interrupt 1 //中断的时间在大约65ms ,但是中断函数一般不要写太多东西
{
TH0=0x00;
TL0=0x00;
L0=~L0;
}