目录:
一.定时器计数器连接框图
二.寄存器说明
三.写代码
四.源码
一:定时器计数器连接框图,框图来源于网络
二:相关寄存器说明
(1)TCON:控制定时器/计数器的启动,停止,中断以及外部中断的触发方式等
1.定时器/计数器的控制:
TCON中的TR0=1(或者TR1=1)时相应的定时器开始计时,
置0时,定时器停止计数
2.中断控制:
TCON中的TF0和TF1是定时器0和定时器1的溢出中断标志位,
当定时器计数溢出时,相应标志位会被置1,发送中断请求
3.外部中断触发方式控制:
TCON中的IT0和IT1用于设置外部中断0和外部中断1的触发方式
IT0=0时,触发方式是低电平触发
IT0=1时,是下降沿触发
我们常用下降沿触发方式
4.TMOD:定时器模式寄存器,可以设置16种模式
工作方式:
(1) 方式0位13位定时/计数器
(2)方式1为16位定时/计数器
(3)方式2位自动重装初值8位定时/计数器
(4)方式3仅适用于定时器0,可以将其拆分位两个
独立的8位计数器
5.TH0,TL0和TH1,TL1寄存器:
(1)分别是定时器0和定时器1的高八位和低八位
(2)存放定时器/计数器的初值
(3)当计满溢出时触发相应中断
(4)计算公式:
TH0=(65535-定时的时间)/256;
TL0= (65535-定时的时间)%256;
例如:想要1ms产生一次定时中断中断
TH0=(65535-1000)/256;
TL0= (65535-1000)%256;
6.AUXR寄存器:
(1)用于设置定时器工作模式,选择时钟源等
(2)如果不设置默认12T工作模式
三.写代码 :
定时器初始化:
(1)配置定时器工作模式
(2)设置初值TH,TL
(3) 中断标志位置0
(4)定时器0计时开始TR0=1
(5)写中断函数(就是普通函数后面加中断号)
四.源码:
#include "reg52.h"
#include "LED.h"
int i=0;
int a=0;
void Timer_init()
{
TMOD=0x01;
//1ms产生一次中断
TH0=(65536-1000)/256;
TL0=(65536-1000)%256;
TF0=0;
TR0=1;
ET0=1;
EA=1;
}
void Timer0() interrupt 1
{
i++;
if(i>=1000)//定时1s
{
i=0;
a=1;
}
TH0=(65536-1000)/256;
TL0=(65536-1000)%256;
}
void main()
{
bit x;
Timer_init();
while (1)
{
if(a)
{
a=0;
x=~x;
if(x)
{
LED(5);
}
else
{
LED(0);
}
}
}
}