单片机基础知识 06 (中断-2)

news2024/9/23 19:26:51

一. 定时器中断概念

51单片机的内部有两个16位可编程的定时器/计数器,即定时器T0和定时器T1。
52单片机内部多一个T2定时器/计数器。

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

加1计数器输入的计数脉冲有两个来源,一个由系统的时钟振荡器输出脉冲经12分频后送来;另一个是T0或T1引脚输入的外部脉冲源,每来一个脉冲计数器加1,当加到计数器全为1时,再输入一个脉冲就使计数器回零,且计数器的溢出使TCON寄存器中TF0或TF1置1,向CPU发出中断请求(定时器/计数器中断允许时)。

因此,溢出时计数器的值减去计数初值才是加1计数器的计数值。

设置为定时器模式时,加1计数器是对内部机器周期计数(1个机器周期等于12个振荡周期,即计数频率为晶振频率的1/12)。计数值N乘以机器周期Tcy就是定时时间t。

设置为计数器模式时,外部事件计数脉冲由T0或T1引脚输入到计数器。在每个机器周期的S5P2期间采样T0,T1引脚电平。当某周期采样到一高电平输入,而下一周期又采样到一低电平时,则计数器加1,更新的计数值在下一机器周期的S3P1期间装入计数器。由于检测一个从1到0的下降沿需要2个机器周期,因此要求被采样的电平至少要维持一个周期。当晶振频率为12MHz时,最高计数频率不超过1/2MHz,即计数脉冲的周期要大于2us。

二. 定时器/计数器工作方式寄存器TMOD

TMOD在特殊功能寄存器中,字节地址为89H,不能位寻址。
TMOD用来确定定时器的工作方式及功能选择,单片机复位时TMOD全部被清0。
在这里插入图片描述
在这里插入图片描述

三. 定时器/计数器控制寄存器TCON

TCON在在特殊功能寄存器中,字节地址为88H,可位寻址。
TCON用来控制定时器的启,停,标志定时器溢出和中断情况。单片机复位时TMOD全部被清0。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
由上可知,每个定时器都有4种工作方式,可通过设置TMOD寄存器中的M1M0位来进行工作方式选择。

四. 计算定时器的初值

定时器一旦启动,它便在原来的数值上开始加1计数,若在程序开始时,我们没有设置TH0和TL0,它们的默认值都是0,假设时钟频率为12MHz,12个时钟周期为1个机器周期,那么此时机器周期就是1us,计满TH0和TL0就需要2^16-1个数,再来一个脉冲计数器溢出,随机向CPU申请中断。因此溢出一次共需65536us,约等于65.5ms。

如果我们要定时50ms的话,就需要给TH0和TL0装一个初值,在这个初值的基础上计50000个数后,定时器中断,此时刚好就是50ms中断一次,当需要定时1s时,我们写程序时当产生20次50ms中断后便认为是1s。

要计50000个数时,TH0和TL0中应该装入的总数是65536-50000=15536,把15536对256求模:
15536/256=60装入TH0中,把15536对256取余:15536%256=176装入TL0中。

总结如下:
当用定时器的方式1时,设机器周期为Tcy,定时器产生一次中断的时间为t,那么需要计数的个数N=t/Tcy,装入THX和TLX中的数分别为:
THX=(65536-N)/256,TLX=(65536-N)%256

五. 中断服务程序的写法

C51的中断服务函数格式如下:
void 函数名()interrupt 中断号 using 工作组
{
中断服务程序内容
}

中断函数不能返回任何值,所以最前面用void;后面紧跟函数名,名字可以随便起,但是不要与C语言中的关键字相同;中断函数不带任何参数,所以函数名后的小括号内为空;中断号是指单片机中几个中断源的序号,这个序号是编译器识别不同中断的唯一符号;最后的“using工作组”是指这个中断函数使用单片机内存中4组工作寄存器中的哪一组,C51编译器在编译程序时会自动分配工作组,因此此句通常省略。

举例:利用定时器0工作方式1,实现一个发光管以1s亮灭闪烁

#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit led = P1^0;
uchar num;

void main()
{
	TMOD=0x01;   //设置定时器0为工作方式1(M1M0为01)
	TH0=(65536-45872)/256; //装初值11.0592M晶振定时50ms数为45872
	TL0=(65536-45872)%256;
	EA=1; //开总中断
	ET0=1;//开定时器0中断
	TR0=1; //启动定时器0
	while(1) 
	{
		if(20 == num)
		{
			num=0;
			led1=~led1; 
		}
	}
}

