当前位置: 首页 > news >正文

单片机原理及应用:定时器/计数器综合应用

本文是《单片机原理及应用》专栏中的最后一篇文章,笔者以编译器的安装配置——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引脚正脉冲宽度


到此为止,这个专栏就算圆满落幕了,这部分单片机课程笔者也是学习了一月有余,对于非电子专业的同学来说这些知识足够了。以后如果有进一步的机会,或许会重启这个专栏。总之感谢陪伴我一同学习的每一个人,祝愿大家在新的一年里都能百尺竿头更进一步,谢谢大家,我们下个专栏再见。

相关文章:

单片机原理及应用:定时器/计数器综合应用

本文是《单片机原理及应用》专栏中的最后一篇文章&#xff0c;笔者以编译器的安装配置——51单片机简介——LED和数码管外设——开关和按键控制功能切换——外部中断系统——定时器与计数器为知识大纲&#xff0c;介绍了C语言编程控制51单片机的入门教程。作为收尾&#xff0c;…...

R语言【paleobioDB】——pbdb_intervals():通过参数选择,返回多个地层年代段的基本信息

Package paleobioDB version 0.7.0 paleobioDB 包在2020年已经停止更新&#xff0c;该包依赖PBDB v1 API。 可以选择在Index of /src/contrib/Archive/paleobioDB (r-project.org)下载安装包后&#xff0c;执行本地安装。 Usage pbdb_interval (id, ...) Arguments 参数【..…...

阅读笔记lv.1

阅读笔记 sql中各种 count结论不同存储引擎计算方式区别count() 类型 责任链模式常见场景例子&#xff08;闯关游戏&#xff09; sql中各种 count 结论 innodb count(*) ≈ count(1) > count(主键id) > count(普通索引列) > count(未加索引列)myisam 有专门字段记录…...

小鼠的滚动疲劳仪-转棒实验|ZL-200C小鼠转棒疲劳仪

转棒实验|ZL-200C小鼠转棒疲劳仪用于检测啮齿类动物的运动功能。通过测量动物在滚筒上行走的持续时间&#xff0c;来评定**神经系统*病或损坏以及药物对运动协调功能和疲劳的影响。 疲劳实验中&#xff0c;让小鼠在不停转动的棒上运动&#xff0c;肌肉会很快进入疲劳状态&#…...

