单片机原理及应用:定时器/计数器综合应用
本文是《单片机原理及应用》专栏中的最后一篇文章,笔者以编译器的安装配置——51单片机简介——LED和数码管外设——开关和按键控制功能切换——外部中断系统——定时器与计数器为知识大纲,介绍了C语言编程控制51单片机的入门教程。作为收尾,我们将一同学习三个定时器/计数器的实际应用,不同于之间灯光和按键的组合,在这三个应用中都加入了其他外设,更复杂也更有创意,希望大家对单片机的学习也能兴致盎然、不断进取。
定时器控制P1.0引脚产生1ms方波
首先选用系统时钟为12MHz的单片机, 要在P1.0上产生周期为2ms的方波,定时器应产生1ms的定时中断,定时时间到则在中断服务程序中对P1.0求反。在本案例我们使用定时器T0,方式1定时中断,GATE不起作用。此外对中断标志位采用查询法,查询法不经过中断程序,是最简单的I/O方式,数据在CPU和外设之间的传送完全靠计算机程序控制,外设和CPU之间是串行工作,CPU效率低。由于查询法效率低于中断函数,已经被逐渐淘汰,笔者此处仅作为知识补充。
#include <reg51.h>
sbit P1_0=P1^0;
void main(void)
{TMOD=0x01; //设置T0为定时器工作方式1TR0=1; //允许T0中断while(1) {TH0=0xfc; //赋初值,计数1000即溢出:X=65536-1000TL0=0x18;do{}while(!TF0); //使用查询法,TF0为0原地循环,为1则T0溢出,往下执行P1_0=!P1_0; //P1.0状态求反,高低电平转换TF0=0; //定时器T0溢出标志位TF0清零}
}
仿真如图所示,为了确认输出波形,在proteus中添加了虚拟示波器,添加方式是点击左侧菜单栏虚拟仪器模式,在弹出的窗口中选择OSCILLIOSCOPE即可。