void T0_time()interrupt 1
{
	TH0=(65536-45872)/256; //重装初值
	TL0=(65536-45872)%256;
	num++;
}

注意:一般在中断服务程序中不要写过多的处理语句,因为如果语句过多,中断服务程序中的代码还未执行完毕,而下一次中断又来临,这样我们就会丢失这次中断。因此,能在主程序完成的功能就不要在中断函数中写。

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

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

相关文章

算法通过村第四关-栈白银笔记|手写栈操作

文章目录 前言1. 栈的基础概要1.1 栈的特征1.2 栈的操作1.3 Java中的栈 2. 栈的实现&#xff08;手写栈&#xff09;2.1 基于数组实现2.2 基于链表实现2.3 基于LinkedList实现 总结 前言 提示&#xff1a;我自己一个人的感觉很好 我并不想要拥有你 除非你比我的独处更加宜人 --…

2023年6月GESP C++ 四级试卷解析

一、单选题&#xff08;每题2分&#xff0c;共30分&#xff09; 1.高级语言编写的程序需要经过以下&#xff08; &#xff09;操作&#xff0c;可以生成在计算机上运行的可执行代码。 A.编辑 B.保存 C.调试 D.编译 【答案】D 【考纲知识点】编程环境(一级) 【解析】本题…

MVSNet 代码注释版 下载 (pytorch版)(注释非常详细,较源码结构有调整,使用起来更方便)

MVSNet 代码注释版 下载 &#xff08;注释非常详细&#xff0c;代码结构有所调整&#xff0c;使用起来更方便&#xff09; 本代码不仅进行了详细注释&#xff0c;还对源码做了相应调整&#xff0c;可以更方便用户使用&#xff0c; 结构上&#xff0c;更加清晰&#xff1b; 代…

docker,nvidia-docker安装

卸载先前的docker Docker 的旧版本被称为 docker&#xff0c;docker.io 或 docker-engine 。如果已安装&#xff0c;请卸载它们&#xff1a; sudo apt-get remove docker docker-engine docker.io containerd runc使用 Docker 仓库进行安装 设置仓库 更新 apt 包索引 sudo…

【vue2-helper插件】提供Mixins和组件库相关的类型提示、智能补全、跳转等功能~

Vue2-helper - 为你的 Vue2 开发增添智慧 ✨ &#x1f680; 辅助Vue2开发中的Mixins、组件库、Vue-router的智能补全、语义高亮、跳转支持、Hover 提示等&#xff0c;提升Vue2开发体验。 功能特色 ✨ ✅ 配置式缓存设计&#xff1a;秒级切换体验&#xff0c;让开发如丝般顺滑…

算法通关村——解析堆在数组和链表的应用

1. 堆 1.1 什么是堆&#xff1f; 堆是将一组数据以完全二叉树的形式存储在数组里面。一般有大根堆和小根堆。 小根堆&#xff1a;任意节点的值小于等于它的左右孩子&#xff0c;最小值在堆顶。 大根堆&#xff1a;任意节点的值大于等于它的左右还是&#xff0c;最大值在堆顶。…

应用TortoiseSVN的SubWCRev管理VisualStudio C#项目编译版本号

1、拷贝Porperties目录下的文件AssemblyInfo.cs生成副本AssemblyInfo.template.cs, 作为版本管理的模板文件。 2、修改模板文件中的想要管理的版本号信息 // [assembly: AssemblyVersion("1.0.*")] [assembly: AssemblyVersion("1.5.0.$WCREV$")]//0.9.5…

渗透测试工具ZAP入门教程(3)-扫描流程

使用ZAP扫描网站流程如下&#xff1a; 1&#xff09;、输入URL&#xff0c;点击启动浏览器&#xff0c;在打开的浏览器登录要扫描的网站&#xff0c;操作页面各种功能&#xff0c;尽可能遍历所有功能及页面 2&#xff09;、点击Spider Start按钮&#xff0c;爬取静态地址&…

量化:pandas基础

文章目录 简介Series构造 DataFrame构造列的查改增删填充默认值 简介 pandas是 Python 的核心数据分析支持库&#xff0c;提供了快速、灵活、明确的数据结构。 pandas主要的两种数据结构为Series和DataFrame&#xff0c;分别用于处理一维和二维数据。 Series Series 是一种类…