平衡搜索二叉树(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 过拟合是所有机器学习&#xff0c;深度学习中可能出现的一个比较严重的问题。具体表现就是&#xff1a;你的模型在训练集上处理的效果非常好&…...

PCL 使用克拉默法则进行四点定球(C++详细过程版)

目录 一、算法原理二、代码实现三、计算结果本文由CSDN点云侠原创,PCL 使用克拉默法则进行四点定球(C++详细过程版),爬虫自重。如果你不是在点云侠的博客中看到该文章,那么此处便是不要脸的爬虫与GPT生成的文章。 一、算法原理 已知空间内不共面的四个点,设其坐标为 A (…...

前端导致浏览器奔溃原因分析

内存泄漏 内存泄漏&#xff08;Memory Leak&#xff09;是指程序中已动态分配的堆内存由于某种原因程序未释放或无法释放&#xff0c;造成系统内存的浪费&#xff0c;导致程序运行速度减慢甚至系统崩溃等严重后果。&#xff08;程序某个未使用的变量或者方法&#xff0c;长期占…...

力扣:209.长度最小的子数组

1.题目分析&#xff1a; 给定一个含有 n 个正整数的数组和一个正整数 target 。 找出该数组中满足其总和大于等于 target 的长度最小的 连续子数组 [numsl, numsl1, ..., numsr-1, numsr] &#xff0c;并返回其长度。如果不存在符合条件的子数组&#xff0c;返回 0 。 示例 …...

常见类型的yaml文件如何编写?--kind: Service

基本说明 在 Kubernetes 中&#xff0c;Service 是一种抽象的方式&#xff0c;用于定义一组 Pod 的访问方式和网络服务。Service 提供了一个稳定的网络端点&#xff08;Endpoint&#xff09;&#xff0c;使得其他服务或外部用户可以通过 Service 来访问被管理的 Pod。 负载均…...

linux环境下安装postgresql

PostgreSQL: Linux downloads (Red Hat family)postgresql官网 PostgreSQL: Linux downloads (Red Hat family) 环境&#xff1a; centos7 postgresql14 选择版本 执行启动命令 配置远程连接文件 vi /var/lib/pqsql/14/data/postgresql.conf 这里将listen_addresses值由lo…...

专业课145+合肥工业大学833信号分析与处理考研经验合工大电子信息通信

今年专业课145也是考研科目中最满意的一门&#xff0c;其他基本相对平平&#xff0c;所以这里我总结一下自己的专业课合肥工业大学833信号分析与处理的复习经验。 我所用的教材是郑君里的《信号与系统》&#xff08;第三版&#xff09;和高西全、丁玉美的《数字信号处理》&…...

FreeRtos Queue (一)

本篇主要讲队列的数据结构和初始化 一、队列的数据结构 二、队列初始化完是什么样子的 队列初始化的函数调用关系&#xff1a;xQueueGenericCreate->prvInitialiseNewQueue->xQueueGenericReset 所以&#xff0c;最终初始化完的队列是这样的 假设申请了4个消息体&…...

深入理解 Hadoop (五)YARN核心工作机制浅析

概述 YARN 的核心设计理念是 服务化&#xff08;Service&#xff09; 和 事件驱动&#xff08;Event EventHandler&#xff09;。服务化 和 事件驱动 软件设计思想的引入&#xff0c;使得 YARN 具有低耦合、高内聚的特点&#xff0c;各个模块只需完成各自功能&#xff0c;而模…...

优化 - 重构一次Mysql导致服务器的OOM

概述 优化了一次前后端处理不当导致的CPU的一次爆机行为&#xff0c;当然&#xff0c;这和服务器的配置低也有着密不可分的关系&#xff0c;简单的逻辑学告诉我们&#xff0c;要找到真正的问题&#xff0c;进行解决&#xff0c;CPU爆机的关键点在于前后端两个方面&#xff0c;…...

【光波电子学】基于MATLAB的多模光纤模场分布的仿真分析

基于MATLAB的多模光纤模场分布的仿真分析 一、引言 &#xff08;1&#xff09;多模光纤的概念 多模光纤&#xff08;MMF&#xff09;是一种具有较大纤芯直径的光纤结构&#xff0c;其核心直径通常在10-50微米范围内。与单模光纤&#xff08;SMF&#xff09;相比&#xff0c;…...

0104 AJAX介绍

Ajax 的全称是 Asynchronous Javascript And XML &#xff08;异步 JavaScript 和 XML &#xff09;。 通俗的理解&#xff1a;在网页中利用 XMLHttpRequest 对象和服务器进行数据交互的方式&#xff0c;就是 Ajax Ajax 能让我们轻松实现网页与服务器之间的数据交互。 浏览器…...

代码随想录算法训练营第24天 | 理论基础 77. 组合

目录 理论基础 什么是回溯法 回溯法的效率 回溯法解决的问题 如何理解回溯法 回溯法模板 77. 组合 &#x1f4a1;解题思路 &#x1f4bb;实现代码 理论基础 什么是回溯法 回溯法也可以叫做回溯搜索法&#xff0c;它是一种搜索的方式。 回溯法的效率 虽然回溯法很难&#xff…...

【深度学习环境搭建】Windows搭建Anaconda3、已经Pytorch的GPU版本

目录 搭建Anaconda3搭建GPU版本的Pytorch你的pip也要换源&#xff0c;推荐阿里源打开conda的PowerShell验证 搭建Anaconda3 无脑下载安装包安装&#xff08;自行百度&#xff09; 注意点&#xff1a; 1、用户目录下的.condarc需要配置&#xff08;自定义环境的地址&#xff08…...

基于WebFlux的Websocket的实现,高级实现自定义功能拓展

基于WebFlux的Websocket 一、导入XML依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-webflux</artifactId> </dependency><!-- 或者引入jackson --> <dependency><group…...

SpringBoot-17-MyBatis动态SQL标签之常用标签

文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…...

国防科技大学计算机基础课程笔记02信息编码

1.机内码和国标码 国标码就是我们非常熟悉的这个GB2312,但是因为都是16进制&#xff0c;因此这个了16进制的数据既可以翻译成为这个机器码&#xff0c;也可以翻译成为这个国标码&#xff0c;所以这个时候很容易会出现这个歧义的情况&#xff1b; 因此&#xff0c;我们的这个国…...

React 第五十五节 Router 中 useAsyncError的使用详解

前言 useAsyncError 是 React Router v6.4 引入的一个钩子&#xff0c;用于处理异步操作&#xff08;如数据加载&#xff09;中的错误。下面我将详细解释其用途并提供代码示例。 一、useAsyncError 用途 处理异步错误&#xff1a;捕获在 loader 或 action 中发生的异步错误替…...

土地利用/土地覆盖遥感解译与基于CLUE模型未来变化情景预测;从基础到高级,涵盖ArcGIS数据处理、ENVI遥感解译与CLUE模型情景模拟等

&#x1f50d; 土地利用/土地覆盖数据是生态、环境和气象等诸多领域模型的关键输入参数。通过遥感影像解译技术&#xff0c;可以精准获取历史或当前任何一个区域的土地利用/土地覆盖情况。这些数据不仅能够用于评估区域生态环境的变化趋势&#xff0c;还能有效评价重大生态工程…...

大语言模型(LLM)中的KV缓存压缩与动态稀疏注意力机制设计

随着大语言模型&#xff08;LLM&#xff09;参数规模的增长&#xff0c;推理阶段的内存占用和计算复杂度成为核心挑战。传统注意力机制的计算复杂度随序列长度呈二次方增长&#xff0c;而KV缓存的内存消耗可能高达数十GB&#xff08;例如Llama2-7B处理100K token时需50GB内存&a…...

深入解析 ReentrantLock:原理、公平锁与非公平锁的较量

ReentrantLock 是 Java 中 java.util.concurrent.locks 包下的一个重要类,用于实现线程同步,支持可重入性,并且可以选择公平锁或非公平锁的实现方式。下面将详细介绍 ReentrantLock 的实现原理以及公平锁和非公平锁的区别。 ReentrantLock 实现原理 基本架构 ReentrantLo…...

ZYNQ学习记录FPGA(二)Verilog语言

一、Verilog简介 1.1 HDL&#xff08;Hardware Description language&#xff09; 在解释HDL之前&#xff0c;先来了解一下数字系统设计的流程&#xff1a;逻辑设计 -> 电路实现 -> 系统验证。 逻辑设计又称前端&#xff0c;在这个过程中就需要用到HDL&#xff0c;正文…...

OPENCV图形计算面积、弧长API讲解(1)

一.OPENCV图形面积、弧长计算的API介绍 之前我们已经把图形轮廓的检测、画框等功能讲解了一遍。那今天我们主要结合轮廓检测的API去计算图形的面积&#xff0c;这些面积可以是矩形、圆形等等。图形面积计算和弧长计算常用于车辆识别、桥梁识别等重要功能&#xff0c;常用的API…...

Axure Rp 11 安装、汉化、授权

Axure Rp 11 安装、汉化、授权 1、前言2、汉化2.1、汉化文件下载2.2、windows汉化流程2.3、 macOs汉化流程 3、授权 1、前言 Axure Rp 11官方下载链接&#xff1a;https://www.axure.com/downloadthanks 2、汉化 2.1、汉化文件下载 链接: https://pan.baidu.com/s/18Clf…...

基于Java项目的Karate API测试

Karate 实现了可以只编写Feature 文件进行测试,但是对于熟悉Java语言的开发或是测试人员,可以通过编程方式集成 Karate 丰富的自动化和数据断言功能。 本篇快速介绍在Java Maven项目中编写和运行测试的示例。 创建Maven项目 最简单的创建项目的方式就是创建一个目录,里面…...