290 likes | 576 Views
定时器 (Timer) / 计数器 (Counter). 定时器 / 计数器模块是大部分单片机都内置的一项重要功能模块,定时器 / 计数器一般表现为对数字脉冲信号的累计功能。. 为什么叫 “ 定时器 / 记数器 ”. 当此信号发生 频率固定 时,记数器就成了定时器。. 本质是记录数字 脉冲 信号的发生次数. PIC16F877 定时器模块简介. TMR. Flag 位. TMR. MAX VALUE. 0. 三者的共同点:.
E N D
定时器(Timer)/计数器(Counter) 定时器/计数器模块是大部分单片机都内置的一项重要功能模块,定时器/计数器一般表现为对数字脉冲信号的累计功能。
为什么叫“定时器/记数器” • 当此信号发生频率固定时,记数器就成了定时器。 • 本质是记录数字脉冲信号的发生次数
TMR Flag位 TMR MAX VALUE 0 三者的共同点: 它们的核心部分都是由脉冲信号触发的循环加计数器;从预先设定的某初始值开始累加,在累加发生上溢时,计数器清零,并且同时会对一个标志位(TXIF)置位。 1 0 ╋ ╋
TMRO的特点 • 在RAM中地址是H’01’,8位,TMR0; • 此寄存器用户可用软件读写; • 具有一个8位分频器寄存器OPTION_REG; • 与WDT(WatchDog Timer)共用 一个硬件模块。 • 可内部计数,也可外部触发。
TMR0的用途 TMR0的用法有两种: 1、由外部的RA4引脚输入做记数信号,此时做记数用。 2、由内部晶振提供记数信号,此时做定时器用。
TMR0模块的电路结构和工作原理(126页) PSA PS2 PS1 PS0 TOCS
TMR0模块相关的寄存器 • 选项寄存器 OPTION_REG • 端口RA方向控制寄存器TRISA • 定时器/计数器 TMR0 • 中断控制寄存器INTCON
TRISA相关位介绍 • RA4引脚置为输入状态,TMR0才能可能记录MCU外部的数字信号变化次数。 • 如何把RA4引脚置为输入状态? • TRISA=0b00010000;
中断控制寄存器INTCON相关位介绍 如何设置系统中只响应TMR0中断? INTCON =0b10100000;
用法一:作为内部定时器 • 初始化步骤:RA4置为输入OPTION赋初值,T0CS=0TMR0赋初值INTCON赋初值 • 使用方法:1)、查询T0IF位;2)、中断中判断T0IF位;
用法二 作为外部计数器 • OPTION赋初值,T0CS=1 • 其他同上
+5V 使用举例1 • 啤酒自动生产线的装箱部分模拟:RA4输入24个脉冲后,PORTD的值加一并输出。 RA4 RD0 …… 16F877 RD7 电源电路 . . . 复位电路 晶振电路 GND
程序分析: • RA4输入24个外部脉冲后触发加一事件,所以可以让TMR0每隔24个外部脉冲后溢出一次,产生中断,在中断中把PORTD口值加一输出。
初始化代码 • OPTION=0b00101000 ; • TMR0=0-24; • TRISA=0b00010000 ; • INTCON =0b10100000 ; • TRISD=0; //外部,1:1 // 24个脉冲溢出 //RA4输入 //T0IE=1,使能TMR0中断 //D口全为输出方式
中断处理代码 void interrupt ISR(void) { if((INTCON&0b00000100)!=0){ INTCON=INTCON&0b11111011; TMR0=0-24; PORTD++; } } //判断T0IF是否为1 // T0IF是1,则清空此标志位 // TMR0初值仍为(0-24) // D口值加一
代码分析 • 通过例程理解OPTION寄存器各个位的作用: • T0CS,T0SE • PSA,PS2,PS1,PS0
使用举例2 • 电路图如图所示,采用TMR0的中断方式实现每隔1秒钟LED小灯显示的值加一 RD0 …… 16F877 RD7 电源电路 . . . 复位电路 4MHz晶振 GND
程序分析: • TMR0的最大溢出间隔是 个脉冲? • 如何能记录1秒钟的时间间隔呢? • 再人为加入一个计数器,TMRCNT; • 让TMR0的溢出时间间隔是50000个脉冲 • 当TMRCNT记录20次后执行PORTD口加一 65536
初始化代码 • OPTION=0b00000111 ; • TMR0=0; • INTCON =0b10100000 ; • TRISD=0; //1:256 // 256次后溢出 //T0IE=1,使能TMR0中断 //D口全为输出方式
中断处理代码 void interrupt ISR(void) { if((INTCON&0b00000100)!=0){ INTCON=INTCON&0b11111011; TMR0=0; PORTD++; } } //判断T0IF是否为1 // T0IF是1,则清空此标志位 // TMR0初值仍为0 // D口值加一
代码分析 • 通过例程理解内部触发的概念
作业 • 采用TMR0内部触发中断实现数码管每隔一秒加一效果
OPTION_REG相关位介绍地址:(81H),第124页 T0CS TOSE PSA PS0~PS2:分频倍数选择位 PSA:分频选择位(1:WDT,0:TMR0) T0SE:触发沿选择位(Source Edge) T0CS:(Clock Source) 0 :内部晶振输出(Clock OUT) Fosc/4 1 :外部输入(Input)
PS2 PS1 PS0 PSA=0,TMR0 PSA=1,WDT 000 1:2 1:1 001 1:4 1:2 010 1:8 1:4 011 1:16 1:8 100 1:32 1:16 101 1:64 1:32 110 1:128 1:64 111 1:256 1:128 PSA,PS2,PS1,PS0的功能
计算题 • 主频4MHz,TMR0初值是6,OPTION=0b00000111; 请问TMR0 • 寄存器多长时间溢出一次?
OPTION设置举例1 • 主频为4MHz,使TMR0为内部时钟触发,设TMR0的初值为0,约每隔0.065535秒溢出一次; • OPTION =0b10000111; 4/4MHz=106个脉冲/s 0.065535秒=65535个脉冲
OPTION_REG设置举例2 • 使TMR0为外部脉冲触发,每一个脉冲上升沿TMR0值加一: • OPTION=0B00101000;