2012 第四章 定时与中断系统

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
第4章
定时与中断系统
定时/计数器 C语言的函数
中断系统
(学生事先必须预习,本章是一个难点、重点)
计数概念的引入
生活中计数的例子处处可见.例:录音机上的计 数器、家里面用的电度表、汽车上的里程表等等. 再举一个工业生产中的例子,线缆行业在电线生产 出来之后要计米,也就是测量长度,怎么测法呢?用 尺量?不现实,太长不说,要一边做一边量呢,怎么 办呢?行业中有很巧妙的方法,用一个周长是1米的 轮子,将电缆绕在上面一周,由线带轮转,这样轮转 一周不就是线长1米嘛,所以只要记下轮转了多少圈, 就可以知道走过的线有多长.
TF1
中 断
图6-5 定时/计数器方式2逻辑图
回目录 上页 下页
举 例2
设晶振频率为12MHz,用T1、工作方式2实现1秒延 时函数? 因工作方式2是8位计数器,其最大定时时间为: 256×1s = 256s, 为实现1秒延时,可选择定时时间为250s, 再循环4000次。定时时间选定后,可确定计数值 为250,则T1的初值为:X = M 计数值=256 250 = 6 = 6H。采用T1方式2工作,因此,TMOD =0x20。
TF1
图4-4 定时/计数器方式1逻辑图
回目录 上页 下页
⑶ 方式2 M1M0=10 可自动重装载的8位计数器 TL1(TL0)被定义为计数器 TH1(TH0)被定义为赋值寄存器 以T1为例:
震荡器 T1(P3.5) TR1 GATE INT1 ÷12
C/T=0 C/T=1 1 K 控制 TH1 8位 TL1 8位 重装载
举 例2
用定时器工作方式2实现的1秒延时函数如下: void delay1s() { unsigned int i; // 不能定义成unsigned char TMOD=0x20; // 设置T1为方式2 TH1=6; // 设置定时器初值,放在for循环之外 TL1=6; for(i=0;i<4000;i++){ // 设置4000次循环次数 TR1=1; // 启动T1 while(!TF1); // 查询计数是否溢出,即定时250s时间到,TF1=1 TF1=0; // 250s定时时间到,将定时器溢出标志位TF1清零
;
TF1=0;
}
}
// 查询计数是否溢出,即定时5ms时间到,TF1=1 // 5ms定时时间到,将定时器溢出标志位TF1清零
⑵ 方式1
M1M0=01
16位的定时计数器,由TH的8位和TL的8位组成 以T1为例: 震荡器 T1(P 3.5) TR1 GATE INT1 ÷12
C/T=0 C/T=1 1 K TL1 TH1 8位 8位 控制 16位计数器 中 断
LSB IT1 IE0 IT0
与外部中断INT1、INT0有关 将在中断系统介绍
T1、T0 启/停控制位 ―1‖ 启动 ―0‖ 停止 工作
T1、T0 溢出标志位
―1‖ 有溢出
―0‖ 无溢出
亦可由指令清“0”
回目录 上页 下页
三、定时/计数器的4种工作方式 ⑴ 方式0 M1M0=00
13位的定时计数器,由TH的8位和TL的低5位组成 以T1为例: 震荡器 T1(P 3.5) TR1 GATE INT1 ÷12
T0由2个8位SFR TH0和TL0构成,
T1由2个8位SFR TH1和TL1构成.
4.每个定时器都可由软件设置为定时工作方式
(C/T*=0)或计数工作方式(C/T*=1) 5.T0和T1受特殊功能寄存器TMOD和TCON控制.
6.定时器/计数器一旦启动,便可以和CPU并行工作,
对提高CPU工作效率和简化外围电路大有益处.
定时器/计数器概述
1.51系列单片机片内有两个十六位定时/计数器:
定时器0(Timer0)和定时器1(Timer1) Note:随着单片机型号的不同,内部定时器的个数会不一 样
2.两个定时器都有定时或事件计数的功能,可用于
(1)内部定时控制;(2)对外部事件计数和检测等场合
3.定时/计数器实质是加1计数器.
GATE C/T M1 M0 GATE C/T M1 M0 0 为定时功能 C/T= 1为计数功能 表4-1 操作方式选择
M1M0 0 0 0 1 1 0 1 1
操作方式 方式0 方式1 方式2 方式3
功 能 13位计数器 16位计数器 可自动重新装载初值的8位计数器 T0分为2个8位计数器,T1停止计数
功能:
可编程
定时 计数 串行口的波特率发生器
定时/计数器的可编程特性: ⑴ 确定其工作方式是定时还是计数 ⑵ 预置定时或计数初值 ⑶ 当定时时间到或计数终止时,要不要发中断请求 ⑷ 如何启动定时或计数器工作
一、定时计数器的结构与工作原理 1、结构
T1(P 3.5)
T0(P 3.4)
T0 (8CH) (8AH)
任意定时及计数的方法 刚才已研究过,计数器的容量是16位,也就是 最大的计数值到65536,因此计数计到65536就会 产生溢出.问题是在现实生活中,经常会有少于 65536个计数值的要求,如包装线上,一打为12瓶, 一瓶药片为100粒,怎么样来满足这个要求呢? 提示:如果是一个空的盆要10000滴水滴进去 才会满,我在开始滴水之前就先放入一勺水,还需 要10000滴嘛?
溢出
让我们再来看水滴的例子,当水不断落下,盆中 的水不断变满,最终有一滴水使得盆中的水满了. 这时如果再有一滴水落下,就会发生什么现象?水 会漫出来,用个术语来讲就是“溢出 overflow”. 水溢出是流到地上,而计数器溢出后将使得 TF0变为“1”.一旦TF0由0变成1,就是发生了变化, 产生了变化就会引发事件,就象定时的时间一到, 闹钟就会响一样.引发的事件,就是系统需要响应 定时/计数中断服务程序了,现在我们来研究另一 个问题:要有多少个计数脉冲才会使TF0由0变为1.
MSB
LSB
功能选择位
工作方式选择
回目录 上页 下页
GATE C/T M1 M0 GATE C/T M1 M0 GATE: 门控位。设定T1、T0运行时,是否受 INT1 INT0引脚输入电平的控制 1 受外部中断控制 GATE= 只有INT0或INT1引脚为高电平,且TR0 或TR1置1时,才能启动相应的定时器开 始工作。 0 不受外部中断控制 只要软件控制位TR0或TR1置1即可启 动定时器开始工作;
举 例1
定时时间为5ms,则计数值为5ms/1s =5000,T1的初 值为: X = M 计数值= 8192 5000 = 3192 = C78H = 0110001111000B 13位计数器中TL1的高3位未用,填写0,TH1占高8位, 所以,X的实际填写值应为: X = 0110001100011000B = 6318H
TH0(8位) TL0 (8位)
7 0 7 0
T1 (8DH) (8BH)
TH1(8位) TL1 (8位)
7
Βιβλιοθήκη Baidu
0
7
0
CPU
溢 启 出 动 溢 出
启 动
工作方式 TMOD(89H)
工 作 方 式
TCON(88H)
图4-1 定时/计数器逻辑结构
回目录 上页 下页
T0 2个16位T/C分别由8位计数器TH0、TL0、 TH1、TL1组成 ―+1‖ 计数器 T1
÷12
C/T=0 C/T=1
1/12f0sc
K
控制
TL0 8位
TF0
中 断
1
K
TH0 8位
TF1
中 断
控制 TH0借用了T1的TR1和TF1,因此控制了T1的中断 此时T1只能用在一些不要中断的情况下
回目录 上页 下页
1
图4-6定时/计数器方式3逻辑图
四、定时/计数器的初始化 初始化一般有以下几个步骤: ⑴ 确定工作方式,对方式寄存器TMOD赋值 ⑵ 预置定时或计数初值,直接将其写入T0、T1中 ⑶ 根据需要对中断允许寄存器有关位赋值,以开放 或禁止定时/计数器中断 ⑷ 启动定时/计数器,将TRi 赋值为“1‖ 计数初值的设定: 最大计数值M:不同的工作方式M值不同 方式0: M = 213 = 8192 方式1: M = 216 = 65536 方式2、3:M = 28 = 256
计数概念的引入
从一个生活中的例子看起:一个水盆在水龙头 下,水龙头没关紧,水一滴滴地滴入盆中.水滴不断 落下,盆的容量是有限的,过一段时间之后,水就会 逐渐变满.录音机上的计数器最多只计到999….那 么单片机中的计数器有多大的容量呢?8051单片机 中有两个计数器,分别称之为Timer0和Timer1,这两 个计数器分别是由两个8位的RAM单元(TH*/TL*)组 成的,即每个计数器都是16位的计数器,最大的计数 量是65536(记忆!FFFFH+1).
任意定时及计数的方法 我们采用预置数的方法,要计数100次,那就 先放进65436,再来100个脉冲,不就到了65536了 吗.定时也是如此,假设每个脉冲是1us,则计满 65536个脉冲需时65.536ms.如果现在只要10ms 定时怎么办?10个ms为10,000个us,所以,只要 在计数器里面放进65536-10000=55536就可以了.
计数与定时的内在统一 8051中的计数器除了可以作为计数之用外,还可以 用作时钟,时钟的用途当然很大,如打铃器,电视机定 时关机,空调定时开关等等,那么计数器是如何作为定 时器来用的呢? 时钟的秒针,走一圈需要走60次,耗费的时间是 60s,所以时间就转化为秒针走的次数了,可见,计数的 次数和时间之间的确十分相关.那么它们的关系是什 么呢?那就是秒针每1次走动的时间正好是1秒.因此 只要计数脉冲的间隔相等,则计数值就代表了时间的 流逝.
方式0: 00:13位 Timer——用它无益,不要记它! 方式1: 01:16位 Timer——经常用到 方式2: 10:8位自动重装的Timer——经常用到 方式3: 11:T0 分为2个8位 Timer;
2、控制寄存器TCON MSB TCON TF1 TR1 TF0 TR0 IE1 (88H)
} }
⑷ 方式3
M1M0=11
T0被分成2个相互独立的8位计数器TL0 、TH0 TL0使用自己本身的一些控制位C/T、GATE、TR0
TF0、INT0等。TH0只能做定时器,并使用T1的控
制位TR1、TF1,同时占用T1的中断源
回目录 上页 下页
震荡器
1/12f0sc T0(P3.4) TR0 GATE INT0 1/12f0sc TR1
举 例1
用T1方式0实现任务7中1秒延时函数如下: void delay1s() { unsigned char i; TMOD=0x00; // 置T1为工作方式0 for(i=0;i<0xc8;i++){ // 设置200次循环次数 TH1=0x63; // 设置定时器初值 TL1=0x18; TR1=1; // 启动T1 while(!TF1)
结构
控制寄存器TCON:控制T/C的启停、中断等
方式寄存器TMOD:控制T/C的工作方式 2、工作原理 ⑴ 定时器 定时输入信号:机器内部震荡信号的1/12分频 即每一个机器周期做一次“+1‖运算
回目录 上页 下页
∵1个机器周期=12震荡脉冲
∴计数速率为震荡频率的1/12分频 若单片机的晶振主频为12MHz
C/T=0 C/T=1 1 1
K
TL1 TH1 5位 8位
控制 13位计数器
TF1
中 断
1
图4-3 定时/计数器方式0逻辑图
回目录 上页 下页
举 例1
设晶振频率为12MHz,用T1、工作方式0实现1秒延 时函数? 方式0采用13位计数器,其最大定时时间为: 8192×1s = 8.192ms
可选择定时时间为5ms,再循环200次。
则计数周期为 1µ s
⑵ 计数器
由外部引脚(T0为P3.4 ,T1为P3.5)输入计数脉冲
外部输入脉冲发生负 跳变时,进行“+1‖计 数 外部输入脉冲宽度应大于2个机器周期
下降沿
>T CY >T CY
高电平 低电平
T CY:为机器周期
回目录 上页 下页
二、定时计数器的方式寄存器和控制寄存器 1、方式寄存器TMOD TMOD (89H) GATE C/T M1 M0 GATE C/T M1 M0 控制T1 门控位 控制T0
回目录 上页 下页
计数初值X的计算方法: 计数方式:
X = M-计数值 定时方式:
(M - X)×T = 定时值 ∴ X = M-定时值 / T 其中T为机器周期,时钟的12分频, 若晶振为6MHz,则T = 2µ s, 若晶振为12MHz,则T = 1s
相关文档
最新文档