单片机学习(8)--定时器

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;
				}
			}
		}
		
	}
}

反思:定时器的内容比较多,难度也升级了,看了两遍的视频才基本理解定时器,还是得多看多练。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值