案例4-定时器综合应用

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

y1=32.82+17.34*x1(us) y2=41.79+26.01*x2(us)
• 若要实现1S的延时,N的数值约为多少? • X2=(1000 0000uS-41.79uS)/26.01=38445 • 但这种估计建立在特定的晶振频率基础上;若晶振频率改变,规律得重新进 行实验,相当繁琐。
delay函数延时的缺陷

定时/计数器功能
• 不同处理器定时/计数器功能有 所不同,可分为:
– 计数位数
• 8位: 最多计256次 • 16位:最多计65536次
• 由于计数是由硬件实现的,即计数 过程无需处理器软件参与。处理器 所要做的工作只是对计数器的初始 化与计数结束后的相关操作。 • 目前部分处理器(STM32)将计数完成 后的工作做成自动运行模式,扩展 了计数器的应用: – 输入捕获模式 – PWM 输入模式 – 强制输出模式 – 输出比较模式 – PWM 模式 – 单脉冲模式(OPM) – 编码器接口模式
• IE:Interrupt Enable Register //reg51.h
• sbit EA =0xAF; //总的中断允许控制位,高电平有效 • sbit ET1=0xAB; //T1 中断允许控制位,高电平有效 • sbit ET0=0xA9; //T0 中断允许控制位,高电平有效
8051 定时/计数器-编程
8051 定时/计数器-计数初值
• 【赋计数初值】 • 其它手段计数初值TH、TL的确定 • #define COUNT 50000//计数次数
– 方法一:位操作
– 方法三:共用体法 union T_C TH0=(unsigned char)((65536-COUNT)>>8); TL0=(unsigned char)((65536-COUNT)&0x00ff);{ unsigned int data16; unsigned char data8[2]; }; void main(void) { – 方法二:对256求整、求余法 union T_C T0_count; T0_count.data16=65536-COUNT; TH0=(65536-COUNT)/256; TH0=T0_count.data8[0]; TL0=(65536-COUNT)%256; TL0=T0_count.data8[1]; }
• • • • • • • • • • • • •

