8.定时器

定时器

概述:

  1. 定时器介绍:51单片机的定时器属于单片机的内部资源,其电路的连接和运转均在单片机内部完成
  2. •定时器在单片机内部就像一个小闹钟一样,根据时钟的输出信号,每隔“一秒”,计数单元的数值就增加一,当计数单元数值增加到“设定的闹钟提醒时间”时,计数单元就会向中断系统发出中断申请,产生“响铃提醒”,使程序跳转到中断服务函数中执行
  3. STC89C52定时器资源:
    1. 定时器个数:3个(T0、T1、T2),T0和T1与传统的51单片机兼容,T2是此型号单片机增加的资源
    2. 注意:定时器的资源和单片机的型号是关联在一起的,不同的型号可能会有不同的定时器个数和操作方式,但一般来说,T0和T1的操作方式是所有51单片机所共有的

作用:

  • 用于计时系统,可实现软件计时,或者使程序每隔一固定时间完成一项操作
  • 替代长时间的Delay,提高CPU的运行效率和处理速度
  • 计数器(TH0(高八位),TL0(低八位))一共能计时0~65535 ,一次1us,一共65535us,若计时1ms,赋初始值为64535,离结束1ms

中断系统

概述:

  • 中断源个数:8个(外部中断0、定时器0中断、外部中断1、定时器1中断、串口中断、定时器2中断、外部中断2、外部中断3)

  • 中断优先级个数:4个

  • 中断号:在这里插入图片描述

  • 注意:中断的资源和单片机的型号是关联在一起的,不同的型号可能会有不同的中断资源,例如中断源个数不同、中断优先级个数不同等等

使用

在这里插入图片描述

自动生成定时器初始化:

void Timer0Init()		//1毫秒@12.000MHz
{
	//AUXR &= 0x7F;		//定时器时钟12T模式,这个删除不要
	TMOD &= 0xF0;		//设置定时器模式
	TL0 = 0x18;		//设置定时初始值
	TH0 = 0xFC;		//设置定时初始值
	TF0 = 0;		//清除TF0标志
	TR0 = 1;		//定时器0开始计时
	//中断,这几个后面自己添加
	ET0=1;
	EA=1;
	PT0=0; //中断优先级 0:低优先级; 1:高优先级
}

定时器应用:

#ifndef __TIMER0_H__
#define __TIMER0_H__
void Timer0Init();
#endif
#include <REGX52.H>
/**
  * @brief  定时器0初始化 1毫秒@12.000MHz
  * @param  无
  * @retval 无
  */
void Timer0Init()		//1毫秒@12.000MHz
{

	TMOD &= 0xF0;		//设置定时器模式
	TL0 = 0x18;		//设置定时初始值
	TH0 = 0xFC;		//设置定时初始值
	TF0 = 0;		//清除TF0标志
	TR0 = 1;		//定时器0开始计时
	//中断
	ET0=1;
	EA=1;
	PT0=0; //中断优先级 0:低优先级; 1:高优先级
}
/**
//定时器函数模板(1s)
void Timer0_Routine() interrupt 1
{		
		static unsigned int T0Count;
		TL0 = 0x18;	
		TH0 = 0xFC;
		T0Count++;
		if(T0Count >= 1000){
				T0Count=0;
		}
}
**/
#include <REGX52.H>
#include "Timer0.h"



void main(){

	Timer0Init();	
	while (1)
	{
		
	}
}
void Timer0_Routine() interrupt 1
{		
		static unsigned int T0Count;
		TL0 = 0x18;	
		TH0 = 0xFC;
		T0Count++;
		if(T0Count >= 1000){
			T0Count=0;
			P2_0 =~ P2_0;	
		}
}

流水灯(按键控制LED流水灯左右移动)

#include "INTRINS.H" //数学函数
extern unsigned char _crol_    (unsigned char, unsigned char);//左移一位
extern unsigned char _cror_    (unsigned char, unsigned char);//右移一位
特殊之处:比如a = 0x01; a = _cror_(a,1); 他到a = 0x80 之后直接变成 a = 0x01;

