第五章 定时-计数器
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
//禁止产生中断 //禁止产生中断
//OPTION=0x05; //OPTION=0x05;
(3) 将(X=100)写入TMR0计数寄存器 (X=100)写入 写入TMR0计数寄存器 TMR0=100; TMR0=100; (4) 等待T0IF溢出,溢出时,定时时间已到。 等待T0IF溢出 溢出时,定时时间已到。 溢出, while(!T0IF); 实际程序入下: 实际程序入下:
#include <pic.h> void init(); //I/O口初始化函数 //I/O口初始化函数 void tmint(); //定时器初始化函数 //定时器初始化函数 void main() { init(); tmint(); while(1) { if(T0IF) { T0IF=0; TMR0=100; RC0=!RC0; } } }
定时/ 5.1 定时/计数器功能
定时/ 5.1 定时/计数器功能 5.4.2 计数器功能 所谓计数是指对外部事件进行计数。 所谓计数是指对外部事件进行计数。外部事件的发 生以输入脉冲表示, 生以输入脉冲表示,因此计数功能的实质就是对外来脉 冲进行计数。 冲进行计数。
5.2 定时和计数器硬件结构
PIC16F877单片机配置了3个定时器/计数器模块, PIC16F877单片机配置了3个定时器/计数器模块,分别为 单片机配置了 TMR0、TMR1和TMR2。 TMR0、TMR1和TMR2。 共同点:它们的核心部分都是一个由时钟信号触发, 共同点:它们的核心部分都是一个由时钟信号触发,按递增 方式累加工作的循环计数器; 方式累加工作的循环计数器;从预先设定的某一初始值开始累 在累计到计数器产生溢出, 计,在累计到计数器产生溢出,并同时建立一个相应的溢出中 断标志。 断标志。 三者的不同点: 三者的不同点: TMR0为 位宽,有一个可选的预分频器,用于通用目的, TMR0为8位宽,有一个可选的预分频器,用于通用目的,可用 定时和计数; 于定时和计数; TMR1为16位宽 位宽, TMR1为16位宽,附带一个可编程的预分频器和一个可选的低 CCP( 频时基振荡器,适合与CCP 捕捉/比较脉宽调制) 频时基振荡器,适合与CCP(捕捉/比较脉宽调制)模块 配合使用来实现输入捕捉或输出比较功能, 配合使用来实现输入捕捉或输出比较功能,也可用于定 时和计数; 时和计数; TMR2为 位宽,附带一个配合使用来实现PWM PWM脉冲宽度调制信 TMR2为8位宽,附带一个配合使用来实现PWM脉冲宽度调制信 号的产生,只能用于定时。 号的产生,只能用于定时。
表5—3 TMR0的工作模式 的工作模式 T0CS 0 1 TMR0工作模式 工作模式 定时器 计数器 触发信号的来源 计数器的触发信号取自内部指令周期 计数器的触发信号取自外部引脚T0CKI电 电 计数器的触发信号取自外部引脚 平的上升沿/下降沿 平的上升沿 下降沿
TMR0 定时时间的计算公式: 定时时间的计算公式: t= P ×(28 – X) × T X= 28 – t/(TxP)
用TMR0产生10毫秒的定时时间,在RC0输出一个10毫秒的方波。 TMR0产生 毫秒的定时时间 产生10毫秒的定时时间, RC0输出一个 毫秒的方波 输出一个10毫秒的方波。 用查询方法编写程序,步骤如下: 一、用查询方法编写程序,步骤如下: (1) 求出10毫秒定时时间对应的TRM0的计数初值: 求出10毫秒定时时间对应的 毫秒定时时间对应的TRM0的计数初值 的计数初值: X= 28 – t/(TxP) =256=256-10000/(1x64) =256=256-156 =100(64H) (2) 根据题目的要求,对OPTION_REG配置 根据题目的要求, OPTION_REG配置 T0CS=0; //时钟源为内部指令周期 //时钟源为内部指令周期 PSA=0; //分频器分配给 //分频器分配给TMR0 分频器分配给TMR0 PS2=1; PS1=0; PS0=1; GIE=0; //TMR0的分频比为 //TMR0的分频比为1:64 的分频比为1:64
5.2.1定时器/计数器TMR0的硬件结构 5.2.1定时器/计数器TMR0的硬件结构 定时器 TMR0 TMR0可以用于定时控制、延时、 *TMR0可以用于定时控制、延时、对外部事件进行计 数和检测等场合。 数和检测等场合。 TMR0可以使用内部系统时钟, 也可以使用外部始终。 * TMR0 可以使用内部系统时钟 , 也可以使用外部始终 。 TMR0用于内部定时或对外计数时都不占用CPU时间。 CPU时间 *TMR0用于内部定时或对外计数时都不占用CPU时间。 定时器/计数器TMR 具有以下特点: TMR0 1.定时器/计数器TMR0具有以下特点: TMR0是一个8 (1)TMR0是一个8位宽的由时钟信号上升沿触发的循环 累Fra Baidu bibliotek计数寄存器。 累加计数寄存器。 有一个专用的外部触发信号输入端( CKI-RA4 (2)有一个专用的外部触发信号输入端(T0CKI-RA4 ) 。 TMR0 (3)TMR0也是一个在文件寄存器区域内统一编 址 存器,地址为01 01H 101H 的寄 存器,地址为01H或101H,用户用软件方式可直接 写计数器的内容。 读/写计数器的内容。 具有一个软件可编程的8 预分频器。 (4)具有一个软件可编程的8位预分频器。
2.与定时器/计数器TMR0模块相关的寄存器 与定时器/计数器TMR0模块相关的寄存器 TMR0
(1)选项寄存器 OPTION_REG (1)是作为定时器还是作为计数器 (1)是作为定时器还是作为计数器 (2)决定分频器的分频系数 (2)决定分频器的分频系数 (3)时钟是上升沿 时钟是上升沿/ (3)时钟是上升沿/下降沿触发 (2)中断控制寄存器 INTCON (1)中断总控制--允许 中断总控制--允许/ (1)中断总控制--允许/禁止 (2)各类中断的控制 (2)各类中断的控制 (3)各类中断的标志 (3)各类中断的标志 RA口方向寄存器 (3)RA口方向寄存器 TRISA TMR0工作于计数器时,RA4必须设为输入 工作于计数器时,RA4必须设为输入, 当TMR0工作于计数器时,RA4必须设为输入,以便从该脚输 入时钟脉冲信号。 入时钟脉冲信号。 定时器/ (4)定时器/计数器 TMR0 8位累加计数寄存器
(5)当使用内部触发信号,即指令周期作为时钟信号 当使用内部触发信号, 源时,模块TMR0工作于定时方式, TMR0工作于定时方式 源时,模块TMR0工作于定时方式,触发方式为固 定上升沿触发有效。在计数器溢出时, 定上升沿触发有效。在计数器溢出时,相应的溢 出中断标志T0IF自动置位,并可产生溢出中断。 T0IF自动置位 出中断标志T0IF自动置位,并可产生溢出中断。 (6)当外部时钟信号源时,模块TMR0工作于计数方 当外部时钟信号源时,模块TMR0工作于计数方 TMR0 式,触发方式可由程序设置位上升沿触发或下降 沿触发有效。在计数器溢出时, 沿触发有效。在计数器溢出时,也可产生溢出中 断。
// I/O口初始化函数 I/O口初始化函数 void init() { TRISC=0X00; } //定时初始化(OPTION_REG) //定时初始化( 定时初始化 void tmint() { T0CS=0; //时钟源为内部指令周期 //时钟源为内部指令周期 PSA=0; //分频器分配给 //分频器分配给TMR0 分频器分配给TMR0 PS2=1; PS1=0; PS0=1; //TMR0的分频比为 //TMR0的分频比为1:64 的分频比为1:64
第5章 定时器/计数器 定时器/
内容提要: 内容提要: 定时器/ 5.1 定时器/计数器功能 5.2 定时器和计数器硬件结构 定时器/ 5.3 定时器/计数器工作方式 定时器/ 5.4 定时器/计数器编程
内容要求: 内容要求:
1、熟悉PIC16F87X单片机的定时/计数器功能。 熟悉PIC16F87X单片机的定时/ PIC16 2、熟悉3个定时器/计数器模块的硬件结构。 熟悉3个定时器/ 熟悉掌握与定时器/计数器模块相关的寄存器。 3、熟悉掌握与定时器/计数器模块相关的寄存器。 熟练掌握定时器/计数器工作方式。 4、熟练掌握定时器/计数器工作方式。 熟练掌握定时器/ 5、熟练掌握定时器/计数器编程技术 。
与计数和定时无关
3 定时器 计数器 定时器/计数器 计数器TMR0模块的电路结构和工作原理 模块的电路结构和工作原理
4.分频器和控制逻辑电路 4.分频器和控制逻辑电路 分频器实际上也是一个8 分频器实际上也是一个8位累加计数器,它只能配 合TMR0或WDT输出的时钟由PS2—PS0设定分频比, TMR0或WDT输出的时钟由PS2—PS0设定分频比, 这个分频比由OPTION_REG寄存器中的PS2—PS0决 这个分频比由OPTION_REG寄存器中的PS2—PS0决 定。 5.TMR0累加计数寄存器 5.TMR0累加计数寄存器 TMR0有定时器和计数器两种工作模式。这两种模 TMR0有定时器和计数器两种工作模式。这两种模 式之间的差异是触发信号的来源不同。TMR0的工作模 式之间的差异是触发信号的来源不同。TMR0的工作模 式由T0CS位(选项寄存器OPTION_REG)决定 式由T0CS位(选项寄存器OPTION_REG)决定
定时/ 5.1 定时/计数器功能
定时/ 5.1 定时/计数器功能 定时器功能—起定时延时作用 起定时延时作用和 5.4.1 定时器功能 起定时延时作用 和 在规定的引脚上 输出一定宽度的方波信号。 输出一定宽度的方波信号。
t t
所谓定时功能就是通过来自单片机内部的时钟脉冲 作计数脉冲,使计数器计数,即每个机器周期计数器加1 作计数脉冲,使计数器计数,即每个机器周期计数器加1, 计数值达到予置值后,定时/计数模块产生溢出。 计数值达到予置值后,定时/计数模块产生溢出。
定时器最短的定时时间:t=2x(256定时器最短的定时时间:t=2x(256-255)x1uS=2uS 定时器最长的定时时间:t=256x(256定时器最长的定时时间:t=256x(256-0)x1uS=65536uS
在使用TMR0做定时器时 可以用查询 在使用TMR0做定时器时,可以用查询和中断 做定时器时, 查询和 的方法获得定时时间。 的方法获得定时时间。 1、查询方法: 查询方法: 在将初值写入TMR0时 立即查询T0IF是 在将初值写入TMR0时,立即查询T0IF是 否等于1 如果T0IF=1,表示时间已到, 否等于1,如果T0IF=1,表示时间已到,若 T0IF=0,表示时间未到,继续等候。 T0IF=0,表示时间未到,继续等候。 2、中断方法: 中断方法: 设置中断服务子程序,每当TMR0溢出时 溢出时, 设置中断服务子程序,每当TMR0溢出时, 进入中断服务程序,得到一个准确的定时时间。 进入中断服务程序,得到一个准确的定时时间。 TMR0的定时程序举例: TMR0的定时程序举例: 的定时程序举例
GIE=0; //禁止产生中断 //禁止产生中断 T0IF=0; //清除定时器 //清除定时器0中断标志 清除定时器0 TMR0=0X64; //预置TMR0初值 //预置 预置TMR0初值 }
#include <pic.h> void init(); //I/O口初始化函数 //I/O口初始化函数 void tmint(); //定时器初始化函数 //定时器初始化函数 void interrupt dealtime(); void main() { init(); tmint(); while(1) { ; } }
t:设定的定时时间—uS 设定的定时时间— P:分频器的分频比--2~256 分频器的分频比--2 取值为2 16、32、64、128、256。 取值为2、4、8、16、32、64、128、256。 X:TMR0的计数初值--0~255 TMR0的计数初值 0 的计数初值-T:指令周期—uS 指令周期—