定时器_计数器的介绍与使用

在介绍定时器之前我们先放一张表格,我们会反复用到

定时功能与计数器功能

定时功能:所谓定时功能其本质就是对来自于单片机内部的时钟脉冲作为计数脉冲,使计数器计数,即按照设定值加一,当计数值达到设置的值后,定时/计数模块产生溢出。
计数器功能:所谓计数器功能就是对外部事件进行计数,外部事件的发生以输入脉冲表示(引脚为RA4/TOCKI,RC0)
定时功能对内部脉冲进行计数,计数功能对外部脉冲进行计数

PIC887单片机配置有三个定时器/计数器模块,分别为:TMR0,TMR1和TMR2。
三个定时器/计数器共同点:按照递增方式进行累加工作,累加到计数器溢出,同时产生一个对应的溢出中断标志(和上节课中断有关)
异同点可以看看图:

预分频:实现计数/记时范围的扩大

比如1:128就是每来128计为1次。

TMR0


TMR0的特点:
1.TMR0是个8位计数器,所以总共可以记录2^8=256个数,从0开始到255.
2.对内部时钟进行计数的时候,触发方式固定为上升沿计数。溢出后标志位T0IF变为1.可以通过查询或者中断的方式实现控制逻辑
3.当对外部时钟源进行计数的时候,TMR0工作在计数器模式,此时触发方式可以由自己设置。即
注意区分外部中断触发设置,这里0/1代表意思不同。在计数器中,1代表下降沿,0代表上升沿。在外部事件触发中断中INTEDG,相反。
4.这就要求我们使用计数器TMR0前要对其进行初始化
TMR0使用
几个需要初始化的端口介绍:
1.OPTION_REG

我们需要关注的几个端口在后面。前两个(高位第一和第二)我们在这节课中先不关注。抓住主要矛盾去分析。
初始化说明1
1.TOCS 这个是设置你TMR0处在什么工作状态 1是外部 0是内部
2.TOSE 这个是给你设置当处在外部输入的时候,是上升沿计数还是下降沿计数。只有在TOCS选择1的时候才需要去设置它
3.PSA 用于预分频的分配位 是把预分频功能给TMR0还是WDT(看门狗)
4.PS2–PS0 用于设置预分频的比率


2.INTCON 中断控制寄存器
如果要采取中断而不是查询的方式实现逻辑控制,这时候就得使用到INTCON

初始化声明2
1.总开关打开GIE=1
2.分开关打开 T0IE=1
注意:T0IF是标志位!!!溢出后要进行清0
初始化声明3
PORTA的模式定义:即TRISA
由于四号是输入引脚,所以定义的时候要注意定义为输入
1.TRISA=0b00001000
同时要注意外部电路也应该能够提供脉冲信号
初始化声明4
要对TMR0进行赋初值!!! 看例题2

TMR0题目

假设晶振振荡频率fosc=4MHz,求TMR0最大延时时间是多少?

/*
指令周期是机器周期的4倍
指令周期Tcy=1us
TMR0的最大延时时间为:
256×256×Tcy=65536×Tcy=65536us。
*/

假设现要延时12ms,即12000us.请问如何配置TMR0?

1.先计算预分频系数K:
256×K×Tcy=12000,得K=48.9,取K=64 //此时预分频比就应该设置为1:64
2.再计算延时常数X:
(256-X)×K×Tcy=12000,得X=68.5,四
舍五入取整X=69,即:TMR0=69 //即赋初值,可以采取宏定义的方式

注意事项

课件PPT例题可以看一看,这道题体现了上面提到的知识点。


若此时延迟的时间超过了TMR0的最大计时时间,可以采用IF语句的方式实现
注意static是一个关键字,意思是静态变量。使用了这个字符延长了子函数中变量的生命周期,否则子函数中的变量一旦子函数执行完毕,就被消灭,无法直接保存。

双灯也是差不多的,不过要考虑好可能出现的特殊情况

查询的方式实现上面的功能

TMR1

有了TMR0的基础,TMR1就比较好学习和掌握

外部输入的计数初始化

可能需要使用到的几个寄存器


这里的门控信号可以理解为三态门中的使能引脚,当输入的某个端口符合某种要求的时候,TMR1工作。(这个知识点后续会学习到,现在追求知道就好,不求甚解即可)
老问题:
晶振振荡频率fosc=4MHz,TMR1的最大延迟时间为?

指令周期是机器周期的4倍
指令周期Tcy=1us
TMR0的最大延时时间为:
65536×8×Tcy=524288×Tcy=524,288us。

