首页 > 其他分享 >C51学习归纳5 --- 定时器

C51学习归纳5 --- 定时器

时间:2024-06-06 12:32:22浏览次数:11  
标签:定时器 Hour C51 中断 模式 --- TMOD 计时器

        个人觉得定时器是一个十分重要的内容,这东西忘简单说其实就是一个计数器,从设定的初始值开始加一操作,每当计数器满了,引发一次计数器中断,芯片的CPU过来进行中断处理,然后一直重复这样的过程。替代长时间的Delay,提高CPU的运行效率和处理速度

        首先,我们来考虑第一个问题,定时器的代码如何书写?好消息!不用自己写!继续使用STC-ISP生成即可。

一、 定时器原理

        注意:定时器的资源和单片机的型号是关联在一起的,不同的型号可能会有不同的定时器个数和操作方式,但一般来说,T0和T1的操作方式是所有51单片机所共有的。

        STC89C52的T0和T1均有四种工作模式:

          模式0:13位定时器/计数器

          模式1:16位定时器/计数器(常用)

          模式2:8位自动重装模式

          模式3:两个8位计数器

        注意下图的代码

       注意:第一行AUXR用不到,可以直接删除。

        主要操作的是TMOD,TL0,TH0,TF0,TR0。我们依次学习:

1.1 T0模式1的原理图

        先看时钟部分:

        可以通过SYSclk系统时钟(就是晶振,十分稳定)进行6分频,12分频作为计数器的时间源。(c/t = 0)

        或者可以使用T0 Pin这样一个外部时钟来提供时间源。直接接在单片机的P3_4接口上。(c/t = 1)

        再看计时部分:

        因为是16BIT,所以最大存储65535。每来一次脉冲,这里的数字就会+1,直到达到我们的最大值65535时,下一个脉冲,就会溢出,使得设置标志位TF0,然后申请中断,执行终端任务。

        最后再看中断部分 

         中断源个数:8个(外部中断0、定时器0中断、外部中断1、定时器1中断、串口中断、定时器2中断、外部中断2、外部中断3).中断的资源和单片机的型号是关联在一起的,不同的型号可能会有不同的中断资源,例如中断源个数不同、中断优先级个数不同等等

        我们在定时器0的中断用到的就是,interrupt 1.

1.2 TMOD 计时器工作模式寄存器

               我们通过对TMOD进行设置,调整工作模式。

TMOD &= 0xF0;		//设置定时器模式
TMOD |= 0x01;		//设置定时器模式

        我们解读一下这个代码TMOD = 1111 0000,然后变成1111 0001。使得定时器1不工作,计时器0工作在16位的THL0+TH0模式。TL+TH有自己独立的地址,直接赋值即可。

1.3 TCON 计时器控制寄存器        

        一般不直接使用TCON控制所有寄存器,而是直接操纵位如上面代码的TF0,TR0。

二、定时器实现 -- 时钟跳动

#include <REGX52.H>
#include "Delay.h"
#include "LCD1602.h"
#include "Timer0.h"

unsigned char Sec=55,Min=59,Hour=23;

void main()
{
	LCD_Init();
	Timer0Init();
	
	LCD_ShowString(1,1,"Clock:");	//上电显示静态字符串
	LCD_ShowString(2,1,"  :  :");
	
	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 T0Count;
	TL0 = 0x18;		//设置定时初值
	TH0 = 0xFC;		//设置定时初值
	T0Count++;
	if(T0Count>=1000)	//定时器分频,1s
	{
		T0Count=0;
		Sec++;			//1秒到,Sec自增
		if(Sec>=60)
		{
			Sec=0;		//60秒到,Sec清0,Min自增
			Min++;
			if(Min>=60)
			{
				Min=0;	//60分钟到,Min清0,Hour自增
				Hour++;
				if(Hour>=24)
				{
					Hour=0;	//24小时到,Hour清0
				}
			}
		}
	}
}
void Timer0Init(void)
{
	TMOD &= 0xF0;		//设置定时器模式
	TMOD |= 0x01;		//设置定时器模式
	TL0 = 0x18;		//设置定时初值
	TH0 = 0xFC;		//设置定时初值
	TF0 = 0;		//清除TF0标志
	TR0 = 1;		//定时器0开始计时
	ET0=1;
	EA=1;
	PT0=0;
}

        这里采用了分模块编写的方式,方便以后直接进行调用,为了方便查看,我把初始化方法放在下面了。

        分析上述代码:1、我们静态显示“:”,所以放在while之外。2、在while中我们只做一件事不断刷新显示我们的数据。3、数据如何刷新?通过中断函数刷新,我们的计时器我们设置为1Mhz的频率,所以每记满1000次则是1s,所以我们在终端中每1000次加一次sec。4、注意进位,sec每60清0一次,min加一,min每60进一,hour加一,hour大于等于24则为0.

