定时器中断学习和简单应用

定时器中断&简单应用

  • 定时器中断
      • 基本介绍
        • 清楚明白
        • 工作原理
        • 定时器结构
      • 主要内容
        • 两个寄存器
        • 初始化程序
  • 简单应用-秒表
      • 基本功能
      • 代码详解

  • 彩蛋:对于独立按键的使用
  • 没啥硬核内容,就是初学者萌新入门,学长大佬请移步

定时器中断

基本介绍

清楚明白

  • 定时器和单片机的CPU是相互独立的。定时器/计数器工作的过程是自动完成的,不需要CPU的参与。
  • 51单片机中的定时器/计数器是根据机器内部的时钟或者是外部的脉冲信号对寄存器中的数据**+1**.
  • 有了定时器/计数器后,可以增加单片机的效率,一些简单重复加1的工作可以交给定时器/计数器去处理。CPU转而处理一些复杂的事情。同时可以实现精确定时作用。
    -本次使用定时器,并用外部的脉冲信号+1

工作原理

定时器实质上是一个+1计数器。它随着计数器的输入脉冲进行自加1,也就是每来一个脉冲,计数器就自动+1,当加到计数器为全1时,再输入一个脉冲就使计数器归零(下文有实例,如果最大装15,此时要再+1达到”16“才归零),且计数器的溢出使相应的中断标志位置1,向CPU发出中断请求(中断允许时)。

定时器结构

定时器的实质是加1计数器(16位),由高8位和低8位两个寄存器THX和TLX组成。TMOD是定时器的工作方式寄存器,确定工作方式和功能;TCON是控制寄存器,控制T0、T1的启动和停止及设置溢出标志。

主要内容

两个寄存器

  • 相当于你给了几个按钮,让它服从你的指令去采用不同方式完成你的要求。
    1,工作方式寄存器TMOD
    因为触发条件和精确读的要求,所以要选择相适应的工作方式。
    在这里插入图片描述
  • 显而易见8个各自分成两组,下面分别介绍一下每组内容
    1.第一个是门控位
GATE启动定时器工作条件
=0TCON的TR0/1=1
=1TCON的TR0/1=1&&外部中断引脚INT0/1=1

-可以看出=0的条件要少一点
2.
C/T:定时/计数模式选择位。 C/T=0为定时模式;C/T=1为计数模式
3.
M1M0工作方式设置位(一个四种)

M1M0工作方式说明
00方式013位定时器
01方式116位定时器
10方式28位自动重装定时器
11方式3T0分为两个独立的8位计时器;T1停止计数
  1. 控制寄存器TCON
  • 低四位用于控制外部中断(在这里不介绍),高四位控制定时/计数的启动和中断申请。
    在这里插入图片描述
  • TR1:T1运行控制位。置1时,T1开始工作;置0时,T1停止工作。
  • TR0:T0控制位,同上。
  1. 重点介绍方式1
    位数为16位,
    TL0作为低8位TH0作为高8位
    组成了16位+1计数器。
    计数个数与计数初值的关系为:X=2^16-N在这里插入图片描述

-看着花里胡哨,但是不用仔细看懂