4MHz晶振,若要延时100ms,即100,000us.请计算TMR1的配置

1.先计算预分频系数K:
65536×K×Tcy=100000,得K=1.52,取K=2
2.再计算延时常数X:
(65536-X)×2×Tcy=100000,得
X=15536=0x3CB0,即TMR1H=0x3C,TMR1L=0xB0

注意事项
◼ 在定时初始化时TMR1需赋初值;
◼ 一次定时完成后需重新赋初值;
◼ 一次定时完成后需清除中断请求标志位TMR1IF;
◼ TMR1有启/停控制开关TMR1ON;
◼ 门控TMR1:指TMR1只有当某指定引脚(RB5/T1G)的输出值满足要求时,才能进行工作;
◼ 当T1CON.TMR1GE=0时,关闭门控功能,即TMR1始
终工作。
由于TMR1由两个寄存器组成,所以可能发生读取一个寄存器的时候,另一个寄存器发生了进位,导致读取的数值是有问题的。
例如:假设当前TRM1H_TMR1L=0x01FF,则在读取TMR1时就可能发生错误:
➢ 如先读低字节0xFF,假设此时发生进位,则结果
为0x2FF,显然是错误的
➢ 如先读高字节0x01,假设此时发生进位,则结果
是0x100,显然也是错误的
所以在读取TMR1的时候就要格外的注意:
1.如果允许的话,在读之前让TMR1停止计数
2.如果不允许停止计数,则先读高字节,再读低字节,再读一次高字节,如果前后2次读的高字节不同,说明在读期间发生了进位。

A=TMR1H; //先读高字节
B=TMR1L; //再读低字节
C=TMR1H; //再读高字节
if(A==C) //判断读期间是否发生从低字节向高字进位
X=(A<<8)+B; //没有进位,就用第一次读高字节的结果
else
X=(C<<8)+0; //发生进位,用第二次读高字节的结果

右移:低位移出,高位补0;
左移:丢弃高位,最低位补0;
例题1


宏定义中AAA 定义为 65536-10 TMR1最大的计数次数为665536,由于按10次引起中断,所以减去10;

TMR2(略微学习即可)




TMR2编程注意事项
◆在定时初始化时需赋值PR2;
◆一次定时完成后无需重新赋初值;
◆一次定时完成后需清除中断请求标志位TMR2IF;
◆TMR2有启/停控制开关TMR2ON

作业