三、总结

        其实计时器的操作简单总结分为以下几步:

        1、计时器初始化,设定工作模式,设定初值,设定中断,设定使能。

        2、写计时器的中断函数,此处记得要重新给计时器赋初值,然后还可以通过for循环延长我们的计时时间

        3、写主函数逻辑

标签:定时器,Hour,C51,中断,模式,---,TMOD,计时器
From: https://blog.csdn.net/SPIRITE_SYF/article/details/139388956

相关文章

  • vue2 路由基础 -- 基础使用
    @[TOC](vue2路由(一)–基础使用)vue使用vue-router插件处理路由,路由是开发单页应用必须掌握的知识。什么是vue-router?(1)vue-router是Vue官方提供前端路由插件,借助它我们实现可以基于路由和组件的单页面应用。(2)它与传统的页面区别在于:传统的页面应用采用的是后......
  • Sz-Admin | SpringBoot3 JDK21 Vue3开源后台RBAC管理系统 | 2024年好用的开源RBAC管理
    简介接触了很多优秀的开源和闭源项目,在使用过程中也发现一些问题,不甘满足的我遂产生了想法:于是利用休息时间编写了一套后台管理系统,它灵活、简洁、高效,拥抱最新的技术,因此Sz-Admin便诞生了,也意为升职Admin,升职加薪节节高。SzAdmin,一个基于SpringBoot3、Vue3和El......
  • Python - Django - MySQL #need to add distinct() after select_related().distinct(
    所以这是ads/views.py还有ads/models.py、ads/forms、ads/urls.py和其他文件,但评分器抱怨的是这个views.py...检索到3806个HTML字符测试已完成:在页面顶部发现菜单栏搜索"HHGTTG_421717639962"时发现多个广告。您可能需要在views.py中的select_related().di......
  • 全局 type 类型的寻找 typescript 类型 - fabric.Canvas
    全局type类型的寻找typescript类型-fabric.CanvasdeclaretypeExtCanvas=fabric.Canvas&{isDragging:boolean;lastPosX:number;lastPosY:number;};这个代码没有定义fabric.Canvas,然后看看提示说在namespace定义了。这个是子项目,没有type定义,上父项......
  • SwiftUI 热门开源库推荐第1期 - 凡人程序猿 - iOS开发
    大家好,周末给大家分享几个我在用已久的GitHub开源库,这些开源库使用简单,功能强大,使用好它们能够为我们节省大量的开发时间。话不多说,直接上库。1、PopupViewgithub项目地址:https://github.com/exyte/PopupView这个开源库在GitHub上有3.2K个赞。它是一款功能全面且好用......
  • Linux 提权-Cron Jobs
    本文通过Google翻译CronJobs–LinuxPrivilegeEscalation-Juggernaut-Sec这篇文章所产生,本人仅是对机器翻译中部分表达别扭的字词进行了校正及个别注释补充。导航0前言1什么是CronJob?1.1了解Crontabs和Cron目录1.2如何在Crontab文件中读取Cron......
  • 新东方英语-《六级词汇词根+联想记忆法(乱序版)》-lrc+mp3及lrc歌词
    新东方英语-《六级词汇词根+联想记忆法(乱序版)》-lrc+mp3及lrc歌词微信读书中有相应的书,2018年版本的。  作者:俞敏洪出版社:海豚出版社出版时间:2018-01-01ISBN:9787511041296品牌方:北京新东方大愚文化传播有限公司请关注如下的微信公众号 对话框输入:六级乱......
  • python---正则表达式
    ==本章目标:1:能够知道在Python中使用正则要导入的模块;[了解]   re模块2:能够使用re模块匹配单个字符;[重点]   \d \w 正则表达式的概述:基本介绍正则表达式,也叫做规则表达式,通常会说成[正则]实际上正则表达式就是指符合一定规则的字符串,同时他能用......
  • HTML-常用标签
    HTML-常用标签1超链接标签:<ahref="..."target="...">超链接属性:href:指定资源访问的urltarget:指定在何处打开资源链接_self:默认值,在当前页面打开_blank:在空白页面打开<imgsrc="img/news_logo.png"><ahref="http://www.baidu.com/"t......
  • HTML-页面布局
    HTML-页面布局1盒子模型盒子:页面中所有的元素(标签),都可以看做是一个盒子,由盒子将页面中的元素包含在一个矩形区域内,通过盒子的视角更方便的进行页面布局盒子模型组成:内容区域(content)、内边距区域(padding)、边框区域(border)、外边距区域(margin)盒子的大小,其实就包括三个部分:bo......