main

#include <REGX52.H>
#include "Timer0.h"
#include "Key.h"
#include "INTRINS.H" //常用函数

unsigned char KeyNum, LEDMode;
void main(){

	P2=0xFE;
	Timer0Init();	
	while (1)
	{
		KeyNum = Key();
		if(KeyNum != 0)
		{
			if(KeyNum == 1)
			{
				LEDMode++;
				if(LEDMode > 1)LEDMode=0;
			
			}
		}
		
	}
}

void Timer0_Routine() interrupt 1
{		
		static unsigned int T0Count;
		TL0 = 0x18;	
		TH0 = 0xFC;
		T0Count++;
		if(T0Count >= 5000){
			T0Count=0;
			if(LEDMode==0)P2=_crol_(P2,1);
			if(LEDMode==1)P2=_cror_(P2,1);
			
		}
}

按键

#ifndef __KEY_H__
#define __KEY_H__
unsigned char Key();
#endif
#include <REGX52.H>
#include "Delay.h"
/**
  * @brief  获取独立按键键码
  * @param  无
  * @retval 按下按键的键码,范围1~4,无按下为0
  */
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;
}

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

}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
实验报告:定时器实验 1. 实验要求 本次实验的目的是完成一个简单的秒表,通过定时器实现精准计时,并通过数码管进行显示。 2. 定时器原理 定时器是一种常见的计时电路,通过定时器芯片的内部计数器和时钟信号来实现计时功能。本实验中使用的是STC89C52单片机内部的定时器模块,包含一个16位的计数器和一个可编程的预分频器,可以通过软件设置计数器的初始值和计数模式,并通过外部时钟信号控制计数器的计数速度。 电路图连线说明: 本次实验需要连接以下几个模块: 1)STC89C52单片机; 2)数码管; 3)按键; 4)晶振电路。 具体连线如下: 1)将晶振电路连接到单片机的XTAL1和XTAL2引脚; 2)将数码管连接到单片机的P0口; 3)将按键连接到单片机的P3.2口。 3. 定时器初始化程序分析 定时器的初始化程序如下: ``` void Timer0Init() { TMOD |= 0x01; //选择为定时器0模式,工作方式1,仅用TR0打开启动计数 TH0 = 0xFC; //给定时器赋初值,定时1ms TL0 = 0x18; ET0 = 1; //打开定时器0中断允许 TR0 = 1; //打开定时器0开关,开始计时 } ``` 定时时间的确定通过给定时器的初值来实现,本实验中初值为0xFC18,表示定时1ms。 4. 数码管显示,走时程序分析 数码管的显示和走时程序如下: ``` void Display(unsigned char num[]) //数码管显示函数 { unsigned char i; for (i = 0; i < 8; i++) { P0 = num[i]; Delay(5); P0 = 0x00; //消隐 } } void Time0() interrupt 1 //定时器0中断服务函数 { TH0 = 0xFC; //给定时器赋初值,定时1ms TL0 = 0x18; ms++; //ms加1 if (ms == 1000) //1s { ms = 0; s++; if (s == 60) //1min { s = 0; m++; if (m == 60) //1hour { m = 0; } } } Display(num); //数码管显示当前时间 } ``` 在定时器0的中断服务函数中,每隔1ms就会将ms加1,当ms累计到1000时,即1s时,将s加1,并判断是否达到1min,1hour的计时要求,最后通过数码管显示当前时间。 5. 实验现象 经过实验,定时器的计时精度较高,可以实现秒表的计时功能,并通过数码管进行清晰的显示。 6. 心得体会 通过本次实验,我了解了定时器的原理和使用方法,学习了如何通过单片机实现计时功能,同时也体验到了调试程序的过程中需要耐心和细心,对于代码的每一个细节都要进行仔细的分析和测试,才能保证程序的正确性和稳定性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值