定时器方式0的使用
通过设置TMOD寄存器中的M1M0为00选择定时方式0,方式0的计数位数是13位,对T0来说,有TL0寄存器的低5位,和TH0的8位组成
那么最多能装入2^13=8192个数,也就是说,经过8192个计数,寄存器就会溢出,向CPU发出中断请求。
所以计算公式为
TH0=(8192-X)/32
TL0=(8192-X)2
程序例子:
#include
#define uchar unsigned char
#define uint unsigned int
sbit led1=P1^0;
uchar num;
void main()
{
TMOD=0X00; //设置定时器0为工作方式;
TH0=(8192-4607)/32; //装初值
TL0=(8192-460)2;
EA=1;
ET0=1; //开定时器0;
TR0=1; //启动定时器0;
while-(1)
{
if(num==200)
{
num=0; //如果到了200次,说明1秒时间到
led1=~led1; //让发光管状态反接
}
}
}
void T0_time() interrupt 1
{
TH0=(8192-4607)/32; //重装初始值
TL0=(8192-4607)2;
num++;
}
定时器方式2的使用
方式2被称为自动重装的八位定时器/计数器。
原理:THX被作为常数缓冲器,当TLX计数器溢出时,在溢出标志TFX置1的同时,还自动地将THX中的常数重新装入TLX中,使TLX从初始值开始重新计数,这样就避免了认为的软件重装初始值带来的时间误差,从而提高定时精度。
适用范围:方式2特别适用于做较精确的脉冲信号发生器,因为其只有8位计数器。
缺点:当定时较长的时间是同时给编写程序带来麻烦,同时还会影响精度
公式:
THX=256-N;
TLX=256-N;
程序列子:
#include
#define MOTOR P2^0; //定义电机的输出口
int PWMcount,PWM;
void main()
{
TMOD=0X02; //设置定时器0的工作模式2
TH0=156; //转载初始值
TL0=156;
EA=0;
ET0=1; //开启内部定时器中断0;
TR0=1; //启动定时器中断0;
PWM=50; //以50的PWM输出
while(1){;}
}
void PWM_output() interrupt 1
{
PWM_count++;
if(PWM_count MOTOR=1;
else MOTOR=0;
if(PWM_count==100) PWM_count=0;
}