案例4-定时器综合应用
8051 定时/计数器-编程
• • • • • • • •
#include "reg51.h" #define COUNT 50000 void T0_ISR(void) interrupt 1 { //TF0=0; TH0=(65536COUNT)/256; TL0=(65536COUNT)%256; //中断程序添加 处 }
• 对应的外部计数引脚为如图: – Pin14(T0) – Pin15(T1)
• 8位还是16位 • 定时还是计数等 – 赋计数初值 • 计数可从任意值开始,因此应根据 具体要求确定计数初始值 – 启动计数器 • 初始化完成后,定时/计数器需要 启动,一启动就开始硬件计数,计 数完成自动产生溢出标志,CPU根 据溢出标志执行预先约定的操作。
• 【赋计数初值】 • 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位计数值(初值)
• 启动定时器(TR0=1)后,T0从计数初值处对机 器周期进行硬件递增计数;当计至 TH0=0xff,TL0=0xff后,再计1次则定时器产 生溢出(溢出标志TF0=1): • 此时 – 若中断允许(ET0=1且EA=1)
• 则CPU立即停止当前程序 • 自动跳转到T0对应的中断入口(中断号为1 的ROM保留地址0x000B)处 • 硬件自动清溢出标志(TF0=0) • 执行中断服务程序 • 中断服务程序执行完后回原执行程序处;
• 另该延时采用软件等待方式实现,延时过程中, 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); } }
y1=32.82+17.34*x1(us) y2=41.79+26.01*x2(us)
• 若要实现1S的延时,N的数值约为多少? • X2=(1000 0000uS-41.79uS)/26.01=38445 • 但这种估计建立在特定的晶振频率基础上;若晶振频率改变,规律得重新进 行实验,相当繁琐。
ay函数延时的缺陷
• 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的中断允许控制位见下
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;
– 若T0中断不允许(ET0=0或EA=0) • 问题: • 1、T0溢出标志TF0与T0中断使能控制位ET0、EA间的关系是什么? • 2、T0溢出时,16位计数器的当前计数值为多少? • 3、T0在中断服务程序内是否计数?
• 则不执行中断服务程序 • 中断标志TF0也不能自动清0)
8051 定时/计数器-计数值重载
案例4 定时器及其应用 ftp://10.28.86.201 用户名:stu 密码:stu
2014.10.16
案例4 定时器及其应用
• 问题提出
–软件延时 –硬件延时
• 定时器应用案例
– 简单应用 – 综合应用 – 工程应用
• 定时/计数器工作原理 • 初始化 • 中断服务程序
问题提出-软件延时函数
• 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; } 先执行中断程序,后重载计数初值
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]; }
• • 定时器:如果信号是周期 对于接在定时/计数器上的外部脉冲信号类型, 信号(T),若计数值为n, 处理器是没有办法要求的。因此定时器/计数 则定时时间t=n*T 器的功能分为: • 外部计数:对外部的脉冲信号计数 • 内部定时:对处理器内部的周期信号进行 计数,次数乘以机器周期即为定时时间 因此统一到一点,定时、计数都是计数
• 之前延时采用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++) ; }
8051 定时/计数器-工作方式
• GATE:门控位(高电平有效)
• 【定义工作方式】 – TMOD:定时器工作方式寄存器, • C/T#:计数/定时器选择控制位 该寄存器不能位寻址。 – 1:外部计数方式 • 高4位:T1工作方式 – 0:内部定时方式 • 低4位:T0工作方式 – 0:启动仅受TR*信号控制 – 1:启动受TR*与INT#引脚信号双 重控制
8051 定时/计数器-计数初值
• 【赋计数初值】 • 8051单片机计数方式:递增溢出; 若采用16位计数 –当计数初值为65535(0xffff) 时,计数1次就溢出 –最少计1次溢出
–当计数初值为0(0x0000)时, 计数65536次后溢出 –最多计65536次溢出
8051 定时/计数器-计数初值
• 定时/计数器 • delay延时函数缺陷 – 定时/计数器是一硬件资源,对应 – 不能实现精确延时 有脉冲输入接口 – 该延时由软件实现,延时期间无 – 计数器:若对应端口上输入非周 法执行其它任务,对于某些特定 期信号,该硬件能实现脉冲计数 时序的任务会造成影响。 • 为此要引入一种由硬件定时的电路 – 定时/计数器
– 计数方式
• 固定递增:加1计数 • 固定递减:减1计数 • 可设置递增、递减
– 脉冲触发方式
• • • • 固定上升沿计数 固定下降沿计数 双沿计数 可设置边沿计数