1.原理实现
(1)、什么是定时/计数器?
定时/计数器,是一种能够对内部时钟信号或外部输入信号进行计数,当计数值达到设定要求时,向CPU提出中断处理请求,从而实现定时或者计数功能的外设。定时/计数器的最基本工作原理是进行计数
22年比赛用的是15F2K61S2,定时器资源和60S2一样,拥有定时/计数器0、定时/计数器1、定时/计数器2三个定时计数器。
查找手册得知这三个定时器都为16位加法计数器,由低8位TLx和高8位THx两个寄存器组成,最大计数值为65535个计数脉冲。这个65535是等于2的16次方得来的。
作为定时器时:
计数信号的来源选择周期性的内部时钟脉冲
作为计数器时:
计数信号的来源选择非周期性的外部输入信号
(2)、作为定时器时,他是怎么进行计数的呢?
假设选取内部时钟为12MHz,分频为12分频,我们现在定时10MS.
首先内部时钟为12MHz,12分频后就是1MHz,那么一个时钟就是1/1M = 1us,那么一个定时器就能够定时65535us,我们要定时10ms也就是10000us,那么我们给定时器赋一个55535的初值,也就是0xD8EF,高八位TH = 0xD8,低八位TL = 0xEF。每经过1us计数器加1,10000us后计数器溢出产生一个定时器中断,这时即为定时了10ms。
(3)、相关的寄存器
1.TCON是中断控制寄存器
2.TMOD模式控制寄存器,不能进行位寻址,只能字节操作。
本期我们使用的是16位定时计数器模式,所以我们M1 M0位0 1
3.上文提到的低8位TLx和高8位THx两个寄存器
4.特殊功能寄存器AUXR(控制分频是12分频还是1分频)
查找得AUXR的地址:0x8E
需要自行去头文件定义
2.代码实现
1.编程思路
题目:使用定时器0的模式0定时100ms,每100ms所有LED电平翻转
(1)、初始化函数
1.配置工作模式,即对TMOD寄存器编程。
2.计算技术初值,即对THx和TLx寄存器进行赋值。
3.配置分频,即对AUXR寄存器进行按位与和按位或进行赋值
4.使能定时/计数器中断,即ET0或ET1置1。
5.打开总中断,即EA =1。
6.启动定时器,即TR0或TR1置1。
(2)、中断服务函数
1.如果不是自动重装模式,需要对THx和TLx重新赋值。
2.进行间隔定时到达的逻辑处理(越少越好)。
2.代码
#include <REGX52.H>
unsigned char num = 0;
void TIM_Init()
{
//配置TMOD寄存器
TMOD = 0x00;
//配置自动装载值
TL0 = 0xEF;
TH0 = 0xD8;//这里定时了10ms
//配置分频(1分频),12分频AUXR = (AUXR&0x7f)|0x80;
AUXR = (AUXR&0x7f);
//使能定时/计数器中断
ET0 = 1;
//打开总中断
EA = 1;
//启动定时器
TR0 = 1;
}
void TIM0_Start() interrupt 1
{
num++;//每10ms秒++
if(num==10) //每100msLED取反
{
num = 0;
P0 = ~P0;//p0状态取反
}
}
void main()
{
P2 = (P2 & 0x1f) | 0x80;
TIM_Init();
while(1)
{
}
}