第6章 单片机的定时器/计数器

news2024/9/20 10:48:32

6.1 定时/计数器的结构与工作原理

6.2 定时器的控制

6.3 定时/计数器的工作方式

6.4 定时/计数器的编程和应用

6.1 定时/计数器的结构与工作原理

6.1.1 定时/计数器的基本原理

纯软件定时/计数方法:

定时——空循环预定周次,等待预定时间

计数——读取I/O口电平,统计变化次数

基本思路:由CPU统计状态变化次数,待预定结果出现后结束统计。

存在问题:占用过多CPU机时

单片机软硬件联合定时/计数方法:

定时器的本质是计数器(对时钟脉冲计数),计数器则是对外来脉冲计数.

定时器基本工作原理:

计数器基本工作原理:

6.1.2 定时/计数器的结构

6.2 定时器/计数器的控制

T04种工作方式T13种工作方式,每种工作方式都有定时和计数2种方式,故共有14种组合关系。

6.3 定时/计数器的工作方式

实例1 设单片机的fosc=12MHz,采用T1定时方式1P2.0脚上输出周期为2ms的方波。

1. 查询方式

#include <reg51.h>

sbit P2_0 = P2^0;

main () {

   TMOD = 0x10;          //设置T1定时方式1(0001 0000B)

   TR1=1;                //启动T0

   for(;;){

      TH1 = 0xfc;      //装载计数初值

      TL1 = 0x18;

      do{ } while(!TF1); //等待TF1溢出

      P2_0 =!P2_0;       //定时时间到P2.0反相

      TF1 = 0;           //TF1标志0

   }

}

使用定时/计数器的步骤小结

  (1)设置TMOD——确定定时/计数器的工作状态

使用T0还是T1?

采用定时模式还是计数模式?

采用工作方式0、方式1、方式2、方式3

强调TMOD的设置只能以字节形式给出 

(2)计算计数初值——产生期望的定时/定数间隔

定时计数初值 a = 216- t×fosc/12

                          (t ≤65536 ms, fosc=12MHz时)

定数计数初值 a = 216- N 

            N≤65536, 脉冲频率≤0.5MHzfosc=12MHz时)

装载计数初值:

THx =  a  / 256         TLx =  a  / % 256

3)确定采用何种方式处理溢出结果

若是中断方式中断初始化设置和中断服务程序

若是查询方式——采用条件判断语句

4)启动定时器:

      TR0 = 1 TR1= 1

5)进行定时或计数结束后的其它工作

6)为下次定时/计数做准备(清TFx标志+重装载计数初值)

      若是中断方式,则无需软件清TFx标志位;

      若是查询方式,需要软件清除TFx标志位。

2. 方式2

实例2 采用T0定时方式2P2.0口输出周期为0.5ms的方波(fosc=12MHz)

分析:计数初值TL0= ((256-250)*12/12)%256 = 0x06

            TMOD = 0x02

实例将第4章实例6 计数显示器”采用的按键查询法,改为T0计数方式2 + 中断法,实现原有功能。

电路改进:将按键BUTP3.7引脚改为T0引脚(P3.4

编程分析:将T0设置为计数器方式2,设法使其在一个外部脉冲到来时就能溢出(即计数溢出周次为1)产生中断请求

初始化:

TMOD = 0000 0110B = 0x06T0计数方式2

a = 2 8 – 1 = 255 = 0xff(计数初值)

ET0 = EA = 1T0开中断)

实例3源程序:

(3)工作方式0

使用13的定时/计数器(THx7-0+TLx4-0

实例4  计算用T0方式0定时5ms的计数初值afosc=12MHz

解:计数初值a=213-5000×12/12=3192= 1100 0111 1000B

        由于方式0TL03位未用(一般填0) ,因此

        a= 0110 0011 0001 1000 = 6318H

结果TH0 = 0x63;    TL0 = 0x18;

方式0与方式1的比较

4)方式3(仅T0有此方式)

6.4 定时/计数器的编程和应用

使用方法:

定时器应用 —— 用于定时控制,或作为分频器发生各种不同频率的方波;
计数器应用 —— 用于外部脉冲统计或外部中断源扩充;
定时 / 计数器复合应用 将定时与计数两种方式结合起来。

实例P3.4口输入一个低频窄脉冲信号。当该信号出现负跳变时,由P3.0口输出宽度为500μs的同步脉冲,如此往复。要求据此设计一个波形展宽程序(fosc= 6MHz)。

实例5源程序

实例6源程序

实例7源程序

编程分析:

1)根据定时/计数器工作原理,当GATE=TR0=1时,允许       引脚脉冲控制定时器的启停,即         =1可启动定时器,      =0可关闭定时器。

