590 likes | 720 Views
第 6 章 定时与计数技术 6.1 概 述. 6.1.1 定时与计数. 1. 定时. 定义: 提供的时间基准。. 分类: 内部定时、外部定时。. 2. 计数. 定时与计数本质上是一致的。. 计数的信号随机,定时的信号具有周期性。. 3. 应用. 分时系统切换任务的时间基准、测速、计数. 6.1.2 定时方法. 1. 软件定时. 通过软件指令周期方法定时,如执行循环程序。. 增加 CPU 负担,通用性差,一般用于短延时。. 2. 不可编程硬件定时. 采用中小规模 IC 构成。. 不增加 CPU 负担,成本低,定时值不可改变。.
E N D
第6章 定时与计数技术 6.1 概 述 6.1.1 定时与计数 1.定时 定义:提供的时间基准。 分类:内部定时、外部定时。 2.计数 定时与计数本质上是一致的。 计数的信号随机,定时的信号具有周期性。 3.应用 分时系统切换任务的时间基准、测速、计数
6.1.2 定时方法 1.软件定时 通过软件指令周期方法定时,如执行循环程序。 增加CPU负担,通用性差,一般用于短延时。 2.不可编程硬件定时 采用中小规模IC构成。 不增加CPU负担,成本低,定时值不可改变。 3.可编程硬件定时 采用可编程计数器完成,软件可改变计数值。 可编程定时/计数器:实质上定时和计数本质上都是脉冲计数器,定时计的是内部基准时钟源产生的脉冲,计数是计外部脉冲。
6.1.3 定时/计数器基本原理 1.内部逻辑 CPU接口: 片选、低端地址线、读写控制线、数据线 外设接口: 时钟、控制、输出 内部逻辑: 端口地址译码器、各种寄存器 2.工作过程 设初值、控制(计数)、输出
6.2 Intel 8254 8253→8254→82801BA。 6.2.1 8254-2基本功能 3个独立的16位定时/计数器(T/C); 每个T/C功能: 可按二、十进制(BCD)计数; 有6种不同的工作方式; 最高频率10MHz;(82801BA中的为14.31818MHz) 有读回状态功能。(8253没有)
6.2.2 8254-2结构与引脚 1.内部逻辑 总线缓冲器[8位R/W]:写工作方式、计数初值、当前计数值
2.计数器内部逻辑 锁存后读出当前值 LSB MSB 16位当前计数值锁存器OL OUT 16位减1计数器CE (减1至0时) CLK & GATE 16位计数初值寄存器CR 装入/读出初值 LSB MSB CR:16位 CPU写入[两次]、清零 CE:16位 通过CR写入、计数、输出 OL:16位 先锁存再读出 状态REG:8位 先锁存再读出 注意:GATE信号的作用与应用,重写CR的效果。 计数初值:N=fCLKi/fOUTi,在不同工作方式及定时/计数时的应用不同。
(1)译码:CS与A1A0: (2)读/写:RD、WR; 3.外部引脚
4.CPU操作功能及命令 I/O端口地址:8254提供四个端口(使用A1A0); 命令:初始化—设置工作方式、设置计数器初值 操 作—重写计数器初值、取状态命令 状态:当前计数值、工作方式及当前状态。 I/O端口操作冲突时解决方法: 写工作方式与写读取状态命令采用特征位方法; 读取当前计数值或读取状态采取时序方法。 8254命令关系表:
CS RD WR A1 A0
6.2.3 8254-2命令及编程 1.工作方式控制字(A1A0=11) 特征位:D7D6=00~10、D5D4=01~11; D7D6选择计数器:00-T/C0;01-T/C1;10-T/C2 D5D4选择读/写方式:01-只写低字节;10-只写高字节;11-先写低字节再写高字节(16位) D3D2D1选择工作方式:000~101六种工作方式。 D0选择计数进制:0-二进制方式;1-BCD码方式。 例:MOV AL,01110100B ;T/C1,先低后高字节 OUT43H,AL ;方式2,二进制方式
2.计数初值 (1)不同通道的计数初值写到不同地址中;A1A0 定时/计数器 0 0 T/C0 0 1 T/C1 1 0 T/C2 (2)每次写入一个字节; (3)根据控制字定义,决定高、低字节写入方法。 (4)初始值的范围是: • 二进制为65536(0000H)、65535(FFFFH)~1(0001H)。 • 十进制为10000(0000H)、9999(9999H)~1(0001H)。
3.T/C初始化 (1)写工作方式控制字 (2)设置计数初值 例: MOV AL, 01110101B;T/C1,先低后高字节,方式2,BCD OUT 43H, AL MOVAX, 2000H ;计数初值为2000 OUT 41H, AL ; MOV AL, AH OUT 41H,AL ; MOV AL,00010110B;T/C0,只低字节,方式3,二进制 OUT 43H,AL OUT 40H,50H ;计数初值为50H(80) 注意:(1)每个使用的T/C均要初始化; (2)计数初值的设置与T/C的CLK密切相关; (3)计数初值的设置方法由控制字决定。
4.T/C数据读取 (1)读取当前计数值方法1工作方式控制字(A1A0=11)D7D6=00~01,D5D4=00 (a)锁存当前计数值或禁止计数 (b)读取当前计数值 例:MOV AL,01000101B; T/C1,锁存 ;先低后高字节,方式2,BCD OUT 43H,AL IN AL,41H MOV AH,AL IN AL,41H XCHG AH,AL ;AX为T/C1当前计数值
(2)读取当前计数值方法2—使用读回命令(A1A0=11)(2)读取当前计数值方法2—使用读回命令(A1A0=11) 特征位:D7D6=11。(A1A0=11) 功能选择:锁存状态-D5D4=10; 锁存计数值-D5D4=01; 锁存状态与计数值- D5D4=00。(先读状态再读计数值) 计数器选择:D1=1—T/C0,D2=1—T/C1,D3=1—T/C2 特点:控制字同时只能锁存单个通道, 读回命令可同时锁存多个通道。
例: MOV AL,11010100B ; T/C1,锁存计数值 OUT 43H,AL IN AL,41H; MOV AH,AL IN AL,41H XCHG AH,AL ;AX为当前计数值 MOV AL,11011010B ; T/C0、T/C2锁存计数值 OUT 43H,AL IN AL,40H; MOV AH,AL IN AL,40H XCHG AH,AL ;AX为T/C0当前计数值 IN AL,42H; MOV AH,AL IN AL,42H XCHG AH,AL ;AX为T/C2当前计数值
(3)读取计数器当前状态—使用读回命令 读出的状态字格式: 例:MOV AL,11100100B ; T/C1,锁存状态值 OUT 43H,AL IN AL,41H ;若AL=00110101,表示T/C1 ;为方式2,BCD码,先低后高 ;读/写,当前OUT为低电平 MOV AL,11100010B ;T/C0,锁存状态值 OUT 43H,AL IN AL,40H ;若AL=00010110,表示T/C0 ;为方式3,二进制码,只有低 ;字节,当前OUT为低电平
6.2.4 8254-2工作方式 1.方式0—计数结束时中断 特点:一次计数; GATE高允许、下降暂停、低禁止、上升继续计数; WR#写[重写]后下一脉冲下降沿重新计数; OUT在控制字或计数初值写完时变低、计数值为0时变高(N+1个时钟的低)。
2.方式1—硬件可重触发单稳 特点:一次计数; GATE上升重新、高与下降和低不影响计数; WR#写[重写]在下次GATE从0到1的跳变时有效; OUT在写入控制字后变高,开始计数时变低、计数值为0时变高(N个时钟周期的低)。
3.方式2—频率发生器 特点:多次计数; GATE上升重新、高允许、下降停止、低禁止计数; WR#写[重写]在下次计数时有效; OUT在计数值为1时输出宽度为1个CLK的负脉冲(周期为N个时钟周期,频率为1/N的时钟频率,实际上是对CLK的N分频)。
4.方式3—方波发生器 特点:多次计数; GATE上升重新、高允许、下降停止、低禁止计数; WR#写[重写]在下次计数时有效; OUT在写入控制字后变高,计数开始后,采用每脉冲计数减2: 当计数初值为偶数N时,计数到0时反向。脉冲宽度T×N/2,方波周期为T×N 。 当计数初值为奇数N时,OUT变高的第一CLK减1后装入 CE,其余每个脉冲计数减2。OUT正脉冲时,计数到0的下一个CLK时OUT反向OUT正脉冲宽度为T×(N+1)/2 ;OUT负脉冲时在计数到0时反向。负脉冲宽度为T×(N-1)/2,方波周期仍然是T×N。
5.方式4—软件触发选通 特点:一次计数; GATE上升重新、高允许、下降停止、低禁止计数; WR#写[重写]会立即重新计数(软件触发); OUT在写入控制字及计数当中为高电平,计数值为0时输出1个CLK的负脉冲。
6.方式5—硬件触发选通 特点:一次计数; GATE上升重新、高与下降和低不影响计数; WR#写[重写]在下次GATE从0到1的跳变时有效; OUT在计数值为0时输出1个CLK的负脉冲。
6.2.5 8254-2应用举例 D0~D7 CLK0 5MHz GATE0 OUT0 CLK1 GATE1 1Hz OUT1 A1 CLK2 A0 GATE2 RD OUT2 CS WR 1.分频器设计 用8254(地址40H~43H)将5MHz的脉冲变为1Hz的脉冲。 初值=fCLK/fOUT=5×106>65536,怎么办? 需要2个T/C级联,T/C0采用方式3产生连续分频方波,做T/C1的CLK,T/C1 采用方式2产生1Hz脉冲。两个T/C的GATE统一控制。 MOV AL,00110111B;T/C0 OUT 43H,AL MOV AX, 5000H OUT 40H,AL MOV AL, AH OUT 40H,AL MOV AL,01110101B;T/C1 MOV AX, 1000H OUT 41H,AL MOV AL, AH OUT 41H,AL
2.占空比4:9的方波发生器 8254的CLK0的时钟频率是8KHz,问 1)T/C0最大定时时间是多少? 2)要求8254端口地址为90H、92H、94H和96H,请使用74LS138译码器加简单门电路完成地址连线。 3)现在要求使用该8254产生周期为9秒,占空比为4:9的方波,请在上面的电路图中完成电路,并编写初始化程序。 答: 1)TCLK0=1/fCLK0=1/8000=0.125ms 最大定时时间=65536×0.25ms=8.192秒 或:fCLK0/fOUT=65536=>Tmax=1/fOUT=65536/ fclk0 =65536/8000=8.192秒
2) D7~D0 D7~D0 8KHz CLK0 WR IOW GATE0 RD IOR OUT0 1Hz 5V A0 A1 A2 A1 占空比4:9,周期9秒的方波 OUT1 A5 C 8254 A4 B CS Y2 A3 A CLK0 74LS138 GATE0 A7 OUT0 G1 A8 ≥1 G2A A9 A6 ≥1 G2B A0 CLK1 GATE1 3)
MOV AL,00110111B;T/C0 OUT 96H,AL MOV AX, 8000H OUT 90H,AL MOV AL, AH OUT 90H,AL MOV AL,01110111B;T/C1 MOV AX, 9H OUT 92H,AL MOV AL, AH OUT 92H,AL
3.包装流水线控制 某产品的包装流水线中,一个包装箱能装24罐饮料。装箱时希望流水线上每通过24罐饮料,流水线要停4秒以等待包装箱封口,然后继续通过下一箱的24罐。流水线就是这样周而复始的运作。试利用一片8254来完成流水线控制中的定时和计数功能。假设8254的端口地址为8CH~8FH,采用的时钟频率是2KHz。
WR CS CLK0 D0~D7 RD GATE0 OUT0 流水线信号 CLK1 GATE1 A1 OUT1 A0 fCLK CLK2 GATE2 控制流水线停和运行的信号 OUT2 思路:用8254的计数通道1作为计数器,用于24个罐的计数;计数通道2作为定时器,定时为4S。当计数通道1的OUT脚出现0到1的跳变的时候,将启动计数通道2开始定时,而计数通道2定时阶段将控制计数通道1停止计数,只有其定时结束并停止定时阶段才可再次启动计数通道1开始计数。 • 计数通道1工作在方式2,计数初值24 • 计数通道2工作在方式1,计数初值8000
;初始化程序 ;计数通道1初始化 MOV AL, 01010100B OUT 8FH, AL MOV AL, 24 OUT 8DH, AL ;初始化计数通道2 MOV AL, 10110010B OUT 8F, AL MOV AX, 8000 OUT 8EH, AL MOV AL, AH OUT 8EH, AL
6.3 8254在微机中应用 来自主板上74LS138的Y2,地址范围是40H~5FH,加上A1A0两根地址线,组成8254的端口地址是40H、41H、42H、43H。 PC系列机定时系统结构框图 返回2 返回1
6.3.1 计数器0—系统定时器 工作方式:3方式,计数初值:65536。 1.系统定时器 OUT0连接到8259A的IRQ0(中断类型号为8)上。 fOUT0=1.1931816MHz/65536=18.2Hz, 即:每秒产生18.2次中断用于日时钟计时。 应用:系统BIOS的INT 8H用作日时钟计时; INT 8H调用INT 1CH作为用户定时中断接口。 2.软盘驱动器马达自动延迟控制
6.3.2 计数器1—动态存储器定时刷新控制 工作方式:2方式,计数初值:18。 连接到8237的DREQ0上,定时产生负脉冲。 脉冲宽度=1/ 1.1931816MHz=838ns, 脉冲周期=18/1.1931816MHz=15.08μs, 即:每隔15.08μs产生一个脉冲用于刷新。
6.3.3 计数器2—扬声器音频发生器 工作方式:3方式,计数初值:由调用程序控制。 与8255的PB口D1信号“与”后连接到扬声器上,控制扬声器发声频率及时长。 8255控制发声:8254的OUT2=1,CPU控制8255的PB口的D1位的电平实现; 8254控制发声:8255的PB口的D1位为高电平,控制8254的T/C2的OUT2实现。 通过改变OUT2的方波信号频率,就可以改变扬声器发声的音调。 CR预置值=CLK2脉冲频率/发声的频率 转图
;功能:按照指定的时间间隔发896Hz声音 ;调用:CX=指定时间 ;返回:无 BEEP PROC FAR IN AL,61H; 读8255PB口的当前值 MOV AH,AL PUSH AX MOV AL,10110110B OUT 43H,AL MOV AX,0533H;=1.1931816MHz/896Hz OUT 42H,AL MOV AL,AH OUT 42H,AL POP AX
OR AL,03H ;置61H端口D0、D1均为1, ;打开扬声器 OUT 61H,AL NOP L1:LOOP L1 ;延迟 AND AL,0FDH ;置61H端口D1为0, ;封锁OUT2输出 OUT 61H,AL MOV AL,AH OUT 61H,AL RET BEEP ENDP 转图
6.4 实时钟电路及其应用 6.4.1 MC146818特性及工作原理 MC146818外部引脚图
COMS RAM实时钟信息存放位置表 可以用INT 1A功能读取或设置这些值。
6.4.2 实时钟状态寄存器 • 状态寄存器A • 状态寄存器B • 状态寄存器C • 状态寄存器D 6.4.3 RT/CMOS RAM操作 815EP芯片组82801BA的RTC电路包含128字节标准CMOS RAM 区和128字节扩展CMOS RAM区。 访问RT/CMOS RAM的端口地址范围从70H~77H。其中,70H和71H用来访问标准CMOS RAM 区,72H, 73H用来访问扩展CMOS RAM 区。
MOV AL,6H ;6H是存放"星期几"的单元偏移地址 OUT 70H,AL ;送地址端口 JMP $+2 ;芯片I/O延时要求 IN AL,71H ;读数据端口 MOV AH, AL ;AH中存放的是当前“星期几”的信息 ;0表示星期日
6.4.4 CMOS 密码的破解 基本原理是破坏CMOS中的设置,使得开机后必须重新设置CMOS,从而破解密码。 mov AL, 2EH out 70H, AL mov AL, 00H out 71H, AL mov AL, 2FH out 70H, AL mov AL, 00H out 71H, AL CMOS中偏移为2EH和2FH的位置放的是标准校验和
6.5 Win32编程中的时钟(自学) 6.5.1 使用基于WM_TIMER消息的定时器 • 1.使用Win32 SDK函数 • 必须使用#include “Windows.h” • 必须使用User32.lib
UINT_PTR SetTimer( HWND hWnd,// handle to window UINT_PTR nIDEvent,// timer identifier UINT uElapse,// time-out value TIMERPROC lpTimerFunc// timer procedure ); BOOL KillTimer( HWND hWnd,// handle to window UINT_PTR uIDEvent// timer identifier );
LONG APIENTRY MainWndProc( HWND hwnd, // handle to main window UINT message, // type of message WPARAM wParam, // additional information LPARAM lParam) // additional information { …… switch (message) { …… case WM_TIMER:// Process the timer event. case WM_DESTROY:// Destroy the timer. KillTimer(hwnd, IDT_MOUSETRAP); PostQuitMessage(0); break; …… }
2.使用MFC类CWnd的成员函数 UINT SetTimer( UINT nIDEvent,// Specifies a nonzero timer // identifier. UINT nElapse,// Specifies the time-out value, // in milliseconds. void (CALLBACK EXPORT* lpfnTimer)(HWND,UINT, UINT, DWORD)// Specifies the address of the // application-supplied TimerProc callback function that processes // the WM_TIMER messages. If this parameter is NULL, the // WM_TIMER messages are placed in the application’s message // queue and handled by the CWnd object. ); BOOLKillTimer(intnIDEvent );
void CMainFrame::OnStartTimer() { m_nTimer = SetTimer(1, 2000, 0); } void CMainFrame::OnStopTimer() { KillTimer(m_nTimer); } void CMainFrame::OnTimer(UINT nIDEvent) { MessageBeep(0xFFFFFFFF); // Beep // Call base class handler. CMDIFrameWnd::OnTimer(nIDEvent); }
缺点: • WM_TIMER消息的优先级比较低,定时时间不能精确保证。 • 定时精度低,最小精度为54.915ms, 约18.2次/秒。