目录
定时器
1、简介
2、工作原理
3、定时器的配置
4、设置定时器初始值
中断系统:
1、简介
2、配置中断端口
3、调用中断
运用计时器中断使LED以500ms为周期依次亮起
利用定时器中断使数码管显示666
定时器 1、简介
定时器:CT107D型号单片机的定时器使用单片机的内部资源,就是说把芯片卸下来也可以使用。
定时器作用:①用于计时系统,可实现软件计时等等。
②替代场时间的Delay,提高CPU的运行效率和处理速度。
注意:CT107D单片机内部共有3个定时器,T0、T1、T2,没有的定时器就无法使用,现在的单片机使用的计数器都是向下兼容的,越到后期,单片机的定时器就越多。
2、工作原理定时器在单片机内部就像一个小闹钟一样,根据时钟的输出信号,每隔“一秒”,计数单元的数值就增加一,当计数单元数值增加到“设定的闹钟提醒时间”时,计数单元就会向中断系统发出中断申请,产生“响铃提醒”,使程序跳转到中断服务函数中执行。
CT107D 单片机的定时器工作模式有四种:
模式0:13位定时器/计数器
模式1:16位定时器/计数器(常用)
模式2:8位自动重装模式
模式3:两个8位计数器
但是本节我们只研究模式1,下图为工作模式1的电路图。
我们将定时器分为三部分:时钟、计数单元、中断系统。
计数单元:上图中的TL0、TH0为计数系统,TH为高字节,TL为低字节,这两个字节一共可以存65535个数,只能数到65535。左边的时钟(SYSclk)提供一个脉冲给计时器,每来一个脉冲,计时器里面的计数值就会加一,当加到65535时就会溢出,计时器重新回到0,并向中断系统申请中断。
时钟:时钟有两个来源,一是系统的SYSclk(计时器),而是T0 Pin(外部接口——计数器)本节只研究SYSclk计时器。
SYSclk:系统时钟,即晶振周期,本开发板上的晶振为12MHz。晶振的含义为:在单片机芯片旁边有一个振动的元器件,其频率为12MHz(系统时钟频率就为12MHz),我们就用振动来产生给计数单元的脉冲(常用将方波信号作为脉冲信号)。这个12MHz的脉冲信号在进入计数单元前会进行一个分频(上图左上方的),即÷12或÷1(÷12为12T模式,÷1为1T模式)要是开关连到12分频的话,输出的就是1MHz,那么一个周期就有1M个脉冲,每个脉冲的时间就是1微秒,其含义为计数单元每隔1微秒就记一个数,加一。
在上图中有CT字样,这是选择模式开关,给低电平0的话就选择定时器模式(上面部分)给高电平就选择计数器模式(下面部分)。
3、定时器的配置下图是有关定时器的串口图,我们将以下图为基准配置定时器的串口。
首先,我们规定计时器的工作模式。这个由工作模式寄存器TMOD来确定。计时器有1、0两种工作模式。高四位用于配置计数器1,第四位用于配置计数器0。我们现在需要的是配置计数器0,所以M1、M2就给0,1.为什么给0、1,因为我们需要计时器工作在方式一下面,所以给0,1.。下面配置CT,这个是选择定时器模式还是计数器模式。当CT=1时,工作在计数器模式下。CT=0时,工作在定时器模式下。GATE是用来测脉冲信号的宽度的,正常情况下都是为0.
M1=0,M0=1,CT=1,GATE=0。这样我们的TMOD低四位就配置好了为0110.
故TMOD &= 0xF0,在读的时候我们是从低位往高位读。
下图为定时器控制寄存器TCON及其控制的端口。
TF1:计数器1溢出标志位。溢出1,未溢出0。TR1:计数器1运行控制位。1启动计数,0禁止计数。
TF0:计数器0溢出标志位。供查询或产生中断请求。TR0:计数器0运行控制位。
我们配置的是计数器0,所以只要配置有关计数器0的端口就行了。
4、设置定时器初始值我们知道定时器的最大值是65535,溢出值是65536。
由上图可知,我们若是想设置定时器的初值,即控制上图中的端口即可,经典举例:延时2ms时(晶振选择1T),设置计数器0的最低位TL0=0x40,最高位TH0=0xA2。
了解了设置定时器的原理后,我们就可以直接运用STC-ISP软件直接设置我们想要的定时器以及其模式。
设置时,我们将系统频率固定为12MHz,定时长度由自生遇到的情况决定,定时器自己选择使用0还是1,定时器模式的话一般选择16位自动重载或者16位。二者的区别在于选择16位时,还需要在下面的中断函数中重新定义TLTH端口,而16位自动重载则不需要。定时器时钟选择1T的话,计数脉冲的频率就更高,精度就高,依次类推。
中断系统: 1、简介简单来说中断系统就是在当单片机执行命令时,发生一个事件,中断系统直接发动时停——The World!!!!停下来吧单片机的时间!!
2、配置中断端口举例:当定时器溢出时,我们的中断系统就点亮一个LED灯。定时器溢出是出发时停的条件,然后就点亮LED,点亮LED后我们就回到触发时停之前,继续执行主函数。这就是中断系统的作用。
在配置中断时,我们就以上图为标准即可,举例:我们IE允许计数器0请求中断,那么就需要先打开总的中断开关EA,然后就是打开允许计数器0请求中断的开关ET1。
即 EA=1,ET0=1。
中断的配置仅仅是这么多。
3、调用中断 运用计时器中断使LED以500ms为周期依次亮起下列使用的自定义函数全已模块化,关于模块化还请浏览之前的文章
#include "STC15F2K60S2.H"//定时器的模块化 void Timer0Init(void) //2毫秒@12.000MHz { AUXR &= 0x7F; //定时器时钟12T模式 TMOD &= 0xF0; //设置定时器模式 TL0 = 0x30; //设置定时初始值 TH0 = 0xF8; //设置定时初始值 TF0 = 0; //清除TF0标志 TR0 = 1; //定时器0开始计时 EA=1; //中断总开关打开 ET0=1; //允许计时器0申请中断 }
#include "STC15F2K60S2.H" #include "Close.h" #include "Time0.h" #include "HC138.h" #include "intrins.h" void main() { Close_Init();//关闭外设 Timer0Init();//初始化或者使调用定时器 while(1); } void Timer0_Rountine() interrupt 1//调用中断函数 { unsigned int count;//定义一个count来计数 TL0 = 0x30; //设置定时初始值 TH0 = 0xF8; //设置定时初始值 count++;//当每次脉冲过来时(2ms)count++ if(count==250)//当count==250次也就是500ms时,执行if语句并将count初始化为0 { unsigned int i; count=0; HC138(4); for(i=1;i<9;i++) { P0=0xFF<#include "STC15F2K60S2.H"//关闭外设的模块化函数 #include "intrins.h" void Close_Init() { P2=((P2 & 0x1F) | 0xA0); P0 &=0xAF; P2 = 0x1F; }#include "STC15F2K60S2.H"//138译码器的模块化 #include "intrins.h" void HC138(unsigned char n) { switch(n) { case 4:P2=((P2&0x1f)|0x8F);break; case 5:P2=((P2&0x1f)|0xA0);break; case 6:P2=((P2&0x1f)|0xC0);break; case 7:P2=((P2&0x1f)|0xE0);break; } }利用定时器中断使数码管显示666void Timer0_Rountine() interrupt 1 { unsigned int count; TL0 = 0x30; //设置定时初始值 TH0 = 0xF8; //设置定时初始值 count++; if(count==250) { Show_Num(0,6); } if(count==500) { Show_Num(1,6); } if(count==750) { count=0; Show_Num(2,6); } }欢迎分享,转载请注明来源:内存溢出
评论列表(0条)