测量未知脉冲宽度的思路是:利用查询方式找到①点的出现时刻→利用        信号的上升沿在②点启动T0定时方式1→利用         信号的下降沿在③点中止T0定时→取出反映了脉冲宽度的T0计数值

2)在C51中进行内存储器操作的方法是,定义指针变量并赋地址值→按指针变量对数据进行读/写操作。

3)十六进制数转BCD码的方法是:从最低位开始进行模10计算→删去最末位(相当于整除10)→继续模10计算,直至整除10的结果为0

实例8 源程序

实例8小结

1、测量未知脉冲宽度的方法——利用INTx引脚接入待测脉冲设置Tx定时方式THxTLx清零利用查询语句辅助计时Tx计数值计算脉宽值;

2C51中进行存储器操作的方法——定义指针变量并赋地址值按指针变量对数据进行读写操作;

3、任意位数BCD码的拆解方法——从最低位开始反复进行模10计算 取模后删去最低位(整除10)→直至整除10的结果为0

4、在Proteus中进行C51调试的方法——改变keil 的输出设置形成omf格式编译文件Proteus中加载omf文件利用类似汇编调试方法进行调试。

本章小结

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

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

相关文章

义务外贸wordpress独立站主题

健身器材wordpress网站模板 跑步机、椭圆机、划船机、动感单车、健身车、深蹲架、龙门架、健身器材wordpress网站模板。 https://www.jianzhanpress.com/?p4251 农业机械wordpress网站模板 植保机械、畜牧养殖机械、农机配件、土壤耕整机械、农业机械wordpress网站模板。 …

鸿蒙开发 03 封装 @ohos/axios (最新深度封装)

鸿蒙开发 03 封装 ohos/axios &#xff08;最新深度封装&#xff09; 1、安装 ohos/axios2、开始封装2.1 新建 utils 文件夹 和 api 文件夹2.2 在 utils 文件夹里新建 http.ts2.3 在 api 文件夹里新建 api.ets 3、页面调用4、打印结果 1、安装 ohos/axios ohpm install ohos/a…

Linux中进程的控制

一、进程的创建 1、知识储备 进程的创建要调用系统接口&#xff0c;头文件 #include<unistd.h> 函数fork() 由于之前的铺垫我们现在可以更新一个概念 进程 内核数据结构&#xff08;task_struct, mm_struct, 页表....&#xff09; 代码 数据 所以如何理解进程的独…

如何在 Odoo 16 中覆盖现有控制器

Odoo 中使用控制器来开发前端模块。后端模块链接到控制器。我们可以通过使用覆盖属性对基类进行修改来修改编程逻辑或向现有程序添加新逻辑。 要将控制器添加到模块,第一步,您必须为控制器创建一个单独的目录。在此目录中,应将一个 init 文件和包含控制器方法的所有 python…

Python中发送邮件的艺术:普通邮件、PDF附件与Markdown附件

用的是qq邮箱&#xff0c;具体获取smtp的password可以看这个文章 获取密码 Python中发送邮件的艺术&#xff1a;普通邮件、PDF附件与Markdown附件 在今天的博客中&#xff0c;我们将探讨如何使用Python的smtplib库来发送电子邮件&#xff0c;包括发送普通文本邮件、携带PDF文件…

初学 Linux 必知必会的 X 个知识点

文章目录 一、Linux 系统与 Windows 系统的差别二、Linux 命令行初识1. 终端界面2. 路径的含义3. 命令结构说明4. 常见的 Linux 命令4-1. 文件和目录操作4-2. 网络相关命令 5. 使用命令行时的小技巧5-1. 使用 TAB 键补全5-2. 巧用通配符 *5-3. 命令行历史功能 三、文件的详细信…

代码:前端与数据库交互的登陆界面

<!DOCTYPE html> <html lang"en"> <head> <meta charset"UTF-8"> <meta name"viewport" content"widthdevice-width, initial-scale1.0"> <title>登录</title> </head> <body>…

flutter 充电气泡

前言&#xff1a; 之前一直看到 有手机充电的时候 有气泡从Type-C 的位置冒泡上来 慢慢上移&#xff0c; 然后和上面的圆圈 会和&#xff0c;感觉还是挺好看的。今天试了下用 Flutter 实现了一版本。大致效果如下&#xff0c;而且气泡 和 气泡直接还可以粘黏 实现原理&#xff…

U盘数据误删如何恢复?

问&#xff1a;U盘数据误删如何恢复&#xff1f; 答&#xff1a; 1.若出现U盘中的文件被误删后第一步&#xff1a;不进行任何写入操作&#xff08;向U盘中复制或移动文件&#xff09;&#xff0c; 接着直接拔掉U盘。 2.在电脑上下载数据恢复软件&#xff0c;给大家推荐一个数据…

