定时器介绍:51单片机的定时器属于单片机的内部资源,其电路连接和运转均在单片机的内部完成
定时器的作用:
1用于计时系统,可实现软件计时,或者使程序每隔一段固定的时间完成一项操作
2替代长时间delay,提高CPU的运行效率和处理速度
stc89c52定时器资源
定时器个数:3个(T0,T1,T2),T0和T1和传统的单片机兼容,T2是此单片机增加的资源。
定时器框图
定时器在单片机中就像一个闹钟,根据时钟输出的信号,每隔一秒,计数单元的数值就会增加一;
当计数单元的数值增加到设定的闹钟提醒时间时,计数单元就会向中断系统发出中断申请,产生闹铃提醒,使程序跳转到中断服务函数中执行。
时钟 > 计数单元 > 中断系统
提供计数单元的脉冲 时钟计数 产生中断,执行定时任务
stc89c52的T0和T1均有四种工作模式
模式0:13位定时器/计数器
模式1:16位定时器/计数器
模式2:8位自动重装模式
模式3;两个8位计数器
以下是定时器0的模式图,定时器1模式图与定时器0相同
以下是定时器2的模式图:
注意模式2定时器运用的是8位重装模式这里的THO和TLO相等。
中断的概念
cpu在处理事件A时,发生了事件B请求去处理事件B,这时候中断就产生了。cpu暂时停止中断当前的工作,转去处理事件B(中断响应),当事件B处理完后,再回来处理事件A(中断返回),这一过程成为中断。
中断等级
51单片机中一共有5个中断源,分别是外部中断0;定时器0,外部中断1,定时器1,串口中断,中断等级从小到大分别是01234
在运用c语言编写程序时需要调用以下中断号,进行中断
然后需要将打开中断的开关打开,举个例子如果想运用定时器0进行中断的话。先要把ETO关上也就是将1赋给ETO然后把EA关上把1赋给EA,然后选择一个PTO这里没有固定的选法
以上就是单片机中断和定时的原理内容
此段代码是运用定时器0中断,先选定定时器的模式,然后给TLO,THO,赋初值,将TF0清零后然开TRO开始计时,将中断打开,ET0=1,EA=1,PT0=0,到这里定时器0初始化完成,接着运用定时器0中断号void Timer0_Routine() interrupt 1在中断里输入要完成的任务给TH0,TL0赋初值完成任务以后退出中断,继续执行其他任务。
#include
/**
* @brief 定时器0初始化,1毫秒@12.000MHz
* @param 无
* @retval 无
*/
void Timer0Init(void)
{
TMOD &= 0xF0; //设置定时器模式
TMOD |= 0x01; //设置定时器模式
TL0 = 0x18; //设置定时初值
TH0 = 0xFC; //设置定时初值
TF0 = 0; //清除TF0标志
TR0 = 1; //定时器0开始计时
ET0=1;
EA=1;
PT0=0;
}
/*定时器中断函数模板
void Timer0_Routine() interrupt 1
{
static unsigned int T0Count;
TL0 = 0x18; //设置定时初值
TH0 = 0xFC; //设置定时初值
T0Count++;
if(T0Count>=1000)
{
T0Count=0;
}
}
*/
定时器2与定时0不一样的地方就是它用的是8位重装模式所以在TH0和TL0赋值相等,然后再tmod选择上选择定时器2即可
void main()
{
TMOD|=0x02;//八位重装模块
TH0=220;
TL0=220;
TR0=1;//启动定时器0
ET0=1;//允许定时器0中断
EA=1;//总中断允许
while(1)
{
}
}