定时中断是单片机最重要的功能之一,最初学习时遇到了很多问题,通过不断的学习解决了很多问题,但实际上学习后也一无所有。 现在我们整理了计时器的使用方法,以51单片机为例。 其他STC15等系列单片机其实原理相似,希望能对大家有所帮助。
计时器练习: 《51单片机定时器小练习》 —计时器方波发生器的实现
水平。
针对索引计时器相关寄存器计时器动作方式计时器初始值的计算计时器中断的使用进行说明。
计时器相关寄存器中断允许寄存器IE
1.EA:cpu总中断允许控制位。 EA=1,cpu开放中断。
2.ET0/ET1:计时器T0和计时器T1溢出中断允许位。 ET0/ET1=1; 允许中断。
3.EX0/EX1:外部中断0和外部中断1中断允许位。 EX0/ET1=1; 允许中断。
控制寄存器TCONTF1:计时器/计数器T1溢出标志。 允许T1计数后,从初始值开始加1计数。 最高有效位发生溢出时,硬件设置“1”,此时向CPU请求中断,保持CPU响应中断,硬件清除“0”。 (TF1也可以通过程序检查“0”。)
TR1 :计时器T1的运行控制位。 此位由软件设置&; 被清除。 当GATE=0,并且TR1=1时,允许T1的计数开始,并且当TR1=0时,禁止T1的计数。 T1计数仅在GATE=1、TR1=1、外部中断1输入位为高电平时允许。
TF0:定时器/计数器T0溢出标志。 T0被允许计数后,从初始值加1进行计数。 最高有效位发生溢出时,硬件设置“1”,此时向CPU请求中断,保持CPU响应中断,硬件清除“0”。 (TF0也可以通过程序检查“0”。)
TR0 :计时器T0的运行控制位,该位由软件设置&; 被清除。 GATE=0,TR0=0时允许T0的计数开始,TR0=0时禁止T0的计数。 仅在GATE=1、TR0=1且外部中断0输入位为高电平时,允许T0计数。
TMOD寄存器其中后四位定义计时器/计数器T0,前四位定义计时器/计数器T1。
GATE——车门控制。 GATE=1时,通过外部中断端子INT0、INT1和控制寄存器的TR0、TR1启动计时器。
GATE=0时,仅通过TR0、TR1套分别启动计时器T0、T1。 、C/T——功能选择位
M0、M1——方式选择功能
因为有两位数,所以有四种工作方法
M1M0动作模式计数器模式TMOD (计时器模式的设定) ) ) ) ) ) ) ) )。
0方式0 13位计数器TMOD=0x00
0方式1 16位计数器TMOD=0x01
1方式2自动重载8位计数器TMOD=0x02
一种方案3 T0可以分为两个8位计数器,其中T1是波特率发生器TMOD=0x03
计时器动作方式介绍方式0:M1=0、m0=0、13位计时器/计数器
方式1:M1=0、m0=1、16位定时器/计数器
方式2:M1=1、M0=0 ,8、8、8位自动过载计时器
方式3:M1=0、M0=0、双8位定时器/计数器
计时器初始值的计算首先要了解单片机的机械周期,机械周期介绍如下。
以单片机晶体振动为12MHz时为例。 假设以1ms为计时器。 如果采用计时器0、方式1,则此时为16位的定时,16位的最大值为2的16次方,即65536。
12MHz的单片机其机械周期为1us。 因为1ms=1000us。 所以初始值的大小x=65536-1000=64536。 然后将64536转换为十六进制。
计时器的初始化代码如下。
void Time0Init () {TMOD=0X01; //设定计时器0的方式为1.TL0=0x18; //设定定时初始值低4位的TH0=0xFC; //置位定时初始值高位4位TF0=0; TR0=1; }现在我给你看计时器计算的小工具。
链接:百度网盘。
提取代码:gtgm
使用计时器中断。 功能:使用计时器0进行计数,每秒反转led灯。 http://www.Sina.com/http://www.Sina.com /
#include'reg51.h'sbit led=P1^0; 语音时间0 init (; 未指定的Int TT; int main () ) {Time0Init; wile(1; }void Time0Init () {TMOD=0X01; TL0=0x18; //设定定时初始值TH0=0xFC; TF0=0; TR0=1; ET0=1; //打开计时器中断ea=1; //总中断打开(} Void时间0 ) )中断1 ) TL0=0x18; //根据计时器的工作方法选择时16位。 因为没有自动重载功能,所以每次溢出时都要手动初始化。 TH0=0xFC; tt; if(TT==1000 ) {tt=0; led=~led; }