一、定时器概念:
1.能够对内部时钟信号或外部输入信号进行计数,数值达到设定要求时,向CPU发起中断请求,完成外部程序的运行。
2.本质就是进行计数,选择内部时钟脉冲,作为计数器时,技术信号的来源选择非周期脉冲信号。
二、过程:
C51具有两个定时器/计数器T0和T1,16位的加法计数器,由低8位和高8位THx两个寄存数值为65535个技术脉冲。
技术脉冲的来源有两个:
(1)系统时钟振荡器输出的12分频。
(2)T0或T1引脚输入的外部脉冲信号。
每接收到一个计数脉冲,计数器就会加1,当计数值累计至全为1时(8位255,13位8191,16位65535),再输入一个计数脉冲,计数器便会溢出回零,并且计数器的溢出是TCON寄存器的TF0或TF1位置1,同时向内核提出中断请求。如果定时/计数器工作于定时模式,则表示间隔定时时间到,如果工作与计数模式,则表示计数值已满。
假设单片机的外部晶振为12MHz,那么,经过12分频后输入计数器的计数脉冲为1MHz,即每个脉冲的周期为1us。因此定时器T0的16位工作模式最大的定时时间为65535us,65.5ms。如果要定时10ms的话,计数器就不能够从0开始计数了,必须给它一个计数初值。怎么计算这个初值呢?
要定时10ms,则相当于计数10000个脉冲后计数器的值就到达65535了,那么开始计数的这个地方就是计数初值。
三、编程思路:
定时/计数器的程序设计中,通常有两个函数:初始化函数和中断服务函数。
初始化函数中,一般情况下有:
a.配置工作模式,即对TMOD寄存器编程。
b.计算初始化值,即对THx和TLx寄存器进行赋值。
c.定时器/计数器中断,对ET0或ET1置1.
d.打开总中断,EA=1。
e.启动定时器,即TR0或TR1置1.
中断服务函数中有:
如果不是自动重装模式,需要对THx和TLx重新进行赋值;进行间隔定时达到逻辑处理越少越好。
代码如下:
#include "reg52.h"
sbit L1 = P0^0;
sbit L8 = P0^7;
void SeclectHC573()
{
P2 = (P2 & 0x1f | 0x80);
}
//****
void InitTimer0()
{
TMOD = 0x01;
TH0 = (65535 - 50000) / 256;
TL0 = (65535 - 50000) % 256;
ET0 = 1;
EA = 1;
TR0 = 1;
}
unsigned char count = 0; //这里我们可以在定义一个unsigned型的count1变量,但是为了代码的简洁,我们只需要定义一个即可
//unsigned char count1 = 0;
void ServiceTimer0() interrupt 1
{
TH0 = (65535 - 50000) / 256;
TH0 = (65535 - 50000) % 256;
count++;
if(count % 10 == 0)
{
L1 = ~ L1;
//count = 0;
}
if(count == 100)
{
L8 = ~L8;
count = 0;
}
}
//***
void main()
{
SeclectHC573();
InitTimer0();
while(1)
{
}
}
文章评论