/** File:   demo05.c* Author: Xueziqiang** Created on 2022年3月27日, 下午10:44*/
// PIC16F887 Configuration Bit Settings// 'C' source line config statements// CONFIG1
#pragma config FOSC = XT        // Oscillator Selection bits (XT oscillator: Crystal/resonator on RA6/OSC2/CLKOUT and RA7/OSC1/CLKIN)
#pragma config WDTE = OFF       // Watchdog Timer Enable bit (WDT disabled and can be enabled by SWDTEN bit of the WDTCON register)
#pragma config PWRTE = OFF      // Power-up Timer Enable bit (PWRT disabled)
#pragma config MCLRE = OFF      // RE3/MCLR pin function select bit (RE3/MCLR pin function is digital input, MCLR internally tied to VDD)
#pragma config CP = OFF         // Code Protection bit (Program memory code protection is disabled)
#pragma config CPD = OFF        // Data Code Protection bit (Data memory code protection is disabled)
#pragma config BOREN = OFF      // Brown Out Reset Selection bits (BOR disabled)
#pragma config IESO = OFF       // Internal External Switchover bit (Internal/External Switchover mode is disabled)
#pragma config FCMEN = OFF      // Fail-Safe Clock Monitor Enabled bit (Fail-Safe Clock Monitor is disabled)
#pragma config LVP = OFF        // Low Voltage Programming Enable bit (RB3 pin has digital I/O, HV on MCLR must be used for programming)// CONFIG2
#pragma config BOR4V = BOR40V   // Brown-out Reset Selection bit (Brown-out Reset set to 4.0V)
#pragma config WRT = OFF        // Flash Program Memory Self Write Enable bits (Write protection off)// #pragma config statements should precede project file includes.
// Use project enums instead of #define for ON and OFF.#include <xc.h>
#define T0_10MS 100
#define LED0 RD0
#define LED1 RD1
#define LED2 RD2
//单片机的RD0、RD1、RD2分别接一个LED,让TMR0处于定时模式,让三个LED分别每隔10ms、100ms以及1s闪亮。
//经过计算,10ms 预分频选择64 (预分频选择101)初始值为100
void __interrupt() INT_SER(void);
char L;
void main(void) {TRISD=0B00000000;OPTION_REG=0B10000101;// 10,000,101; 000中第一个0表示选择内部时钟,第二0这里没有用到随意 第三0表示把预分频器给TMR0INTCON=0B10100000;TMR0=T0_10MS;PORTD=0;LED0=1;L=1;while(1);return;
}
void __interrupt() INT_SER(void){static char M =0;static int N =0;if(T0IF==1){PORTD=0;T0IF=0;TMR0=T0_10MS;if(L==1){LED0=1;L=0;}else{LED0=0;L=1;}M++;N++;if(M==10){M=0;LED1=1;                   }if(N==100){N=0;LED2=1;}}}
/** File:   TMR1.c* Author: Xueziqiang** Created on 2022年3月28日, 下午5:50*/// PIC16F887 Configuration Bit Settings// 'C' source line config statements// CONFIG1
#pragma config FOSC = XT        // Oscillator Selection bits (XT oscillator: Crystal/resonator on RA6/OSC2/CLKOUT and RA7/OSC1/CLKIN)
#pragma config WDTE = OFF       // Watchdog Timer Enable bit (WDT disabled and can be enabled by SWDTEN bit of the WDTCON register)
#pragma config PWRTE = OFF      // Power-up Timer Enable bit (PWRT disabled)
#pragma config MCLRE = OFF      // RE3/MCLR pin function select bit (RE3/MCLR pin function is digital input, MCLR internally tied to VDD)
#pragma config CP = OFF         // Code Protection bit (Program memory code protection is disabled)
#pragma config CPD = OFF        // Data Code Protection bit (Data memory code protection is disabled)
#pragma config BOREN = OFF      // Brown Out Reset Selection bits (BOR disabled)
#pragma config IESO = OFF       // Internal External Switchover bit (Internal/External Switchover mode is disabled)
#pragma config FCMEN = OFF      // Fail-Safe Clock Monitor Enabled bit (Fail-Safe Clock Monitor is disabled)
#pragma config LVP = OFF        // Low Voltage Programming Enable bit (RB3 pin has digital I/O, HV on MCLR must be used for programming)// CONFIG2
#pragma config BOR4V = BOR40V   // Brown-out Reset Selection bit (Brown-out Reset set to 4.0V)
#pragma config WRT = OFF        // Flash Program Memory Self Write Enable bits (Write protection off)// #pragma config statements should precede project file includes.
// Use project enums instead of #define for ON and OFF.
/** 单片机的RD0~7分别接一个LED,RC0接一个开关,让TMR1处于计数模式,每按一次开关,计数一次,并在LED上显示。*/
#include <xc.h>
#define AAA 65536-1
void __interrupt() INT_SER(void);
void DELAY(unsigned int n);
char A=1;
void main(void) {TRISD=0B00000000;TRISC=0B00000001;PORTD=0;ANSELH=0;GIE=1;PEIE=1;TMR1IE=1;TMR1H=AAA>>8;TMR1L=AAA;T1CON=0B00000011;while(1);return;
}
void __interrupt() INT_SER(void){if(TMR1IF==1){/*下面这种解法是满8次就清零*/DELAY(200);TMR1IF=0;TMR1H=AAA>>8;TMR1L=AAA;switch(A){case 0: PORTD=0;break;case 1: PORTD=0B00000001;break;case 2: PORTD=0B00000011;break;case 3: PORTD=0B00000111;break;case 4: PORTD=0B00001111;break;case 5: PORTD=0B00011111;break;case 6: PORTD=0B00111111;break;case 7: PORTD=0B01111111;break;case 8: PORTD=0B11111111;break;        }A++;if(A==9){A=0;}/* 满256后自动复位static int count=0;if(TMR1IF==1){DELAY(30);TMR1IF=0;TMR1H=AAA>>8;       //计时器再赋初值TMR1L=AAA;count++;if(count==256)  count=0;PORTD=count;}  */}}
void DELAY(unsigned int n){unsigned int j;char k;for (j=0;j<n;j++){for(k=256;k>0;k--) NOP();}
}

