我们先来了解一下定时器中断是干什么的,这里举个例子
1、打个比喻
上课铃响,老师上课,下课铃响,老师下课,当然老师不听铃声上下课的也可以 这里的老师就是CPU,闹铃就是定时器,当闹铃计数到四十分钟后,闹铃就发出铃声提醒老师下课,这个铃声就是中断请求。老师执行下课操作。ET0/ET1这个寄存器就是闹铃的开关,打开了闹铃才会开始计时发出中断请求,而EA这个就是老师是否听得见请求,EA关了,等于说老师耳朵堵了,听不见下课铃同样就不会下课了,EA打开就会响应。可以看出老师和闹铃是两个独立的,闹铃不会占用老师的资源,老师也不会去干扰闹铃 图片来自普中科技教学PPT
2、了解定时器
定时/计数器实质上是一个加1计数器。它随着计数器的输入脉冲进行自加1,也就是每来一个脉冲,计数器就自动加1,,当加到计数器为全1时,再输入一个脉冲就使计数器回零,且计数器的溢出使相应的中断标志位置1,向CPU发出中断请求(定时/计数器中断允许时)。如果定时/计数器工作于定时模式,则表示定时时间已到;如果工作于计数模式,则表示计数值已满。脉冲来源是内部晶振则为定时模式,为外部脉冲则为计数,二者都可产生中断请求
3、配置定时器定时
先会用再了解 讲完这个,我们来看看如何配置这个闹铃(定时器) IPA15F2K61S2芯片提供了3个16位的定时/计数器器 ,分别是定时器0、1、2;通常只用定时器0、1,定时器2一般用作串口2的波特率发生器。这里不单独讨论定时器2。 说到这个配置定时器定时不得不提到一个非常强大的烧录工具STC-ISP, 链接:https://pan.baidu.com/s/13wIZ1oKiay-zFDrMXt1kfg 提取码:kmph 这样可以得到定时器的一个初始化函数非常好用,并且比赛也可以使用。得到这段代码,还不能产生定时中断,从最上方例子可以直到还需配置EA,ET0/ET1, 下面是进一步处理的例程,通过定时器中断实现1s定时翻转LED灯
#include "stc15f2k60s2.h"
unsigned char led=0x00;
void close();
unsigned char key;
void LED(unsigned char led)
{
P0 = led;
P2 = (0X1F&P2)|0X80;
P2 &= 0X1F;
}
void close()
{
P0 = 0X00;
P2 = (0X1F&P2)|0XA0;
P2 &= 0X1F;
}
void Timer0Init(void)
{
AUXR |= 0x80;
TMOD &= 0xF0;
TL0 = 0x20;
TH0 = 0xD1;
TF0 = 0;
TR0 = 1;
EA = 1;
ET0 = 1
}
void main()
{
close();Timer0Init();
while(1)
{
LED(led);
}
}
void Timer0() interrupt 1
{
static unsigned int num;
num++;
if(num==1000){num=0;led=~led;}
}
从代码中我们可以看到还需要写中断服务函数, void 函数名() interrupt 中断号 //定时器0中断服务函数 { 函数体; } 定时器0中断号是1,定时器1中断号是3 值得注意的是,中断查询顺序 图片来源,普中科技教学PPT 具体定时器的学习,这里有普中老师的PPT,非常nice,值得推荐 链接:https://pan.baidu.com/s/1w6WUz9WgKmSqbr6BzdxMqA?pwd=hkth 提取码:hkth
3、配置定时器计数
这个算是这篇文章的主打菜吧。毕竟上面软件不能帮我们配置了,哈哈 这个在有一届的省赛题考到过,NE555频率读取,就要用到定时器0的计数功能,下面直接开整 下面有该省赛题的完整代码第十届电压频率采集
1. 如何启动计数功能?
工作方式寄存器TMOD 高四位控制定时器1,低四位控制定时器0; GATE=0;软启动,TR0/TR1=1就可以启动定时器(常用) GATE=1;硬启动,TR0/TR1=1同时需要外部中断引脚INT0/1=1,才可以启动定时器 C/T=0,定时模式,此时脉冲来自系统内部, C/T=1,计数模式,定时器0脉冲来自P3^4;定时器1脉冲来自P35 MIM0;这两位控制工作方式,常用01,方式1 启用1定时器0计时模式TMOD=TMOD&0XF5; 启用1定时器0计时模式TMOD=TMOD&0X5F;这里的&操作可以保留另外一个定时器的配置不发生改变
2.计数
定时器0方式1的计数位数是16位,由TL0作为低8位,TH0作为高8位,组成了16位加1计数器 同理定时器1方式1的计数位数是16位,由TL1作为低8位,TH1作为高8位,组成了16位加1计数器 每来一个脉冲。TL0加一,溢出后,TH0加一,直至全满后,清零,同时向CPU发送中断请求, 这里两种办法计数 第一种,中断计数法 将TL0、TH0初始值设为0xff;来一个脉冲,就全满溢出,然后产生中断,中断服务函数运行num++;num的值就是计数值 第二种,定时取值 将TL0、TH0初始值设为0x00;可以存储65536个脉冲数,每隔一定时间将值取出来 具体操作: num=num+TH0*256+TL0;//num为计数值 TH0=0;TL0=0;//清零,方便下一次计数 个人推荐第二种,中断没那么频繁
|