另外请大家注意,左侧按键属于复位电路,对方波输出无影响。启动仿真后即可看到示波器图像,示波器右侧还有各类参数,大家可以自行调整。
定时器控制发出1KHz音频
第二个应用是用定时器T1的中断控制P1.7引脚输出频率为1kHz方波音频信号,驱动蜂鸣器发声。单片机系统时钟为12MHz,音频信号周期1ms,因此T1的定时中断时间为0.5 ms,进入中断服务程序后,对P1.7求反。原理与应用一大致相同,区别在代码构架中采用了中断法,且在while循环中多次更改定时器初值。这几个应用或多或少都采用了与众不同的设计思路,更贴合实际使用场景。
#include<reg51.h>
sbit sound=P1^7; //将蜂鸣器连接在P1.7引脚上
#define f1(a) (65536-a)/256 //宏定义输入计数值即按表达式输出初值
#define f2(a) (65536-a)%256
unsigned int i=500;
unsigned int j=0;
void main(void)
{EA=1; //开启总中断允许.ET1=1; //允许定时器T1中断 TMOD=0x10; //T设置定时器1工作方式1 TH1=f1(i); //初始化计数值i得到初值,此时i为500TL1=f2(i); TR1=1; //启动定时器1while(1) { /*i=500; //可以改变频率达到不同的声音效果while(j<2000);j=0;i=1000; while(j<2000);j=0;i=3000; while(j<2000);j=0;*/ //返回第一种频率}}void T1_int(void) interrupt 3 using 0 //定时器T1中断服务函数
{TH1=f1(i); //重新赋初值.TL1=f2(i); sound=~sound; //对P1.7输出求反,形成方波j++; //用于记录中断次数,也就是记录时间
}
仿真如下,为了更直观地看到频率的变化,在蜂鸣器旁并联了一个示波器,虽然会降低幅值,但是不影响频率。

定时器控制蜂鸣器发出1KHz音频
蜂鸣器声音较大,大家在观看视频演示时需要注意调节音量。
定时器测量INT1引脚正脉冲宽度
第三个应用是计数器测量INT1引脚正脉冲宽度,利用门控位GATE1可使T1启动计数受INT1控制:当GATE1=1,TR1=1时,只有INT1引脚输入高电平时,T1才被允许计数。利用该功能,可测量引脚正脉冲宽度,并在6位数码管上以机器周期数显示,能通过旋转信号源旋钮调整频率。
在中断处理上再次使用了查询法,另外需要注意INT1作为外部中断1的引脚,并未像之前我们介绍的那样设置TCON用于外部中断允许。作为最后一个应用,可能有些难以理解,大家了解相关原理内容就好。
#include<reg51.h>
#define uint unsigned int
#define uchar unsigned char
sbit P3_3=P3^3; //读取INT1引脚电平
uchar count_high; //定义计数变量,用来读取TH0
uchar count_low; //定义计数变量,用来读取TL0
uint num;
uchar shiwan, wan, qian, bai, shi, ge; //定义各数码管显示数位
uchar flag; //控制刷新频率
uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //数组记录共阴极数码管段码void delay(uint z) //自变量延时函数
{uint x,y;for(x=z;x>0;x--)for(y=110;y>0;y--);
}
void display(uint a,uint b,uint c,uint d,uint e,uint f){P2=0xfe; P0=table[f]; delay(2); //数码管段选,位选,消影P2=0xfd; P0=table[e]; delay(2); //六个数位对应留个双管P2=0xfb; P0=table[d]; delay(2);P2=0xf7; P0=table[c]; delay(2);P2=0xef; P0=table[b]; delay(2);P2=0xdf; P0=table[a]; delay(2);
}
void read_count() //读取定时寄存器的内容
{do{count_high=TH1; //读取高字节count_low=TL1; //读取低字节}while (count_high!=TH1);//读取完成后继续往下执行 num=count_high*256+count_low; //将16位数据恢复为十进制数字}
void main( )
{while(1){flag=0;TMOD=0x90; //设置定时器T1工作方式1,门控位为1,当INT1为高电平时定时器才开始工作TH1=0; //计数初值为零TL1=0;while(P3_3==1); //等待INT1变为低电平TR1=1; //如果INT1为低电平,启动定时器器T1,此时未真正开始计数while(P3_3==0); //等待INT1变为高电平,变高后T1真正开始计数while(P3_3==1); //等待INT1变为低电平,变低后T1停止计数TR1=0;read_count(); //调用函数,读取定时寄存器内容的函数shiwan=num/100000; //数据分割,每一位数码管显示对应数位wan=num%100000/10000;qian=num%10000/1000;bai=num%1000/100;shi=num%100/10;ge=num%10;while(flag!=100) //运行100次显示数值后再读取下一次数值 {flag++;display(ge,shi,bai,qian,wan,shiwan); //调用display函数,传入相应参数}}
}
仿真如下,为避免接线混乱,采用了之前介绍的总线接法;P0端口使用了上拉电阻,此时端口为准双向口,不存在高阻抗的悬浮状态;和示波器一样,信号发生器也在虚拟仪器界面,选择SIGNAL GENERATOR即可。

大家可以更改信号发生器的参数,包括频率、电压和波形,观察数码管示数的变化,详细的操作教程可以参考51单片机数字频率计开发
定时器测量INT1引脚正脉冲宽度
到此为止,这个专栏就算圆满落幕了,这部分单片机课程笔者也是学习了一月有余,对于非电子专业的同学来说这些知识足够了。以后如果有进一步的机会,或许会重启这个专栏。总之感谢陪伴我一同学习的每一个人,祝愿大家在新的一年里都能百尺竿头更进一步,谢谢大家,我们下个专栏再见。
相关文章:
单片机原理及应用:定时器/计数器综合应用
本文是《单片机原理及应用》专栏中的最后一篇文章,笔者以编译器的安装配置——51单片机简介——LED和数码管外设——开关和按键控制功能切换——外部中断系统——定时器与计数器为知识大纲,介绍了C语言编程控制51单片机的入门教程。作为收尾,…...
R语言【paleobioDB】——pbdb_intervals():通过参数选择,返回多个地层年代段的基本信息
Package paleobioDB version 0.7.0 paleobioDB 包在2020年已经停止更新,该包依赖PBDB v1 API。 可以选择在Index of /src/contrib/Archive/paleobioDB (r-project.org)下载安装包后,执行本地安装。 Usage pbdb_interval (id, ...) Arguments 参数【..…...
阅读笔记lv.1
阅读笔记 sql中各种 count结论不同存储引擎计算方式区别count() 类型 责任链模式常见场景例子(闯关游戏) sql中各种 count 结论 innodb count(*) ≈ count(1) > count(主键id) > count(普通索引列) > count(未加索引列)myisam 有专门字段记录…...
小鼠的滚动疲劳仪-转棒实验|ZL-200C小鼠转棒疲劳仪
转棒实验|ZL-200C小鼠转棒疲劳仪用于检测啮齿类动物的运动功能。通过测量动物在滚筒上行走的持续时间,来评定**神经系统*病或损坏以及药物对运动协调功能和疲劳的影响。 疲劳实验中,让小鼠在不停转动的棒上运动,肌肉会很快进入疲劳状态&#…...
平衡搜索二叉树(AVL树)
目录 前言 一、AVL树的概念 二、AVL树的定义 三、AVL树的插入 四、AVL树的旋转 4.1、右单旋 4.2、左单旋 4.3、左右双旋 4.4、右左双旋 五、AVL树的验证 5.1、 验证其为二叉搜索树 5.2、 验证其为平衡树 六、AVL树的性能 前言 二叉搜索树虽可以缩短查找的效率&…...
2024年1月12日学习总结
学习目标 完成集中学习的readme 完成联邦学习的代码编写 边学习边总结 学习内容 Introduction to Early Stopping 1、Overfitting 过拟合是所有机器学习,深度学习中可能出现的一个比较严重的问题。具体表现就是:你的模型在训练集上处理的效果非常好&…...
PCL 使用克拉默法则进行四点定球(C++详细过程版)
目录 一、算法原理二、代码实现三、计算结果本文由CSDN点云侠原创,PCL 使用克拉默法则进行四点定球(C++详细过程版),爬虫自重。如果你不是在点云侠的博客中看到该文章,那么此处便是不要脸的爬虫与GPT生成的文章。 一、算法原理 已知空间内不共面的四个点,设其坐标为 A (…...
前端导致浏览器奔溃原因分析
内存泄漏 内存泄漏(Memory Leak)是指程序中已动态分配的堆内存由于某种原因程序未释放或无法释放,造成系统内存的浪费,导致程序运行速度减慢甚至系统崩溃等严重后果。(程序某个未使用的变量或者方法,长期占…...
力扣:209.长度最小的子数组
1.题目分析: 给定一个含有 n 个正整数的数组和一个正整数 target 。 找出该数组中满足其总和大于等于 target 的长度最小的 连续子数组 [numsl, numsl1, ..., numsr-1, numsr] ,并返回其长度。如果不存在符合条件的子数组,返回 0 。 示例 …...
常见类型的yaml文件如何编写?--kind: Service
基本说明 在 Kubernetes 中,Service 是一种抽象的方式,用于定义一组 Pod 的访问方式和网络服务。Service 提供了一个稳定的网络端点(Endpoint),使得其他服务或外部用户可以通过 Service 来访问被管理的 Pod。 负载均…...
linux环境下安装postgresql
PostgreSQL: Linux downloads (Red Hat family)postgresql官网 PostgreSQL: Linux downloads (Red Hat family) 环境: centos7 postgresql14 选择版本 执行启动命令 配置远程连接文件 vi /var/lib/pqsql/14/data/postgresql.conf 这里将listen_addresses值由lo…...
专业课145+合肥工业大学833信号分析与处理考研经验合工大电子信息通信
今年专业课145也是考研科目中最满意的一门,其他基本相对平平,所以这里我总结一下自己的专业课合肥工业大学833信号分析与处理的复习经验。 我所用的教材是郑君里的《信号与系统》(第三版)和高西全、丁玉美的《数字信号处理》&…...
FreeRtos Queue (一)
本篇主要讲队列的数据结构和初始化 一、队列的数据结构 二、队列初始化完是什么样子的 队列初始化的函数调用关系:xQueueGenericCreate->prvInitialiseNewQueue->xQueueGenericReset 所以,最终初始化完的队列是这样的 假设申请了4个消息体&…...
深入理解 Hadoop (五)YARN核心工作机制浅析
概述 YARN 的核心设计理念是 服务化(Service) 和 事件驱动(Event EventHandler)。服务化 和 事件驱动 软件设计思想的引入,使得 YARN 具有低耦合、高内聚的特点,各个模块只需完成各自功能,而模…...
优化 - 重构一次Mysql导致服务器的OOM
概述 优化了一次前后端处理不当导致的CPU的一次爆机行为,当然,这和服务器的配置低也有着密不可分的关系,简单的逻辑学告诉我们,要找到真正的问题,进行解决,CPU爆机的关键点在于前后端两个方面,…...
【光波电子学】基于MATLAB的多模光纤模场分布的仿真分析
基于MATLAB的多模光纤模场分布的仿真分析 一、引言 (1)多模光纤的概念 多模光纤(MMF)是一种具有较大纤芯直径的光纤结构,其核心直径通常在10-50微米范围内。与单模光纤(SMF)相比,…...
0104 AJAX介绍
Ajax 的全称是 Asynchronous Javascript And XML (异步 JavaScript 和 XML )。 通俗的理解:在网页中利用 XMLHttpRequest 对象和服务器进行数据交互的方式,就是 Ajax Ajax 能让我们轻松实现网页与服务器之间的数据交互。 浏览器…...
代码随想录算法训练营第24天 | 理论基础 77. 组合
目录 理论基础 什么是回溯法 回溯法的效率 回溯法解决的问题 如何理解回溯法 回溯法模板 77. 组合 💡解题思路 💻实现代码 理论基础 什么是回溯法 回溯法也可以叫做回溯搜索法,它是一种搜索的方式。 回溯法的效率 虽然回溯法很难ÿ…...
【深度学习环境搭建】Windows搭建Anaconda3、已经Pytorch的GPU版本
目录 搭建Anaconda3搭建GPU版本的Pytorch你的pip也要换源,推荐阿里源打开conda的PowerShell验证 搭建Anaconda3 无脑下载安装包安装(自行百度) 注意点: 1、用户目录下的.condarc需要配置(自定义环境的地址(…...
基于WebFlux的Websocket的实现,高级实现自定义功能拓展
基于WebFlux的Websocket 一、导入XML依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-webflux</artifactId> </dependency><!-- 或者引入jackson --> <dependency><group…...
Docker 离线安装指南
参考文章 1、确认操作系统类型及内核版本 Docker依赖于Linux内核的一些特性,不同版本的Docker对内核版本有不同要求。例如,Docker 17.06及之后的版本通常需要Linux内核3.10及以上版本,Docker17.09及更高版本对应Linux内核4.9.x及更高版本。…...
Swift 协议扩展精进之路:解决 CoreData 托管实体子类的类型不匹配问题(下)
概述 在 Swift 开发语言中,各位秃头小码农们可以充分利用语法本身所带来的便利去劈荆斩棘。我们还可以恣意利用泛型、协议关联类型和协议扩展来进一步简化和优化我们复杂的代码需求。 不过,在涉及到多个子类派生于基类进行多态模拟的场景下,…...
如何在最短时间内提升打ctf(web)的水平?
刚刚刷完2遍 bugku 的 web 题,前来答题。 每个人对刷题理解是不同,有的人是看了writeup就等于刷了,有的人是收藏了writeup就等于刷了,有的人是跟着writeup做了一遍就等于刷了,还有的人是独立思考做了一遍就等于刷了。…...
基于Springboot+Vue的办公管理系统
角色: 管理员、员工 技术: 后端: SpringBoot, Vue2, MySQL, Mybatis-Plus 前端: Vue2, Element-UI, Axios, Echarts, Vue-Router 核心功能: 该办公管理系统是一个综合性的企业内部管理平台,旨在提升企业运营效率和员工管理水…...
LabVIEW双光子成像系统技术
双光子成像技术的核心特性 双光子成像通过双低能量光子协同激发机制,展现出显著的技术优势: 深层组织穿透能力:适用于活体组织深度成像 高分辨率观测性能:满足微观结构的精细研究需求 低光毒性特点:减少对样本的损伤…...
Linux系统部署KES
1、安装准备 1.版本说明V008R006C009B0014 V008:是version产品的大版本。 R006:是release产品特性版本。 C009:是通用版 B0014:是build开发过程中的构建版本2.硬件要求 #安全版和企业版 内存:1GB 以上 硬盘…...
大数据驱动企业决策智能化的路径与实践
📝个人主页🌹:慌ZHANG-CSDN博客 🌹🌹期待您的关注 🌹🌹 一、引言:数据驱动的企业竞争力重构 在这个瞬息万变的商业时代,“快者胜”的竞争逻辑愈发明显。企业如何在复杂环…...
【基于阿里云搭建数据仓库(离线)】使用UDTF时出现报错“FlatEventUDTF cannot be resolved”
目录 问题: 可能的原因有: 解决方法: 问题: 已经将包含第三方依赖的jar包上传到dataworks,并且成功注册函数,但是还是报错:“FlatEventUDTF cannot be resolved”,如下:…...
自建 dnslog 回显平台:渗透测试场景下的隐蔽回显利器
🔍 背景介绍 在渗透测试与红队评估过程中,DNS 外带(DNS Exfiltration) 是一种常见且隐蔽的通信通道。由于多数目标环境默认具备外网 DNS 解析能力,即便在 无回显、无文件上传权限 的条件下,仍可通过 DNS 请…...
【异常】极端事件的概率衰减方式(指数幂律衰减)
在日常事件中,极端事件的概率衰减方式并非单一模式,而是取决于具体情境和数据生成机制。以下是科学依据和不同衰减形式的分析: 1. 指数衰减(Exponential Decay) 典型场景:当事件服从高斯分布(正态分布)或指数分布时,极端事件的概率呈指数衰减。 数学形式:概率密度函数…...
