定时器
7.1定时器
1.定时器的介绍
定时器的介绍:51单片机的定时器属于单片机的内部资源,其他路的连接和运转均在单片机内部完成
定时器的作用:
(1)用于计时系统,可实现软件计时,或者使得程序每隔一固定时间完成一项操作
(2)代替长时间的Delay,提高CPU的运行效率和处理速度
2.STC89C52定时器资源
定时器个数:三个(T0,T1,T2)
3.定时器的框图
4.定时器的工作模式
STC89C52的T0和T1均有四种工作模式:
模式0:13位定时器/计数器
模式1:16位定时器/计数器(常用)
模式2:8位自动重装模式
模式3:两个8位计数器
工作模式1框图:
5.中断系统
中断系统是为使CPU具有对外界紧急事件的实时处理能力而设置的。
当中央处理机CPU正在处理某件事的时候外界发生了紧急事件请求,要求CPU暂停当前的工作,转而去处理这个紧急事件,处理完以后,再回到原来被中断的地方,继续原来的工作,这样的过程称为中断。实现这种功能的部件称为中断系统,请示CPU中断的请求源称为中断源。微型机的中断系统一般允许多个中断源,当几个中断源同时向CPU请求中断,要求为它服务的时候,这就存在CPU优先响应哪一个中断源请求的问题。通常根据中断源的轻重缓急排队,优先处理最紧急事件的中断请求源,即规定每一个中断源有一个优先级别。CPU总是先响应优先级别最高的中断请求。
当CPU正在处理一个中断源请求的时候(执行相应的中断服务程序),发生了另外一个优先级比它还高的中断源请求。如果CPU能够暂停对原来中断源的服务程序,转而去处理优先级更高的中断请求源,处理完以后,再回到原低级中断服务程序,这样的过程称为中断嵌套。这样的中断系统称为多级中断系统,没有中断嵌套功能的中断系统称为单级中断系统。
6.定时器的相关寄存器
7.定时器控制流水灯程序
功能:用定时器来控制流水灯的方向
工程目录
Key()函数程序
#include <REGX52.H>
#include "Delay.h"
unsigned char Key()
{
unsigned char KeyNumber=0;
if(P3_1==0){Delay(20);while(P3_1==0);Delay(20);KeyNumber=1;}
if(P3_0==0){Delay(20);while(P3_0==0);Delay(20);KeyNumber=2;}
if(P3_2==0){Delay(20);while(P3_2==0);Delay(20);KeyNumber=3;}
if(P3_3==0){Delay(20);while(P3_3==0);Delay(20);KeyNumber=4;}
return KeyNumber;
}
//1.Key()是有返回值的,定义的都是无字符变量
main()函数程序
#include <REGX52.H>
#include "Timer0.h"
#include "Key.h"
#include "INTRINS.H"
unsigned char KeyNum,LEDMode;
void main()
{
Timer0_Init();
P2=0xFE;
while(1)
{
KeyNum=Key();
if(KeyNum)
{
if(KeyNum==1)
{
LEDMode++;
if(LEDMode>=2)LEDMode=0;//控制LED左移还是右移
}
}
}
}
void Timer0_Routine() interrupt 1
{
static unsigned int Count;
TL0 = 0x66;
TH0 = 0xFC;
Count++;
if(Count>=500)
{
Count=0;
if(LEDMode==0)
P2=_crol_(P2,1);
if(LEDMode==1)
P2=_cror_(P2,1);
}
}
定时器Timer0()函数程序,此程序可以在STC软件生成
#include <REGX52.H>
/**
* @brief 定时器0工作模式一的寄存器设置
* @param 无
* @retval 无
*/
void Timer0_Init(void)
{
TMOD &= 0xF0; //设置定时器模式
TMOD |= 0x01; //设置定时器模式
TL0 = 0x66; //设置定时初始值
TH0 = 0xFC; //设置定时初始值
TF0 = 0; //清除TF0标志
TR0 = 1; //定时器0开始计时
EA=1;
ET0=1;
PT0=0;
}
7.2定时器时钟
1.定时器控制流水灯程序
功能:实现时钟计时的效果
main()函数程序
#include <REGX52.H>
#include "LCD1602.h"
#include "Timer0.h"
unsigned char Sec=55,Min=59,Hour=23;
void main()
{
LCD_Init();
LCD_ShowString(1,1,"Clock:");
LCD_ShowString(2,1," : :");
Timer0_Init();
while(1)
{
LCD_ShowNum(2,1,Hour,2);
LCD_ShowNum(2,4,Min,2);
LCD_ShowNum(2,7,Sec,2);
}
}
void Timer0_Routine() interrupt 1
{
static unsigned int Count;
TL0 = 0x66;
TH0 = 0xFC;
Count++;
if(Count>=500)
{
Count=0;
Sec++;
if(Sec>=60)
{
Sec=0;
Min++;
if(Min>=60)
{
Min=0;
Hour++;
if(Hour>=24)
{
Hour=0;
}
}
}
}
}
反思:定时器的内容比较多,难度也升级了,看了两遍的视频才基本理解定时器,还是得多看多练。