void main(void) { TMOD=(TMOD&0xf0) |0x01; TH0=(65536COUNT)/256; TL0=(65536COUNT)%256; ET0=1; EA=1; TR0=1; while(1) { ; } }
8051 定时/计数器-中断原理
• • 定时器:如果信号是周期 对于接在定时/计数器上的外部脉冲信号类型, 信号(T),若计数值为n, 处理器是没有办法要求的。因此定时器/计数 则定时时间t=n*T 器的功能分为: • 外部计数:对外部的脉冲信号计数 • 内部定时:对处理器内部的周期信号进行 计数,次数乘以机器周期即为定时时间 因此统一到一点,定时、计数都是计数
8051 定时/计数器-工作方式
• GATE:门控位(高电平有效)
• 【定义工作方式】 – TMOD:定时器工作方式寄存器, • C/T#:计数/定时器选择控制位 该寄存器不能位寻址。 – 1:外部计数方式 • 高4位:T1工作方式 – 0:内部定时方式 • 低4位:T0工作方式 – 0:启动仅受TR*信号控制 – 1:启动受TR*与INT#引脚信号双 重控制
• 之前延时采用delay函数实现,而延时时间无法 精确估算,如下:
void delay(unsigned char n) { unsigned char i; for(i=0;i<n;i++) ; } void delay(unsigned int n) { unsigned int i; for(i=0;i<n;i++) ; }
• M1 M0:计数方式(位数)定义
8051 定时/计数器-工作方式
定时/计数器工作方式 M1 M0 方式 功 16位定时器/计数器 常数自动载入的8位定时器/计数器 仅适用于T0,两个8位定时器/计数器 能
0
0 1 1
0
1 0 1
0
1 2 3
13位定时器/计数器,TL存低5位,TH存高8位
• 【定义工作方式】 – 要求:试定义T0为16位内部定时方式 • TMOD=**** 0001B 即:TMOD=0x01;//TMOD=0000 0001B • 以上语句的实际功能是:定义T0为16位内部定时方式,同时修改 T1为13位内部定时方式。这样就改变了T1的工作方式。 – 要求:试定义T0为16位内部定时方式,而保持T1原有的工作方式。 • TOMD=(TMOD&0xf0)|0x01;
– 启动后,定时器开始硬件计数,计数满产生溢出标志
• TF0:高电平有效 • TF1
8051 定时/计数器-中断原理
• 【定时器中断控制】
– 8051单片机为T0、T1设置了中断机制。即当计数溢出(TF=1)时CPU可 停止当前的任务,自动跳转到对应(固定)的入口地址处,执行中断 服务程序(ISR:Interrupt Service Routine),等中断服务程序执行 完成后回到原被中断处继续执行。 • 因此中断服务程序应事先写好,另中断服务程 序是否执行受对应的中断允许位控制 • 中断允许:溢出时自动执行中断服务程序; • 中断不允许:溢出时不执行中断服务程序。 • T0、T1的中断允许控制位见下
• 用示波器测量P1_0引脚上的 方波信号周期T
• 则delay(N)的延时时间即为T/2, 改变N的值完成下表,即可统计 出delay函数的延时规律。
延时函数统计规律(fosc=11.0592MHz)
delay(n) unsigned char(uS) unsigned int(uS) 0 34 43.6 1 49.9 67.2 2 67.2 93 3 84.7 120 4 102 146 5 119.4 172 6 136.7 197 7 154.1 224 8 171.4 249 9 188.8 276 10 206.1 302 11 223.5 327 12 240.9 354 13 258.2 380 14 275.6 406 15 293 432 16 310.2 458 17 327.6 484 18 345 510 19 362.4 536 20 379.8 562
• 另该延时采用软件等待方式实现,延时过程中, CPU不执行任何“有用”操作,对其后的任务执 行会产生影响。
延时时间测量方法
#include "reg51.h" #define N 1 sbit P1_0=P1^0; void delay(unsigned char n) { unsigned char i; for(i=0;i<n;i++) ; } void main(void) { P1_0=0; while(1) { P1_0=~P1_0; delay(N); } }
– 若T0中断不允许(ET0=0或EA=0) • 问题: • 1、T0溢出标志TF0与T0中断使能控制位ET0、EA间的关系是什么? • 2、T0溢出时,16位计数器的当前计数值为多少? • 3、T0在中断服务程序内是否计数?
• 则不执行中断服务程序 • 中断标志TF0也不能自动清0)
8051 定时/计数器-计数值重载
8051 定时/计数器-计数初值
• 【赋计数初值】 • 8051单片机计数方式:递增溢出; 若采用16位计数 –当计数初值为65535(0xffff) 时,计数1次就溢出 –最少计1次溢出
–当计数初值为0(0x0000)时, 计数65536次后溢出 –最多计65536次溢出
8051 定时/计数器-计数初值
– 计数方式
• 固定递增:加1计数 • 固定递减:减1计数 • 可设置递增、递减
– 脉冲触发方式
• • • • 固定上升沿计数 固定下降沿计数 双沿计数 可设置边沿计数
8051 定时/计数器
• 8051单片机有两个16位的定时/计数器 T0、T1,8052有第三个T2 – 计数位数 • 8位: 最多计256次 • 16位:最多计65536次 – 计数方式 • 定时/计数器使用前,处理器必须对其进行 • 固定递增:加1计数 初始化,具体操作包括: – 脉冲触发方式 – 定义工作方式 • 固定下降沿计数
• 【赋计数初值】 • 8051单片机计数方式:递增溢出;若采 用16位计数 – 问题:若要加50000次出现溢出,则 计数初值应如何确定?
– 十进制计数初值 • 65536-50000=15536
– 因此本例的计数初值为 – 十六进制计数初值 – TH=0x3C;//15536的高8位 • (15536)D=0x3CB0 – TL=0xB0;//15536的低8位 • 但8051单片机为8位机,它是通 过两个8位寄存器来存储16位计 数初值,即 – 但此方法涉及十进制到十六进 • TH:高8位计数值(初值) 制转换过程,操作不便。可考 虑采用其它手段实现。 • TL:低8位计数值(初值)
8051 定时/计数器-编程
• • • • • • • •
#include "reg51.h" #define COUNT 50000 void T0_ISR(void) interrupt 1 { //TF0=0; TH0=(65536COUNT)/256; TL0=(65536COUNT)%256; //中断程序添加 处 }
案例4 定时器及其应用 ftp://10.28.86.201 用户名:stu 密码:stu
2014.10.16
案例4 定时器及其应用
• 问题提出
–软件延时 –硬件延时
• 定时器应用案例
– 简单应用 – 综合应用 – 工程应用
•Hale Waihona Puke Baidu定时/计数器工作原理 • 初始化 • 中断服务程序
问题提出-软件延时函数
• 启动定时器(TR0=1)后,T0从计数初值处对机 器周期进行硬件递增计数;当计至 TH0=0xff,TL0=0xff后,再计1次则定时器产 生溢出(溢出标志TF0=1): • 此时 – 若中断允许(ET0=1且EA=1)
• 则CPU立即停止当前程序 • 自动跳转到T0对应的中断入口(中断号为1 的ROM保留地址0x000B)处 • 硬件自动清溢出标志(TF0=0) • 执行中断服务程序 • 中断服务程序执行完后回原执行程序处;
• T0的计数是硬件实现的,因此不管在主程序还是中断服务程 序内,计数器都在计数。 • 在进入中断服务程序瞬间,当前计数值为TH0=0、TL0=0,对 于某些实际应用需对计数初值进行重载,方法见下:
• 【方法1】 void T0_ISR(void)interrupt 1 { TH0=(65536-COUNT)/256; TL0=(65536-COUNT)%256; //中断程序 } 先重载计数初值,后执行中断程序 • 【方法2】 void T0_ISR(void)interrupt 1 { //中断程序 TH0=(65536-COUNT)/256; TL0=(65536-COUNT)%256; } 先执行中断程序,后重载计数初值
• 对应的外部计数引脚为如图: – Pin14(T0) – Pin15(T1)
• 8位还是16位 • 定时还是计数等 – 赋计数初值 • 计数可从任意值开始,因此应根据 具体要求确定计数初始值 – 启动计数器 • 初始化完成后,定时/计数器需要 启动,一启动就开始硬件计数,计 数完成自动产生溢出标志,CPU根 据溢出标志执行预先约定的操作。
8051 定时/计数器-控制位
• 【定时器启动】
– TCON:Timer Control Register
• • • • • • • /* TCON */ #include “reg51.h” sbit TF1 = 0x8F; sbit TR1 = 0x8E; sbit TF0 = 0x8D; sbit TR0 = 0x8C; TR0=1;//Trigger T0启动控制位,高电平有效 TR1=1;
• 定时/计数器 • delay延时函数缺陷 – 定时/计数器是一硬件资源,对应 – 不能实现精确延时 有脉冲输入接口 – 该延时由软件实现,延时期间无 – 计数器:若对应端口上输入非周 法执行其它任务,对于某些特定 期信号,该硬件能实现脉冲计数 时序的任务会造成影响。 • 为此要引入一种由硬件定时的电路 – 定时/计数器
相关文档
最新文档