stm32学习:(寄存器2)GPIO总体说明

目录 GPIO的主要特点 GPIO的8种工作模式 GPIO电路结构 GPIO输出模式 输出流程 复用输出模式 GPIO输入模式 输入流程 模拟输入流程 GPIO相关的7个寄存器 GPIOx_CRL GPIOx_CRH GPIOx_IDR GPIOx_ODR GPIOx_BSRR GPIOx_BRR GPIOx_LCKR 实例 三个灯流水灯 main.…

0305-0308TTL逻辑门电路

逻辑门电路-逻辑描述中的问题 3.5TTL逻辑门电路3.5.1BJT的开关特性BJT的开关时间 3.5.2TTL反相器的基本电路1.电路组成2.TTL反相器的工作原理 3.5.3改进型TTL门电路-抗饱和TTL门电路1.抗饱和TTL门电路2.其他TTL门电路 3.7逻辑描述中的几个问题3.7.1正负逻辑问题3.7.2 基本逻辑门…

VirtualBox安装增强功能时报错:未能加载虚拟光盘VBoxGuestAdditions.iso 到虚拟电脑

VirtualBox安装增强功能时报错&#xff1a;未能加载虚拟光盘VBoxGuestAdditions.iso 到虚拟电脑 选中一个虚拟机 进入设置点击存储 再点击光盘样子的加号进入后就可以选择 添加 选中双击就好&#xff0c;我已经添加过了 所以我的会在上面 选中一个虚拟机 进入设置 点击存储 再点…

基于单片机的智能窗帘系统设计

【 摘 要 】 随着物联网技术的发展,智能家居越来越受到业界的关注,针对目前市场上智能窗帘的弊端,设计了一款基于单片机的智能窗帘 。 普遍窗帘需要手工进行控制,遥控窗帘通常需要远程控制,智能窗帘与之相比,可以实现自主控制。 系统前端探测器采用光敏传感器,对光线进行…

小程序中视频课程下载工具使用教程,一键下载小程序中的视频课程!

前言&#xff1a; 现代随着知识付费时代的发展&#xff0c;我们很多视频课程或需要学习的资料是保存在小程序当中的&#xff0c;但是现在很多小程序它是禁止让我们下载我们所观看到的视频课程的&#xff0c;这就给我们带来了很多不方便。今天我就教大家如何一键下载小程序中的…

python实现图像对比度增强算法

python实现直方图均衡化、自适应直方图均衡化、连接组件标记算法 1.直方图均衡化算法详解算法步骤公式Python 实现详细解释优缺点 2.自适应直方图均衡化算法详解算法步骤公式Python 实现详细解释优缺点 3.连接组件标记算法详解算法步骤8连通与4连通公式Python 实现详细解释优缺…

Qt 使用Installer Framework制作安装包

Qt 使用Installer Framework制作安装包 引言一、下载安装 Qt Installer Framework二、简单使用2.1 创建目录结构 (文件夹结构)2.2 制作程序压缩包2.3 制作程序安装包 引言 Qt Installer Framework (安装程序框架)是一个强大的工具集&#xff0c;用于创建自定义的在线和离线安装…

DP-适配器模式代码重新理解

package com.designpatterns.adapter;/*** 定义鸭子接口*/ public interface Duck {/*** 定义鸭子呱呱叫(quack)*/public void quack();public void fly(); }package com.designpatterns.adapter;/*** 实现一个绿头鸭*/ public class MallarDuck implements Duck{Overridepubl…

德国汉堡大学、清华大学联合英国布里斯托机器人实验室的研究工作分享:基于视觉遥操作的多指机械手灵巧操作

德国汉堡大学&#xff08;张建伟院士团队&#xff09;、清华大学&#xff08;孙富春教授和方斌&#xff09;联合英国布里斯托机器人实验室等单位在基于视觉信息遥操作的多指机械手灵巧操作研究方面取得进展。该工作得到了德国科学基金会&#xff08;DFG&#xff09;与中国国家自…

C++合作开发项目:美术馆1.0

快乐星空MakerZINCFFO 合作入口&#xff1a;CM工作室 效果图&#xff1a; 代码&#xff1a; &#xff08;还有几个音乐&#xff01;&#xff09; main.cpp #include <bits/stdc.h> #include <windows.h> #include <conio.h> #include <time.h> #in…

E16.【C语言】练习:输入一个正的整数,逆序打印这个整数的每一位

输入一个正的整数&#xff0c;逆序打印这个整数的每一位 输入&#xff1a;123 输出&#xff1a;321 步骤&#xff1a;1.取出整数的每一位 2.倒序打印 分析&#xff1a;123%103-->123/1012(3被去除了)-->12%102-->12/101(2被去除了)-->1%101(取出最后一位)->…