现代微机原理与接口技术接口第6章.ppt
1,第6章 定时与计数技术6.1 概 述,6.1.1 定时与计数,1.定时,定义:提供的时间基准。,分类:内部定时、外部定时。,2.计数,定时与计数本质上是一致的。,计数的信号随机,定时的信号具有周期性。,3.应用,2,6.1.2 定时方法,1.软件定时,通过软件指令周期方法定时,如执行循环程序。,增加CPU负担,通用性差,一般用于短延时。,2.不可编程硬件定时,采用中小规模IC构成。,不增加CPU负担,成本低,定时值不可改变。,3.可编程硬件定时,采用可编程计数器完成,软件可改变计数值。,可编程定时/计数器:实质上定时和计数本质上都是脉冲计数器,定时计的是内部基准时钟源产生的脉冲,计数是计外部脉冲。,3,6.1.3 定时/计数器基本原理,1.内部逻辑,CPU接口:译码、操作,外设接口:时钟信号、控制、输出,内部逻辑:REG,2.工作过程,设初值、控制、输出,4,6.2 Intel 8254,8253825482801BA。,6.2.1 8254-2基本功能,3个独立的16位定时/计数器(T/C);,每个T/C功能:可按二、十进制(BCD)计数;有6种不同的工作方式;最高频率10MHz;(82801BA为14.31818MHz)有读回状态功能。(8253没有),5,6.2.2 8254-2结构与引脚,1.内部逻辑,总线缓冲器8位R/W:写工作方式、计数初值、当前计数值,6,2.计数器内部逻辑,CR:16位 写入两次、清零,CE:16位 写入、计数、输出,OL:16位 先锁存再读出,状态REG:8位 先锁存再读出,注意:GATE信号的作用与应用,重写CR的效果。,计数初值:N=fCLKi/fOUTi,在不同工作方式及定时/计数时的应用不同。,7,3.外部引脚,8,4.CPU操作功能及命令,I/O端口地址:8254提供四个端口(使用A1A0);,命令:初始化设置工作方式、设置计数器初值;操 作重写计数器初值、取状态命令。,状态:当前计数值、工作方式及当前状态。,I/O端口操作冲突时解决方法:,写工作方式与写读取状态命令采用特征位方法;,读取当前计数值或读取状态采取时序方法。,8254命令关系表:,9,A1 A0,10,6.2.3 8254-2命令及编程,1.工作方式控制字(A1A0=11),特征位:D7D6=0010、D5D4=0111;D7D6选择计数器:00T/C0;01T/C1;10T/C2 D5D4选择读/写方式:01只写低字节;10只写高字节;11先写低字节再写高字节(16位)D3D2D1选择工作方式:000101六种工作方式,X10方式2,X11方式3,例:MOV AL,01110100B;T/C1,先低后高字节 OUT 43H,AL;方式2,二进制方式,11,2.计数初值,(1)不同通道的计数初值写到不同地址中;A1A0=0010(2)每次写入一个字节;(3)根据控制字定义,决定高、低字节写入方法。(4)初始值的范围是:,二进制为65536(0000H)1(0001H)。十进制为10000(0000H)1(00001H)。,12,3.T/C初始化,(1)工作方式控制字(2)设置计数初值,例:MOV AL,01110101B;T/C1,先低后高字节,方式2,BCDOUT 43H,ALMOV AX,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)计数初值的设置方法由控制字决定。,13,4.T/C数据读取,(1)读取当前计数值方法1工作方式控制字(A1A0=11)D7D60001,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当前计数值,14,(2)读取当前计数值方法2使用读回命令,特征位:D7D6=11。(A1A0=11),功能选择:锁存状态D5D4=10;锁存计数值D5D4=01;锁存状态与计数值 D5D4=00。(先读状态再读计数值),计数器选择:D1=1T/C0,D2=1T/C1,D3=1T/C2,特点:控制字同时只能锁存单个通道,读回命令可同时锁存多个通道。,15,例: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当前计数值,16,(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为低电平,读出的状态字格式:,17,6.2.4 8254-2工作方式,1.方式0计数结束时中断,特点:一次计数;GATE高允许、下降暂停、低禁止、上升继续计数;WR#写重写后下一脉冲下降沿重新计数;OUT在控制字或计数初值写完时变低、计数值为0时变高(N+1个低)。,18,2.方式1硬件可重触发单稳,特点:一次计数;GATE上升重新、高与下降和低不影响计数;WR#写重写在下次GATE从0到1的跳变时有效;OUT在写入控制字后变高,开始计数时变低、计数值为0时变高(N个低)。,19,3.方式2频率发生器,特点:多次计数;GATE上升重新、高允许、下降停止、低禁止计数;WR#写重写在下次计数时有效;OUT在计数值为1时输出宽度为1个CLK的负脉冲(周期为N,频率为1/N)。,20,4.方式3方波发生器,特点:多次计数;GATE上升重新、高允许、下降停止、低禁止计数;WR#写重写在下次计数时有效;OUT在写入控制字后变高,计数开始后,采用每脉冲计数减2:当计数初值为偶数时,计数到0时反向。脉冲宽度Tn/2 当计数初值为奇数时,OUT变高的第一CLK减1后装入 CE,其余每个脉冲计数减2。OUT正脉冲时,计数到0的下一个CLK时OUT反向OUT正脉冲宽度为T(n+1)/2;OUT负脉冲时在计数到0时反向。负脉冲宽度为T(n-1)/2,21,特点:一次计数;GATE上升重新、高允许、下降停止、低禁止计数;WR#写重写会立即重新计数(软件触发);OUT在写入控制字及计数当中为高电平,计数值为0时输出1个CLK的负脉冲。,5.方式4软件触发选通,22,6.方式5硬件触发选通,特点:一次计数;GATE上升重新、高与下降和低不影响计数;WR#写重写在下次GATE从0到1的跳变时有效;OUT在计数值为0时输出1个CLK的负脉冲。,23,24,6.2.5 8254-2应用举例,1.分频器设计,用8254(地址40H43H)将5MHz的脉冲变为1Hz的脉冲。,初值=fCLK/fOUT=510665536,怎么办?,MOV AL,00110111B;T/C0 OUT 43H,ALMOV AX,5000HOUT 40H,ALMOV AL,AHOUT 40H,ALMOV AL,01110101B;T/C1 MOV AX,1000HOUT 41H,ALMOV AL,AHOUT 41H,AL,需要2个T/C级联,T/C0采用方式3产生连续分频方波,做T/C1的CLK,T/C1 采用方式2产生1Hz脉冲。两个T/C的GATE统一控制。,25,2.占空比4:5的方波发生器,8254的CLK0的时钟频率是8KHz,问1)T/C0最大定时时间是多少?2)要求8254端口地址为90H、92H、94H和96H,请使用74LS138译码器加简单门电路完成地址连线。3)现在要求使用该8254产生周期为9秒,占空比为4:5的方波,请在上面的电路图中完成电路,并编写初始化程序。,答:1)TCLK0=1/fCLK0=1/8000=0.125ms最大定时时间655360.25ms=8.192秒,26,2),CLK1,GATE1,3),27,MOV AL,00110111B;T/C0 OUT 96H,ALMOV AX,8000HOUT 90H,ALMOV AL,AHOUT 90H,ALMOV AL,01110111B;T/C1 MOV AX,9HOUT 92H,ALMOV AL,AHOUT 92H,AL,28,3.包装流水线控制,某产品的包装流水线中,一个包装箱能装24罐饮料。装箱时希望流水线上每通过24罐饮料,流水线要停4秒以等待包装箱封口,然后继续通过下一箱的24罐。流水线就是这样周而复始的运作。试利用一片8254来完成流水线控制中的定时和计数功能。假设8254的端口地址为8CH8FH,采用的时钟频率是2KHz。,29,思路:用8254的计数通道1作为计数器,用于24个罐的计数;计数通道2作为定时器,定时为4S。当计数通道1的OUT脚出现0到1的跳变的时候,将启动计数通道2开始定时,而计数通道2定时阶段将控制计数通道1停止计数,只有其定时结束并停止定时阶段才可再次启动计数通道1开始计数。,计数通道1工作在方式2,计数初值24计数通道2工作在方式1,计数初值8000,30,;初始化程序;计数通道1初始化MOVAL,01010100BOUT8FH,ALMOVAL,24OUT8DH,AL;初始化计数通道2MOVAL,10110010BOUT8F,ALMOVAX,8000OUT8EH,ALMOVAL,AHOUT8EH,AL,31,6.3 8254在微机中应用,PC系列机定时系统结构框图,来自主板上74LS138的Y2,地址范围是40H5FH,加上A1A0两根地址线,组成8254的端口地址是40H、41H、42H、43H。,返回1,返回2,32,6.3.1 计数器0系统定时器,工作方式:3方式,计数初值:65536。,1.系统定时器,连接到8259A的IRQ0(中断类型号为8)上。fOUT0=1.1931816MHz/65536=18.2Hz,即:每秒产生18.2次中断用于日时钟计时。,应用:系统BIOS的INT 8H用作日时钟计时;INT 8H调用INT 1CH作为用户定时中断接口。,2.软盘驱动器马达自动延迟控制,33,6.3.2 计数器1动态存储器定时刷新控制,工作方式:2方式,计数初值:18。,连接到8237的DREQ0上,定时产生负脉冲。脉冲宽度=1/1.1931816MHz=838ns,脉冲周期=18/1.1931816MHz=15.08s,即:每隔15.08s产生一个脉冲用于刷新。,34,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脉冲频率/发声的频率,转图,35,;功能:按照指定的时间间隔发896Hz声音;调用:CX=指定时间;返回:无BEEP PROC FARIN AL,61HMOV AH,AL PUSH AXMOV AL,10110110BOUT 43H,ALMOV AX,0533H;=1.1931816MHz/896HzOUT 42H,ALMOV AL,AHOUT 42H,ALPOP AX,36,OR AL,03H;置61H端口D0、D1均为1,;打开扬声器OUT 61H,ALNOPL1:LOOP L1;延迟AND AL,FD;置61H端口D1为0,;封锁OUT2输出OUT 61H,ALMOV AL,AHOUT 61H,ALRETBEEP ENDP,转图,37,6.4 实时钟电路及其应用,6.4.1 MC146818特性及工作原理,MC146818外部引脚图,38,MC146818在系统中连接框图,39,实时钟工作原理示意图,40,COMS RAM实时钟信息存放位置表,可以用INT 1A功能读取或设置这些值。,41,6.4.2 实时钟状态寄存器,6.4.3 RT/CMOS RAM操作,815EP芯片组82801BA的RTC电路包含128字节标准CMOS RAM 区和128字节扩展CMOS RAM区。,访问RT/CMOS RAM的端口地址范围从70H77H。其中,70H和71H用来访问标准CMOS RAM 区,72H,73H用来访问扩展CMOS RAM 区。,状态寄存器A状态寄存器B状态寄存器C状态寄存器D,42,MOVAL,6H;6H是存放星期几的单元偏移地址OUT70H,AL;送地址端口JMP$+2;芯片I/O延时要求INAL,71H;读数据端口MOVAH,AL;AH中存放的是当前“星期几”的信息;0表示星期日,43,6.4.4 CMOS 密码的破解,基本原理是破坏CMOS中的设置,使得开机后必须重新设置CMOS,从而破解密码。,movAL,2EHout 70H,AL movAL,00H out 71H,AL movAL,2FHout 70H,AL movAL,00H out 71H,AL,CMOS中偏移为2EH和2FH的位置放的是标准校验和,44,6.5 Win32编程中的时钟,6.5.1 使用基于WM_TIMER消息的定时器,1.使用Win32 SDK函数 必须使用include“Windows.h”必须使用User32.lib,45,46,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);,47,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;,48,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 applications message/queue and handled by the CWnd object.);,BOOL KillTimer(int nIDEvent);,49,void CMainFrame:OnStartTimer()m_nTimer=SetTimer(1,2000,0);void CMainFrame:OnStopTimer()KillTimer(m_nTimer);void CMainFrame:OnTimer(UINT nIDEvent)MessageBeep(0 xFFFFFFFF);/Beep/Call base class handler.CMDIFrameWnd:OnTimer(nIDEvent);,50,缺点:WM_TIMER消息的优先级比较低,定时时间不能精确保证。定时精度低,最小精度为54.915ms,约18.2次/秒。,51,6.5.2 使用多媒体定时器,1.使用Win32 SDK函数必须使用#include Mmsystem.h 必须使用Winmm.lib,52,53,1.确定最大和最小周期,MMRESULT timeGetDevCaps(LPTIMECAPS ptc,/Pointer to a TIMECAPS structure.UINT cbtc/Size,in bytes,of the TIMECAPS structure);,typedef struct UINT wPeriodMin;/Minimum supported resolutionUINT wPeriodMax;/Maximum supported resolution TIMECAPS;,54,2.建立最小时间精度,MMRESULT timeBeginPeriod(UINT uPeriod/Minimum timer resolution,in milliseconds,for the application or device driver.);,MMRESULT timeEndPeriod(UINT uPeriod);和上面的timeBeginPeriod是一对,其中uPeriod 要完全一样,timeBeginPeriod是启动定时器的时候用,timeEndPeriod是结束定时器时用。,55,3.启动和取消定时器,MMRESULT timeSetEvent(UINT uDelay,/Event delay,in milliseconds.UINT uResolution,/Resolution of the timer event,in milliseconds.LPTIMECALLBACK lpTimeProc,/Pointer to a callback function that is called once upon expiration of a single event or periodically upon expiration of periodic events.DWORD dwUser,/User-supplied callback dataUINT fuEvent/Timer event type.TIME_ONESHOT/TIME_PERIODIC);,MMRESULT timeKillEvent(UINT uTimerID);,56,获取定时器最小周期,#define TARGET_RESOLUTION 1/1-millisecond target resolution TIMECAPS tc;UINT wTimerRes;if(timeGetDevCaps(,57,设置回调函数,UINT SetTimerCallback(NPSEQ npSeq,/sequencer data UINT msInterval)/event interval npSeq-wTimerID=timeSetEvent(msInterval,/delay wTimerRes,/resolution(global variable)OneShotCallback,/callback function(DWORD)npSeq,/user data TIME_ONESHOT);/single timer event if(!npSeq-wTimerID)return ERR_TIMER;else return ERR_NOERROR;,58,void CALLBACK OneShotTimer(UINT wTimerID,UINT msg,DWORD dwUser,DWORD dw1,DWORD dw2)NPSEQ npSeq;/pointer to sequencer data npSeq=(NPSEQ)dwUser;npSeq-wTimerID=0;/invalidate timer ID(no longer in use)TimerRoutine(npSeq);/handle tasks,回调函数,59,void DestroyTimer(NPSEQ npSeq)if(npSeq-wTimerID)/is timer event pending?timeKillEvent(npSeq-wTimerID);/cancel the event npSeq-wTimerID=0;,取消定时器,