初始化程序

  • 对TMOD赋值,以确定T0和T1的工作方式
  • 计算初值,并将其写入TH0、TL0或者TH1、TL1
  • 中断方式时,对EA赋值,开放定时器中断
  • 使TR0或者TR1置位,启动定时器定时
  • 关于服务函数,[上篇博客](这里用interrupt 1||3)(https://blog.csdn.net/weixin_45779702/article/details/103681485)有讲过,再提一次
    在这里插入图片描述

简单应用-秒表

在这里插入图片描述

基本功能

  • 按键S1开始计时
  • 按键S2停止计时
  • 按键S3数据归零

代码详解

#include <reg52.h>
#define uint unsigned int						  //对数据类型进行声明定义
#define uchar unsigned char
/*位定义*/
sbit LSA = P2^2;				 //138芯片A2引脚
sbit LSB = P2^3;				 //138芯片A1引脚
sbit LSC = P2^4;				 //138芯片A0引脚
/*全局变量&&数组*/
uchar DT_SECOND = 0;				 //秒计时
uchar DT_MINUTE = 0;				 //分计时uchar code duan[] = {0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};             //共阴数码管无小数点 显示0~9,十分位,百分位,十位
uchar code duanpoint[] = {0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef};        //个位 //共阴数码管有小数点 显示0~9/*函数部分*///延时1ms函数
void delay1ms(uint t)
{uint i,j;for(i=0;i<t;i++){for(j=0;j<100;j++);	}
}
//中断函数,初始化
void Timer0Init()
{TMOD = 0x01; 		//选择T0定时/计数器,工作在方式1,16位计数器		TH0 = 0xFC;	        //计数初始值,计数从64536开始,计1000个数,完成一次计数,时间为1msTL0 = 0x18;		    //65536-1000/256;(65536-1000)%256-->数制知识ET0 = 1;			//定时/计数器0中断允许位EA = 1;				//总中断开启
}
//独立按键S3函数
void S3()
{DT_SECOND = 0;			//秒归零DT_MINUTE = 0;			//分归零TR0 = 0;			//运行控制位清0,关闭定时器
}//和运算判断键值
void ScanKey()
{uchar Key;                   //临时变量Key = P3&0x07;	   //只需要三个按键,分别接的P3^1,P3^2,P3^3,故把P3高五位被屏蔽if(Key!=0x07)	   //判断哪个键被按下{delay1ms(10);	 //消抖10msKey = P3&0x07;	 //再次赋值,避免此时按键状态改变if(Key!=0x07)	 //确认按键被按下{switch(Key){case 0x05:				  //S1(P3^1)被按下101TR0 = 1;	  //定时器0运行控制位为1,启动定时器0break;case 0x06:				  //S2(P3^0)被按下110TR0 = 0;	  //定时器0运行控制位为0,关闭定时器0break;case 0x03:				  //S3(P3^2)被按下011S3();break;}}while(Key!=0x07)		//松手检测{Key = P3&0x07;}}}//数码管动态扫描函数
void DigDisplay(uchar s,uchar min)                //数码管从右往左
{LSA = 0;			       //秒个位位选LSB = 0;LSC = 0;P0 = duan[s%10];		      //发送段码,显示秒个位delay1ms(5);	                       //间隔一段时间扫描LSA = 1;			      //秒十位位选 LSB = 0;LSC = 0;P0 = duan[s/10];		       //发送段码显示秒十位delay1ms(5);			  //间隔一段时间扫描LSA = 0;			  //分的个位位选LSB = 1;LSC = 0;P0 = duanpoint[min%10];		  //发送段码,显示分的个位delay1ms(5);			  //间隔一段时间扫描LSA = 1;			  //分的十位位选LSB = 1;			  //间隔一段时间扫描LSC = 0;P0 = duan[min/10];		  //发送段码,显示分的十位delay1ms(5);			  //间隔一段时间扫描P0 = 0x00;				  //消隐,清除已有数据
}//主函数咯
void main(void)
{P0 = 0x00;		   //读端口前写1P3 = 0xFF;		   //读端口前写1Timer0Init();	  //定时器中断初始化函数while(1){DigDisplay(DT_SECOND,DT_MINUTE);	   //数码管显示函数ScanKey();		  //按键扫描函数}
}//服务函数咯
void Timer0() interrupt 1
{static uint count_s;	static uint count_min;		//采用静态变量,不用赋初值0TH0 = 0xFC;				    //计数值初始化(1s计时是连续的下一次还得使),从64536开始计数,计满时为65536,溢出时即为 1msTL0 = 0x18;count_s++;				     //秒计数count_min++;				 //分计数if(count_s==1000)			 //计数到1s(1000*1ms)时,秒计数器开始工作{count_s = 0;		 //秒计数清零DT_SECOND++;			 //显示秒计数值自增if(DT_SECOND>59)		 //秒数最大为59{DT_SECOND = 0;}}if(count_min==60000)		  //计数到60000ms时,秒计数器开始工作{count_min = 0;		  //分计数清零DT_MINUTE++;				  //显示分计数值自增if(DT_MINUTE>59)			  //分数最大为59{DT_MINUTE = 0;}}
}
  • 详解
  1. 动态数码管(共阴)
    在这里插入图片描述
  • 先说段选,就是让这个8.亮出什么数字的模样
    例如显示0.,就得让图中的A,B,C,D,E,F,DP亮起来,需要用八个二进制数,1是亮,0是不亮,而且A是八位的最右端,所以就是1011 1111,这样对于的两个十六进制就是0XBF.
  • 再说位选,一般开发板是八个数码管,通过芯片74HC245来打开某一数码管的点亮权限。这样由LSA,LSB,LSC来判断,开3个二进制位,正好控制八个数码管。例如,秒表的秒百分位,也就是显示的最右一位,对应的是000,也就是八个数码管最右边那一个(顺序是从右往左)。(放个图大家感受一下)
  • 这里因为有四位,其中第二位(左起)带有小数点,所以它的数组库不太一样(duanpoint)。
    在这里插入图片描述
  1. 初始化和服务函数对1s的计时
  • 晶振是12KHZ
  • 初始化的TMOD是0x01,也就是门控位为0,T0运行控制位,定时模式,工作方式为1.
  • 初始化那里是FC18,对应的十进制也就是2^16(65536)-1000,实现脉冲1000次。16个二进制位其实是2 ^16-1,但是由溢出一词,就像水缸的水一样将将满,还没有满,所以再加一滴才算满。
  • 初始化实现了1000*1us也就是1ms,在服务函数中循环1000次,最终也就是1s。当然我们也可以改变初始化和循环的搭配实现1s的计时,这样做只是一定程度上提高了计时上限和降低一定误差罢了。
  1. 独立按键判断键值
    按常规我们可以通过位定义,消抖来判断哪个按键被按下,但是这里采用和运算。
    我们通过KEY=0X07(0000 0111),由于上拉电阻所以独立按键均置高电平,在按下之后变低电平。然后我们观察四个按键相应的引脚顺序。K2–1,K1–2,K3–3,K4–4(K4用不到)。
    然后按照此规律,当K1被按下,也就是第二位变0,即0000 0101=0x05。
    在这里插入图片描述
  2. 计时
    这里其实蛮好理解了,对应的count_s相当于星际争霸的scv一样,搬运工干活的,而DT_second就是外显在动态(DT)数码管上的,一个主内一个主外。
  3. 如有不懂欢迎私信

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/1621048.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

自学HarmonyOS应用开发(62)- 使用对象关系映射数据库保存设定信息

除了地图数据&#xff0c;秒表应用还有一些其他希望保存的数据&#xff0c;例如上次定位的位置&#xff0c;地图画面的缩放比例等。本文介绍通过对象关系映射数据库技术保存这些信息的方法。 通用的设定信息表 下面的代码定义了用于保存设定信息的通用的表结构&#xff1a; E…

Git企业开发控制理论和实操-从入门到深入(七)|企业级开发模型

前言 那么这里博主先安利一些干货满满的专栏了&#xff01; 首先是博主的高质量博客的汇总&#xff0c;这个专栏里面的博客&#xff0c;都是博主最最用心写的一部分&#xff0c;干货满满&#xff0c;希望对大家有帮助。 高质量博客汇总 然后就是博主最近最花时间的一个专栏…

模2运算规则

模2加法 模2加法没有进位&#xff0c;等同于异或运算。一位数的模2加法规则如下&#xff1a; 0 0 0 0 1 1 1 0 1 1 1 0 多位数的模2加法中&#xff0c;每一位都按照上面的规则进行&#xff0c;例如: 当多个数相加&#xff0c;对应位置上如果有偶数个1&#xff0c;…

知识图谱实战应用25-基于py2neo的超市商品的图谱构建与商品推荐系统的实现

大家好,我是微学AI,今天给大家介绍一下知识图谱实战应用25-基于py2neo的超市商品的图谱构建与商品推荐系统的实现,本篇文章,我将指导大家如何使用py2neo和Neo4j构建一个实用的超市商品知识图谱和推荐系统。该系统可以帮助用户快速找到感兴趣的商品,并提供个性化的推荐服务…

pygame实现物体运动拖尾尾迹

文章目录 前言主要内容讲解&#xff1a;代码 总结更多宝藏 前言 &#x1f60e;&#x1f973;&#x1f60e;&#x1f920;&#x1f916;&#x1f648;&#x1f4ad;&#x1f373;&#x1f371; 本文我们来讲一下如何使用pygame实现一个拖尾特效。 主要内容 &#x1f99e;&am…

pe_xscan 增加 O31 项

O31项 对应的项目&#xff1a; 开机、关机脚本 用户登录、注销脚本

LeetCode第1~5题解

CONTENTS LeetCode 1. 两数之和LeetCode 2. 两数相加LeetCode 3. 无重复字符的最长子串 LeetCode 1. 两数之和 【题目描述】 给定一个整数数组 nums 和一个整数目标值 target&#xff0c;请你在该数组中找出和为目标值 target 的那两个整数&#xff0c;并返回它们的数组下标。…

linux下运行win10效果好不好,Win10不好用?继续坚守Win7的人依然巨多

前不久&#xff0c;微软发布消息称Windows 10操作系统市场占有率终于突破50%。而近日&#xff0c;安全厂商卡巴斯基发布的8月下旬最新研究报告也印证了这一点&#xff0c;并且从数据来看&#xff0c;Windows 10系统的占有率还有小幅度的增长&#xff0c;达到了53%左右。 退休时…

其实win10要比win7的安全性强很多

随着win10系统的一步步更新&#xff0c;用户体验度也越来越好&#xff0c;更多的用户也换了win10的系统&#xff0c;但还是有一部分用户依然雷打不动的信任着win7。下面小编来分析一下win7和win10到底有着怎样的差别&#xff0c;相信看完下文&#xff0c;你也会想升级win10系统…

W7-2495X参数 至强W72495X功耗

W7-2495X采用10纳米工艺二十核心四十线程CPU主频 2.6GHz动态加速频率 4.8GHz 热设计功耗(TDP) 225W支持最大内存容量 2TB内存类型 DDR5 4800MHz W7-2495X性能怎么样这些点很重要 http://www.adiannao.cn/du

电脑装了w10没有w7流畅怎么办?

如果我们对自己的电脑进行了系统的重装&#xff0c;在电脑装了win10系统之后发现没有win7流畅的话&#xff0c;很多小伙伴不知道是什么情况应该怎么解决。 那么据微点阅读小编所知可能是我们电脑硬件设施的不兼容所导致的。我们可以在官网上查看win10系统的配置要求是否符合自…

W7-2475X参数 至强W72475X功耗

W7-2475X采用10纳米制作工艺二十核心四十线程CPU主频 2.6GHz动态加速频率 4.8GHz 热设计功耗(TDP) 225W支持最大内存容量 2TB内存类型 DDR5 4800MHz W7-2475X性能怎么样这些点很重要 http://www.adiannao.cn/du

Intel 至强 W7-3465X参数 W73465X功耗

至强 W7-3465X采用10纳米 制作工艺 二十八核心五十六线程CPU主频 2.5GHz动态加速频率 4.8GHz热设计功耗(TDP) 300W支持最大内存容量 4TB 内存类型 DDR5 4800MHz W7-3465X性能怎么样这些点很重要 http://www.adiannao.cn/du

五类造成Windows 7假死的原因及处理

Windows 7虽好&#xff0c;可是小问题不断。从Beta版本至今&#xff0c;很多朋友遇到最严重的问题就是资源管理器偶尔或者经常失去响应&#xff0c;虽然不是什么非重装的问题&#xff0c;但是时不时电脑卡上一段时间&#xff0c;谁都觉得很烦。那么到底Windows 7在哪些情况下会…

高傲的win7

高傲的win7 首先为win7证明&#xff1a;本文内容和本人下载的系统版本以及硬件细节有关&#xff0c;并不能代表所有的win7种族。 好久没有写博客了&#xff0c;主要是因为把很多东西都记录在笔记里边了&#xff0c;但是感觉写博客和笔记还是不太一样&#xff0c;笔记就是随时…

我对windows7简单评论

10月25日受朋友的邀请参加了弘博软件教育学院成功举办的windows 7发布会 发现不止是我一个对windows 7偏爱有加。这里这里在座师生也是windows7 的粉丝。 windows 7发布会一次又一次的成举办功也源于它独特的性能&#xff0c;带给我们的方便、快捷。 经过我近一个月的使用&…

09年IT界最愚蠢的九件事 Windows7精简版UAC上榜(转)

据国外媒体报道&#xff0c;临近岁末&#xff0c;资讯网站eWeek于上周评出了《九款年度重磅产品》。无独有偶&#xff0c;该网站此番又评选出2009年度最不受用户欢迎的九大事件&#xff1a; 1、亚马逊删书门 今年七月份&#xff0c;在线销售巨人亚马逊&#xff08;Amazon&…

历经十年,还有一个月,Windows 7 生命周期将结束,相信很多人还是觉得win7不错的

距离 Microsoft 终止对 Windows 7 的支持只剩一个月的时间了,到 2020 年 1 月 14 日,这款经典的操作系统就要和大家 say goodbye 了。 2009 年 7 月 4 日,Windows 7 正式开发完成,到现在已经整整 10 岁。它在 Vista 前辈的基础上发展而来,界面友好,功能强大,使用高效,因…

服务器装系统步骤图解win7,w7系统重装步骤是怎样的|w7重装系统教程图解

w7系统是当前最稳定&#xff0c;也是最主流的系统&#xff0c;不过w7系统在使用过程也会出现系统故障&#xff0c;有些甚至出现系统崩溃不能启动的问题&#xff0c;这时候就需要重装系统&#xff0c;那么w7系统重装步骤是怎样的呢&#xff1f;w7重装系统一般有三种方式&#xf…

基于阿基米德优化算法优化的BP神经网络(预测应用) - 附代码

基于阿基米德优化算法优化的BP神经网络&#xff08;预测应用&#xff09; - 附代码 文章目录 基于阿基米德优化算法优化的BP神经网络&#xff08;预测应用&#xff09; - 附代码1.数据介绍2.阿基米德优化优化BP神经网络2.1 BP神经网络参数设置2.2 阿基米德优化算法应用 4.测试结…