机器学习实战14-在日本福岛核电站排放污水的背景下,核电站对人口影响的分析实践

大家好&#xff0c;我是微学AI&#xff0c;今天给大家介绍一下机器学习实战14-在日本福岛核电站排放污水的背景下,核电站对人口影响的分析实践。 近日&#xff0c;日本政府举行内阁成员会议&#xff0c;决定于2023年8月24日启动福岛核污染水排海。当地时间2023年8月24日13时&am…

【优化算法】Python实现面向对象的遗传算法

遗传算法 遗传算法(Genetic Algorithm)属于智能优化算法的一种&#xff0c;本质上是模拟自然界中种群的演化来寻求问题的最优解。与之相似的还有模拟退火、粒子群、蚁群等算法。 在具体介绍遗传算法之前&#xff0c;我们先来了解一些知识&#x1f9c0; DNA&#xff1a; 携带有…

【Acwing901】滑雪(记忆化搜索)题目讲解

题目描述 题目分析 样例解释 轨迹如下所示 状态表示 可以用f[i,j]表示从点&#xff08;i&#xff0c;j&#xff09;开始往下滑的最长的滑雪轨迹&#xff0c;那么最终答案就是遍历每一个点的f[i,j]&#xff0c;然后取最大值 状态计算 状态的转移也是非常的简单&#xff0c;…

ip地址查询进行企业网络数据管理

在现代企业中&#xff0c;数据管理变得越来越重要。企业需要了解和控制其网络上的各种数据流动&#xff0c;以保护敏感信息并提高网络安全性。IP地址查询是一种常用的技术&#xff0c;可以帮助企业有效地管理网络数据&#xff0c;并识别潜在的威胁。 IP地址查询是通过查找特定I…

Unix时间戳

江科大学习记录 Unix时间戳 Unix 时间戳&#xff08;Unix Timestamp&#xff09;定义为从UTC/GMT的1970年1月1日0时0分0秒开始所经过的秒数&#xff0c;不考虑闰秒时间戳存储在一个秒计数器中&#xff0c;秒计数器为32位/64位的整型变量世界上所有时区的秒计数器相同&#xf…

无涯教程-Python机器学习 - Based on human supervision函数

Python机器学习 中的 Based on human s - 无涯教程网无涯教程网提供https://www.learnfk.com/python-machine-learning/machine-learning-with-python-based-on-human-supervision.html

〔017〕Stable Diffusion 之 常用模型推荐 篇

✨ 目录 &#x1f388; 模型网站&#x1f388; 仿真系列&#x1f388; 国风系列&#x1f388; 卡通动漫系列&#x1f388; 3D系列&#x1f388; 一些好用的lora模型 &#x1f388; 模型网站 由于现在大模型超级多&#xff0c;导致每种画风的模型太多&#xff0c;那么如何选择最…

Kubernetes对象深入学习之五:TypeMeta无效之谜

欢迎访问我的GitHub 这里分类和汇总了欣宸的全部原创(含配套源码)&#xff1a;https://github.com/zq2599/blog_demos 本篇概览 本文是《Kubernetes对象深入学习之五》系列的第五篇&#xff0c;从前文的分析也能看出&#xff0c;代表对象类型的schema.ObjectKind&#xff0c;于…

uview ui 1.x ActonSheet项太多,设置滚动

问题&#xff1a;ActionSheet滚动不了。 使用uview ui &#xff1a;u-action-sheet, 但是item太多&#xff0c;超出屏幕了&#xff0c; 查了一下文档&#xff0c;并没有设置滚动的地方。 官方文档&#xff1a;ActionSheet 操作菜单 | uView - 多平台快速开发的UI框架 - uni-a…

【C语言】程序环境预处理 -- 详解

一、程序的翻译环境和执行环境 在 ANSI C 的任何一种实现中&#xff0c;存在两个不同的环境。 翻译环境&#xff0c;在这个环境中源代码被转换为可执行的机器指令。执行环境&#xff0c;它用于实际执行代码。 1、翻译环境 组成一个程序的每个源文件通过编译过程分别转换成目标代…

如何让qt tableView每个item中个别字用不同颜色显示?

如何让qt tableView每个item中个别字用不同颜色显示&#xff1f; 从上面图片可以看到&#xff0c;Item为红色&#xff0c;数字5为黑色。 要实现在一个控件实现不同颜色&#xff0c;目前想到的只有QTextEdit 。有两种方法&#xff0c;第一种是代理&#xff0c;第二种是通过setI…