【单片机原理及其应用】第五章定时器的介绍和习题分析相关推荐

  1. 计算机改计数器的方法,第五章定时器计数器(修改)-计算机原理及应用资源共享课.ppt...

    第五章定时器计数器(修改)-计算机原理及应用资源共享课.ppt 1 第5章 MCS-51单片机定时器/计数器 主要内容 定时/计数器的工作原理模式 定时/计数器的工作方式 定时/计数器的应用 2 (1 ...

  2. HT合泰单片机入门教程(第五章 PWM)

    文章目录 系列文章目录 前言 一.新建工程 二.PWM相关了解 1.PWM了解 2.硬件电路了解 三.PWM实现 1.代码实现 总结 系列文章目录 第一章 HT单片机环境搭建 第二章 点亮第一个LED ...

  3. 计算机原理与应用第五章——半导体存储器

    第五章--半导体存储器 文章目录 第五章--半导体存储器 一.半导体存储器概述※ (一)分类 (二)结构 二.典型存储器芯片及其接口特性※ (一)典型的SRAM--6116 (二)典型的DRAM--2 ...

  4. HT合泰单片机入门教程(第四章 定时器)

    文章目录 系列文章目录 前言 一.新建工程 二.定时器计数功能实现 1.定时器了解 2.中断了解 三.定时器实现 1.代码实现 总结 系列文章目录 第一章 HT单片机环境搭建 第二章 点亮第一个LED ...

  5. [计网:原理与实践] 第五章:端到端协议(课后习题整理)

    第五章 端到端协议 5-1 说明在包括大量应用进程的应用层与支持主机到主机端到端通信的网络层之间设置运输层的必要性.运输层应当提供的服务包括哪些?   运输层运行在位于因特网边缘的端系统上,对上直接为 ...

  6. 单片机原理及应用 实验五 电子秒表显示器

    单片机原理及应用(C51版) 功能:绘制实验电路原理图,程序开始时显示"00":当1s产生时,秒计数加1:秒表显示器计数到59后,自动从"00"开始. 目的:掌 ...

  7. 何宾 单片机原理及应用_STC单片机原理及应用——从器件、汇编、C到操作系统的分析和设计(立体化教程)(第2版)...

    第1章 单片机和嵌入式系统基础知识 1.1 嵌入式系统的基本概念 1.1.1 嵌入式系统的主要特点 1.1.2 嵌入式技术的构成 1.28 051微控制器的内部架构 1.38 051单片机硬件开发平台 ...

  8. 计算机科学导论第五章计算机组成 学习笔记+习题答案

    第五章 计算机组成 通过本章的学习,学生应该能够∶ 列出计算机的三个子系统; 描述计算机中央处理单元(CPU)的作用; 描述典型计算机中指令周期的取指令-译码-执行阶段; 描述主存和它的地址空间; 区 ...

  9. 单片机原理与应用设计第二章(AT89S51)

    目录 目录 一.硬件组成 AT89S51单片机片内结构 AT89S51引脚功能 3.并行I/O口引脚 P0口 P0口:地址/数据总线 数据输出 数据输入 P0口:通用输入输出功能 P1口 P2组I/O ...

最新文章

  1. iis 程序池设置及详解-20180720
  2. 【ARM】ARM汇编程序设计(三) 循环结构
  3. 有效的括号—leetcode20
  4. Web应用程序体系结构– Spring MVC – AngularJs堆栈
  5. java package报错_Java基础知识总结 - 超详细篇(上)
  6. 退出出库复核是什么意思_细思极恐!为什么是黄晓明退出而不是李菲儿?因为女方是芒果艺人...
  7. 比较两种php调用Java对象的方法
  8. Python3.6字符串新特性
  9. C++类模版demo
  10. 系统学习NLP(十二)--文本表示综述
  11. Springmvc和poi3.9导出excel并弹出下载框
  12. 小程序的购物商城源码(前端+后端)
  13. 2016年数学建模-A 系泊系统设计
  14. 电力线通信有望在物联网应用中大放异彩
  15. jq ui autocomplete的使用
  16. 图片放大缩小js工具
  17. cada0图纸框_按1:1画图后如何出A0图纸图框怎么设置?
  18. leetcode 1219. 黄金矿工
  19. '/0'和/0的区别
  20. Combining Sketch and Tone for Pencil Drawing Production 论文阅读(1)

热门文章

  1. linux shell 快速掌握
  2. 基于C#winform的学生信息管理与成绩评价系统
  3. 易编远航程序防封防检测方法
  4. 公众号开发精品教程(2)——将项目接入微信及简单交互
  5. 贴一点代码(用VC实现在WINXP下的宽带拨号)
  6. 关于DIN 5510-2德国轨道车辆防火测试标准
  7. 教你在一分钟之内,将100页Word转换为PPT,简直太厉害了
  8. LeetCode1-580题汇总,希望对你有点帮助!
  9. Hexo-github日历图
  10. 奇兔recovery卡刷教程_奇兔Recovery(安卓手机刷机助手)V8.2.1.4 最新版