多媒体定时器

2024-10-09

多媒体定时器(共7篇)

多媒体定时器 篇1

在大型工程机械中,通常要接入多个传感器对多个信号进行采集、处理和存储,尤其是在采集频率特别高的情况下需要采用一种定时更精确的实时采集系统。

数据采集一般是采用软件或硬件的定时中断并通过A/D来读取外界传感器的数据。实时数据采集系统通常要求定时准确,有些采样间隔要求较短,达到1ms,甚至几us。而VB环境下定时器控件所提供的精度只有55毫秒,根本不能满足采样要求。本文通过对系统计时器和多媒体定时器进行比较,提出了利用多媒体定时器进行精确定时,并用A/D转换进行硬件I/O编程来实现,精度可达到1毫秒。本文拟将VB环境下多媒体定时器在实时数据采集中的具体使用方法应用到振动压路机检测系统中的振动参数的采集中去。

1 多媒体定时器的特点及应用

1.1 多媒体定时器与系统计时器的比较

Visual Basic6.0具有两种定时器:一种是系统计时器,即timer定时控件。Windows用Set Timer和Kill Timer函数来设置和删除一个定时器,在事件WM_TIMER响应函数中实现处理。它是PC硬件和ROMBIOS构造的定时器逻辑的一个相当简单的扩展,PC的ROM初始化Intel 8259定时器芯片来产生硬件中断08H,中断每隔54.925毫秒产生一次[1],由于该计数器的最大分辨率是55毫秒,也就是说应用程序每秒只能接收18个消息,而且这个计时器消息的优先权很低,只有在所有的消息(除了消息WM_PAINT)被处理后才能被处理。因此Timer定时器只能用于一般的定时,远不能满足实时数据采集的要求。例如在振动压路机检测系统中,压路机的振动频率在60Hz时,一个振动周期仅为16ms。假如1ms采集一个数据,一个周期才能采到16个点。而系统定时器至少要55ms中断一次,所以根本无法准确及时的采集到数据,更无法还原其振动曲线。

另外一种就是本文介绍的多媒体定时器。对于现在的Intel CPU,它的最小定时精度可以达到1ms,足够满足实时数据采集的定时精度。并且它的优先级很高,使用自己独立的线程来调用一个自己的回调函数,每隔一定时间就发送一个消息而不管其它消息是否执行完。多媒体定时器不依赖于消息机制,而是用函数Time Set Event()产生一个独立的线程,在一定的中断次数到达后,直接调用预先设置好的回调函数进行处理,不必等到应用程序的消息队列为空,从而切实保障了定时中断得到实时响应[2]。但要注意的是在定时器线程没有结束前,不要再次启动该定时器,否则将迅速造成死机。

1.2 多媒体定时器的解释

函数原型:

Function time Set Event(By Val uDelay As Long,ByVal uResolution As Long,By Val lpFunction As Long,ByVal dwUser As Long,By Val u Flags As Long)As Long

参数说明:

uDelay:用于设定定时间隔;

uResolution:用于设定程序所需的最小分辨率;

lpTimeProc:指向定时回调函数的指针;

dw User:用户的回调数据;

fu Event:定时事件的触发方式[3]。

使用方法:

time Set Event产生一个在指定的时间或时间周期间隔内执行的定时器时间。

time Kill Event删除前面用time Set Event产生的定时器事件。

使用步骤:

用函数Time Set Event()初始化和启动定时器事件,指定一定量的时间,需要的精度,回调函数的地址,并提供给回调函数的用户数据。另外要注意的是:应用程序不能够调用回调函数内系统定义的任意函数,除非:Post Message,time Get System Time,time Get Time,timeSet Event,time Kill Event,midiOutShortMsg,midiOutLongMsg,and OutputDebugString。

声明并编写全局回调函数,在数据采集系统中,一般可在回调函数中完成持续数据采集及简单的软件滤波处理。

定时器的任务完成后,及时删除定时器。

2 编程实例

2.1 数据采集与数据处理的具体方案

VB中要正确调用回调函数,否则会出现系统崩溃。实际采集中容易遇到以下问题:

回调函数timepro里面只能调用上面提到的函数,不能调用open语句。也就是不能在回调函数中使用文件存储语句,否则会出现系统错误。time Set Event使用不当会导致VB崩溃。

数据量太大:采集振动的加速度、速度和幅值。每1ms取一个数据,一秒内就采集到一千个数据。若采集时间很长必然导致数据量很大。用数组不可能存储如此多的数据,所以在关闭多媒体定时器后一次性存储数据非常困难。

多媒体定时器的使用是建立在对CPU的消耗上的,所以使用时间越长系统消耗越厉害。另外,若定时时间很短,启动定时器后,系统对其他窗口的消息反应有明显的延迟现象,这对用户执行其他的窗口消息操作会造成一定的不便。

因此,在VB中采用多线程的方式来提高采集速率,让CPU同时进行数据采集和数据处理,把数据存储函数放到数据处理线程中去,这样就避免了存储语句放在回调函数中了。多媒体定时器执行一个线程,来完成数据采集的功能。其中回调函数应当尽量短,提高执行速度,避免函数的重入,去掉一切与系统调用有关部分。另外由主程序启动另一个线程,称为处理线程,使用timer控件(时间间隔设为1ms)作为处理线程,来完成数据处理的功能,即数据的存盘,图形的绘制,报表的生成等。另外用数组作为缓冲区暂时存储采集到的数据。

在VB中没有缓存。但是可以借鉴VC中数据采集思想:开一个Buffer,临时存放采集到的数据。比如,在定时器触发事件中取到数据,暂时存放到数组中,这里的数组就相当于Buffer。当数组的数据的个数达到一定数目时(比如1 000),发出一个信号,使标识flag变为false,说明缓存区的数据已满。这时处理线程捕捉到flag的状态,从而执行数据存盘savefile函数即将数组中的数据依次读出,进行数据处理。缓存区的数据存盘完毕后,使flag标识变为true,从而又执行定时器触发事件中的数据采集函数,接着采集数据。

具体流程如图1所示:

2.2 部分代码

在公共模块中的代码:首先声明引用win32api函数,再定义回调函数:

'timeSetEvent的回调函数:

在主窗体中的代码:

在Start_Click()函数中启动多媒体定时器,完成对硬件的初始化。多媒体定时器每隔一定的时间间隔在回调函数中调用自定义的getdata()函数实现数据的连续实时采集。Stop_Click()函数完成定时器的删除工作。

所有操作完成后,通过编译生成执行文件,该程序将按用户设定的时间间隔通过PCL813板卡读取传感器所采集的振动数据,还可以用VB自带的打包工具进行打包后安装。

2.3 该采集系统的功能

在VB环境中应用多媒体定时器编制的数据采集系统主要有以下5个功能,功能图如图2所示:

数据采集功能它主要是采集各个通道的数据,即通过PCL813板把传感器测得的数据传到计算机。

图形输出功能它是指在采集过程中,把根据采集数据所绘出的图形输出到屏幕上,可以任意打印各时段的图形。

数据输出功能把各个测点的数据实时的显示在屏幕上。

报表打印功能主要是指检测完成以后,把检测的各项数据以及测试时间、测试员等以固定格式的报告形式打印出来。

数据保存功能是把数据以文件的格式或以数据库的形式存储起来,以备以后查询使用。

3 结束语

本文利用VisualBasic6.0的多媒体定时器和硬件操作函数大大提高了实时数据的采集精度,定时精度可达到1ms,并应用到了振动压路机检测系统中。在振动频率较高的情况下,采集并还原出了其真实的振动曲线,在工程机械中收到了很好的效益。

参考文献

[1]王争荣,邓晓健,林济群.用多媒体定时器实现AD卡的高精度数据采集[J].工业控制计算机,2001,14(10):55-57.

[2]常发亮,刘静.多线程下多媒体定时器在快速数据采集中的应用[J].计算机应用,2003,23(6):177-178.

[3]李净,杨俊武,钱旭.用多媒体定时器精确控制采样频率[J].计算机应用,2000,20(12):69-70.

555定时器应用电路 篇2

一、555分段式定时电路

如图1所示, IC1和R1、RP1、C1等组成单稳延时电路, IC2和R2、RP2、C3等组成单稳定时电路, 二者构成分段式定时电路。

按下AN按钮约2秒钟, C1充满, IC1的 (3) 脚呈低电平。IC2置位, (3) 脚呈高电平, K吸合, 开始定时。此后, C1经RP1放电, 至UDD/3, IC1翻转, 呈高电平, IC2复位, K释放。

第一阶段定时, t1=1.1RP1C1, 约27分钟。

第二阶段定时, t2=1.1 (RP2+R2) C3, 约27分钟。故总定时T=t1+t2, 约54分钟。

二、555自动曝光电路

如图2所示, 该电路只用一支555和少量的阻、容元件组成。

555为单稳延时电路。按一下AN按钮, 则555置位, (3) 脚呈高电平, 执行机构或曝光灯点亮。硅光电池受光照, 产生的光电流I对C1充电, 当C1上电压超过2UDD/3阈值电平时, 555电路复位, (3) 脚转呈低电平, 执行机构 (或灯) 无电停止工作。阈值电平可由RP1调节, 其值应大于1.4 V。

三、555曝光定时器电路

如图3所示, 相片曝光定时电路以555为核心组成。这是一个人工启动式单稳态电路。按一下AN按钮, 定时电容C1立即放电到零, 555置位, 计时开始, J吸合, 电灯H得电点亮。灯亮的时间, 即C1充电到其电压升至阈值电平2UDD/3的时间td=1.1 (R1+RP1) C1。时间长短可根据胶片的种类具体而设定。定时到, 555又恢复至复位状态, (3) 脚转呈低电平, J释放, H自熄。图示参数的td约为2分钟。

四、555自动曝光定时器电路

如图4所示, 555和C1、硫化镉光敏电阻RG等组成单稳延时电路。将RG装在相机旁, 曝光时, 按下AN, 则555置位, J吸合, 曝光灯 (白色) 亮。光照强, 则RG呈现电阻小, td=1.1RGC1就短;光照弱, RG阻值大, td则长。td时间到, J释放, 白灯熄, 红灯亮, 曝光定时完成。

单片机定时器应用探讨 篇3

单片机的定时器是单片机里最“活跃”的部件之一,很多程序、应用系统都离不开定时器。由于定时器的应用与单片机的其他硬件相关,存在着一定的复杂性。而定时器也是单片机应用中解决某类复杂问题的最为有效的方法,应用非常广泛[1]。定时器的应用,可以说即简单又复杂。对于简单应用场合,时间要求较长不算很精确的场合,用起来就简单,对于复杂应用场合时间要求即短又精确的场合,用起来就要复杂。本文以STC90C51RC/RD+系列单片机定时器为研究对象,并给出几个示例程序。STC90C51RC/RD+系列单片机是宏晶科技推出的新一代超强抗干扰/高速/低功耗的单片机,指令代码完全兼容传统8051单片机,12时钟/机器周期和6时钟/机器周期可以任意选择。

2 定时器/计数器应用

2.1 STC90C51RC/RD+系列单片机定时/计数器

STC90C51RC/RD+系列单片机共3个16位定时器/计数器,其中定时器0还可以当成2个8位定时器使用。定时器0和定时器1,与传统8051的定时器完全兼容,当在定时器1做波特率发生器时,定时器0可以当两个8位定时器用。

STC90C51RC/RD+系列单片机内部设置的两个16位定时器/计数器T0和T1都具有计数方式和定时方式两种工作方式。对每个定时器/计数器(T0和T1),在特殊功能寄存器TMOD中都有一控制位C/T来选择T0或T1为定时器还是计数器。定时器/计数器的核心部件是一个加法(也有减法)的计数器,其本质是对脉冲进行计数。只是计数脉冲来源不同:如果计数脉冲来自系统时钟,则为定时方式,此时定时器/计数器每1 2个时钟或者每6个时钟得到一个计数脉冲,计数值加1;如果计数脉冲来自单片机外部引脚(T0为P3.4,T1为P3.5),则为计数方式,每来一个脉冲加1。

当定时器/计数器工作在定时模式时,可在烧录用户程序时在STC-ISP编程器中设置是系统时钟/12还是系统时钟/6后让T0和T1进行计数。当定时器/计数器工作在计数模式时,对外部脉冲计数不分频。

定时器/计数器0有4种工作模式:模式0(13位定时器/计数器),模式1(16位定时器/计数器模式),模式2(8位自动重装模式),模式3(两个8位定时器/计数器)。定时器/计数器1除模式3外,其他工作模式与定时器/计数器0相同,T 1在模式3时无效,停止计数。

定时器2是一个16位定时/计数器。通过设置特殊功能寄存器T2CON中的C/T2位,可将其作为定时器或计数器。

定时器2有3种操作模式:捕获、自动重新装载(递增或递减计数)和波特率发生器。这3种模式由T2CON中的位进行选择。

2.2 定时器/计数器应用

与传统8051单片机相比,STC90C51RC/RD+系列单片机性能更优越,就以定时/计数器为例,在笔者应用单片机定时器定时,输出脉冲过程中发现,如果需要用两个以上定时器同时工作,在定时时间较长情况下,前者的定时器能够胜任;但是,当两个同时工作的定时器至少有一个定时时间较短时,前者的定时器就会“罢工”。,鉴于此笔者选用STC90C51RC/RD+系列单片机作为研究对象。

如下几个示例程序,从不同方面应用STC90C51RC/RD+系列单片机的定时器,也充分展示了该类单片机的优越性。所有程序都经过keil软件调试通过,并生成*.hex文件烧入单片机实测。每一个程序都可作为一完整程序应用。

应用定时器进行定时或计数,不可避免要存在误差,而每个程序存在误差之处都以注释的形式标明。由于以下程序皆为C语言编写,需要经过编译器编译为汇编语言,所以,误差的精确值不易算出,仅仅标出产生误差的语句。而如果采用汇编语言编写,情况会好些。

1) 5秒内计数脉冲个数

单片机外接的振荡源频率为11.0592MHz,利用定时器0定时,每次定时50ms,循环100次,达到5s时间,利用定时器1计数5s内外部脉冲个数,并由串口传输给上位机。

本程序旨在说明定时器0与定时器1同时工作的编程方法与思路。

2) 定时器T0计数50个脉冲所需时间

/*查50个脉冲所需时间,脉冲由定时器T1发出,每50ms P1.1取反,形成脉冲,将P1.1连接到T0(14号)引脚,即可计数,定时器T0计数输入脉冲个数,50(0x32)先显示,之后,显示50ms的个数,再次显示TL1的值,最后显示TH1的值,此两个值是时间零头*/

……

……省略号部分与第一个程序相同

3) 定时器T2计数T1波特率发生器

/*脉冲由定时器T0发出,一定时间后p1.2取反,形成脉冲,T1波特率发生器,发出38k方波,T2计数,T2计数脉冲输入端为p1.0

……省略号部分与第一个程序相同

……

3 定时/计数器误差分析

由于单片机的机器周期为1μs~2μs,定时误差一般应在5μs~25μs之内,对于一般应用,此误差可以忽略,但是对于精确度要求比较高的应用场合,此误差必须进行校正[2]。定时误差是定时溢出后转入执行定时处理语句段之间所耗费的时间,此时间主要由定时溢出转入定时处理语句段所必须执行的指令或硬件过程产生.而且,在转入、转出定时器中断服务子程序过程都有延迟,即产生误差[1]。再有,如果像第一个程序那样,利用循环定时以产生更长定时,执行循环处理及控制指令时亦会产生误差,影响时间的精确性。

综上,虽然利用硬件定时会节省CPU的时间,并且,能产生较为“准确”的定时,但“准确”是相对的,误差会由于指令的执行而产生。为了得到更加精确的定时,这些误差是不容忽视的。

4 结束语

定时器是单片机里最“活跃”的部件之一,很多单片机的应用系统都是需要应用定时器。本文以STC90C51RC/RD+系列单片机作为研究对象,避开传统8051单片机的弊端,通过几个示例程序,展示了STC90C51RC/RD+系列单片机定时器的应用。程序并不复杂,也存在一定误差,如果想得到非常精确的定时,对于定时器的误差是必须考虑的,尤其是反复应用定时器的程序中,更要详尽考虑误差的产生原因及指令,必要时要做出修正。

参考文献

[1]王暄.单片机定时器的应用与误差纠正[J].电子元器件应用,2002,(5):15.

定时器/计数器教学设计 篇4

1 Proteus和Keil简介

Proteus是英国Labcenter electronics公司研发的EDA工具软件, 是多种型号单片机系统的设计与仿真平台, 能实现单片机与外设的电路系统、软件系统的设计与仿真, 在仿真过程中, 用户可以用鼠标单击开关、键盘、电位计、可调电阻等动态外设模型, 使单片机系统根据输入信号做出相应的响应, 并将响应处理结果实时地显示在LED、LCD等动态显示器件上, 实现了实时交互式仿真。

Keil C51是美国Keil Software公司出品的51系列兼容单片机C语言软件开发系统, 是目前最流行开发MCS-51系列单片机的软件, 它提供了包括C编译器、宏汇编、连接器、库管理和一个功能强大的仿真调试器等在内的完整开发方案, 通过一个集成开发环境 (uVision) 将这些部份组合在一起。

Keil与Proteus连接成功后, 可以在keil调试程序, 单步、全速、设置断点、观察变量的值等, 也可以在Proteus做硬件方面的模拟, 如按按键、改变可调电阻的阻值等, 这个时候keil都会有反应的。

2 定时器/计数器工作原理

80C51内部设有两个16位的可编程定时器/计数器, 即定时器0 (T0) 和定时器1 (T1) , 它们分别由两个8位专用寄存器组成, 即T0由TH0和TL0构成, T1由TH1构成, 每个寄存器可以单独访问, 用于存放定时或计数器初值。定时器方式寄存器TMOD用于选定定时器的工作方式, TCON用于控制定时器的启动与停止, 保存T0、T1的溢出和中断标志。当定时器工作在计数方式时, 外部事件通过引脚T0 (P3.4) 和T1 (P3.5) 输入。

3 计时秒表的设计实现

3.1 计数方式

3.1.1 计数方式1 (没有使用中断)

(1) Protues电路设计。

如图1所示。

(2) 源程序设计。

实验中, 定时器/计数器0 (T0) 作计数器用, 被计数的外部输入脉冲信号 (1kz) 从单片机的P3.4 (T0) 接入。单片机将对脉冲计数, 并将寄存器TH0和TH1的值分别送四位数码管实时显示。教学中, 可以通过改变计数的外部输入脉冲的频率改变计数快慢。

Keil C51高级语言

在Keil中可以看到C语言程序编译后生成的汇编代码。

3.1.2 计数方式2 (使用中断)

(1) Protues电路设计:图1。

(2) 源程序设计:汇编程序略。

实验中, 定时器/计数器0 (T0) 作计数器用, 被计数的外部输入脉冲信号 (1kz) 从单片机的P3.4 (T0) 接入。计数寄存器初值设为FFFF, 单片机对脉冲计数一次, 计数将发生溢出中断, 执行T0中断服务程序。

3.2 计时方式

3.2.1 rotues电路设计:将图1中的外部输入计数脉冲去掉

如图2所示。

3.2.2 源程序设计:汇编程序略

实验中, 定时器/计数器0 (T0) 作计时器用, 计数器的加1信号由振荡器的12分频信号产生, 如果晶振为12MHz, 则计数周期为1μs (如果晶振为6MHz, 则计数周期为2μs) 。程序中TMOD为计时方式1, M=216=65536, 如果要产生1ms的定时时间, 则需“加1”1000次 (计数值为1000) , 计时初值X=M-计数值=65536-1000=64536=0xFC18。教学中, 可以通过改变计时工作方式, 分别进行计时初值的设置, 让学生理解各种工作方式计时初值的计算方法。

4 结语与展望

秒表的设计实现能帮助学生较好地掌握计时器/计数器工作原理及实现方法, 理解汇编语言和C51语言设计方法;使用Proteus仿真, 整个过程与真实的软件、硬件调试过程相似, 有利于学生理解。使用图1, 还可以改用外部中断来实现秒表。另外, 可以将秒表设计扩展为六位秒表, 可复位秒表, 倒计时秒表, 可实时交互设置计时时间的秒表等。

参考文献

[1]张靖武.单片机系统的PROTEUS设计与仿真[M].北京:电子工业出版社, 2008.

多媒体定时器 篇5

关键词:555定时器,仿真软件,电路分析

Protel是Altium公司推出的EDA软件, Protel是个完整的板级全方位电子设计系统, 它包含了电原理图绘制、模拟电路与数字电路混合信号仿真、多层印制电路板设计、可编程逻辑器件设计、图表生成、电子表格生成、支持宏操作等功能, 并具有Client/Server (客户/服务器) 体系结构, 同时还兼容一些其它设计软件的文件格式, 如ORCAD, PSPICE, EXCEL等。

1 555集成定时器简介

555集成定时器是一种多用途的模拟电路和数字电路相结合的集成电路, 利用它可以很方便地实现多种脉冲电路。集成定时器分为双极型和单极型两类, 产品型号繁多, 但所有定时器的产品型号后三位数码均为555, 且同型号器件的功能和外部引脚的排列完全相同, 所以将它们统称为555定时器。555定时电路是由三个5千欧电阻组成分压器、两个高精度电压比较器、一个基本R-S触发器、一个作为放电通路的三极管及输出驱动电路组成。它的逻辑电路图和电路符号如下图所示:

2 应用仿真软件进行仿真的基本方法

(1) 555构成的单稳态触发器仿真。555构成的单稳态触发器仿真电路如下图, 输入引脚只在初始阶段输入一个负脉冲。

R、C为外接定时元件。静态时uI为高电平, VCC通过R对C充电, uC上升, 当uC≥2VCC/3时, 复位控制端TH>2VCC/3, 而uI高电平使置位控制端undefined, 定时器复位, undefined, 放电管饱和导通, C经过放电, uC下降, 由于uI高电平使undefined, 因此即使uC≥2VCC/3, 定时器也仍然保持复位, undefined, 放电管始终饱和导通, C逐渐将电放完, uC≈0, 电路处于稳态。

当触发器uI为低电平时, 置位控制端undefined, 而此时uC≈0, 又使得复位控制端TH<2VCC/3, 则定时器置位, undefined, 放电管截止, 电路进入暂稳态。之后, VCC通过R对C进行充电, uC上升。当uC≥2VCC/3时, 复位控制端TH>2VCC/3, 而此时ui已完成触发, 回到高电平使置位控制端undefined, 定时器又复位, undefined, 放电管又导通, 电路回到稳态。C放电, 电路恢复结束。根据电路的工作原理, 代入三要素公式可得:undefined

根据仿真参数计算得到的理论值为tW=1.1RC=29.7ms。仿真参数中输入脉冲设置如下:

仿真波形如图:

仿真得到的tW=29.737ms

(2) 555构成的多谐振荡器仿真。555构成的多谐振荡器仿真电路如图。R1、R2、C为外接的定时元件, 接通电源后, VCC对C充电, uC上升, 最初uC2VCC/3, 置位控制端undefined, 定时器复位, undefined, 放电管导通, C通过放电, uC下降。当uC≥VCC/3时, 又回到复位控制端TH<2VCC/3, 置位控制端TR

根据电路的工作原理, 代入三要素公式可得:

undefined

理论计算得到undefined

undefined

仿真波形如下:

仿真得到的tW1=144.13us, tW2=68.413us

3 结论

可以看到, 通过Protel对电路进行仿真, 得到的仿真值和理论计算值相当接近, 且各元件选择范围广, 参数修改方便, 不会出现在实际操作中器件损坏和焊接的问题, 使得电路的调试变得快捷、方便, 可以避免出现仪器不足, 器件不全的问题, 与传统试验相比, 更能突出开放试验教学模式, 进一步培养学生的综合分析、开发设计和创新能力, 并且整个过程非常简单、直观, 与操作实际电路的差别很小, 既摆脱了纯理论分析的枯燥与繁琐, 又减少了操作实际电路所带来的不便, 是理论联系实际的一座桥梁。

电子技术是一门试验性很强的学科, 电子技术理论的教学最好和试验同步进行, 以加强感性认识。试验需要测量仪器和电子元件, 受到客观条件的限制, 而用仿真得方法摆脱了这些约束。用电路仿真试验验证理论分析结论是一种有效的方法, 电子技术教学中的绝大部分电路都能够应用Protel进行虚拟试验, 如果在电子技术理论课教学中用Protel作为辅助教学手段, 可以起到事半功倍的效果。

应用于教改的单片机定时器 篇6

关键词:单片机,定时器,LED,拨码开关

1 引言

本套系统是为方便学生进行单片机实训而设计的,该系统不仅可以进行模拟数据采集,也可以进行开关量控制,由于我们的教学进度分两步,首先让同学们将电路板焊接好,进行数据的输入与显示及声光“报警”,这一步调试好后,再进行模拟量的采集整理。本文所描述的程序就是要求学生完成定时器的设置而编制的范例程序。

2 系统总体设计

本系统主要有七大部分组成,即:C P U,键盘(D I P拨码开关,也可以扩展),显示(4位L E D),模入,开出,报警及存储器七大部分。结构框图如图1。

3 系统原理

系统应用定时器t0,硬件定时100ms,定时器初值是3cafh,循环10次,即为1秒,循环600次即为一分钟。系统复位后,LED显示0000,并不断闪烁,同时系统利用蜂鸣器播放音乐《八月桂花香》,此时,拨动DIP1,开始设置定时时间秒数,拨动一次,L E D的后两位显示即加1,同时,音乐停止(只要开始设置时间,音乐即停止),如果DIP1拨上之后不动,那么秒数就不断自增,通过LED的后两位可显示出来,该两位L E D不断闪烁自增,当增至59后,再自增1,后两位LED恢复到00,同时前两位LED增1,表示秒数增至60,那么分钟增1,秒数恢复到00。拨下DIP1,拨动DIP2,设置定时时间分钟数,拨动一次,LED前两位闪烁增1,如果DIP2拨上不动,那么分钟数不断自增,因为使用2位LED显示分钟数,所以,分钟数最大为99分,当增至99时,再增1,则前两位LED自动恢复为00。时间设置好后,4位LED显示所设置时间,同时不断闪烁,处于“待命”状态,当拨上DIP3时,启动定时,后2位LED每秒闪烁一次,同时秒数减1,当减至00时,再下一秒,则分数减1,即前两位LED显示的数据减1,后两位LED从59开始递减。当定时时间到,即4位LED显示为0000时,停止闪烁,同时播放音乐《八月桂花香》。

4 系统设计

4.1 硬件子系统

CPU部分采用性价比较高的A T 8 9 C 5 1单片机,数据存储器选用一片6264,键盘部分可以扩展,暂用4位DIP,低位到高位分别对应8255的PC4至PC7,LED采用4个74LS48驱动,74LS48是共阴极7段数码管驱动芯片,当然,也可以用其它驱动芯片。播放音乐用的蜂鸣器就是声光报警所用的蜂鸣器,其通过74LS244驱动与CPU的P1.6相连。因本文只应用了本系统进行定时设置,所以,暂不对模拟部分进行介绍。以后另行描述。具体电路如图:[2]

4.2 软件子系统设计

在软件部分,完成本系统原理所描述的过程,关键程序如下:

设置时间程序段:

并且有控制铃声在设置时间过程中不响

以下程序为了播放音乐《八月桂花香》[1]

4结束语

本系统是应计算机系教改而设计的,其可实现的功能很多,现在先让学生完成数字部分的设计,下一步再进行模拟部分。对于模拟部分,本人还会继续编制一些范例程序,以后再继续阐述。本文介绍了带播放音乐的定时器,播放音乐的核心代码摘录自网上,已标明。在此,我对原作者深表感谢。本定时器的难点在于如何把音乐结合进来,并且如何控制停止播放,这样可进一步提高同学们的编程实践能力。

参考文献

[1]http://www.pe.gxnu.edu.cn/cx/Article/ArticleShow.asp?ArticleID=40,2007-8-19。

一种风铃式定时器算法研究与实现 篇7

关键词:定时器,双向链表,资源管理,定时触发

0 引言

在通信协议软件中,定时器的使用无处不在。使用定时器可以进行通信协议的状态保护、定时监控或事件维持等。为了防止程序无限制地运行,造成死循环,还会设置看门狗以便在软件故障时复位系统,其本质也是定时器。

定时器的实现可以采用硬件和软件2 种方式实现。硬件方式是利用硬件计时并以中断方式通知,其缺点是定时到时可反馈的信息比较少,并且难以支持同时实现数十个甚至上百个定时器。采用软件方式可直接利用操作系统定义的定时器函数,但其占用系统资源较多,不断涉及到系统的任务切换,在多个定时器同时使用时尤为明显,所带信息也多以函数参数形式实现,可反馈信息量有限。而降低大量定时器在系统内的插入、删除和超时等操作开销,是关系系统性能高低的重要技术[1]。

本文基于双向链表和定时触发的思路实现了一个风铃式的软件定时器[2,3],可作为嵌入式实时操作系统的一个单独任务执行,达到代码精简,算法优化,占用硬件或系统资源少,对系统处理能力影响小的效果[4]。

1 总体设计

1. 1 定时器资源管理设计

软件系统中每一个定时器都会占用一部分内存资源,定时器越多,其占用的内存就会越多,所以定时器也是一种资源,要进行管理以解决资源的占用和释放。需要时申请,不需要时或超时后要释放,避免内存不断泄露。

描述一个定时器主要由标识和属性组成,定时器标识和定时器属性一一对应。标识具有唯一性,一个标识代表一个定时器。通常以连续的从0 开始的阿拉伯数字作为每个定时器的唯一标识,根据最大的阿拉伯数字即可知道定时器的数量( 其数值+ 1) 。定时器属性主要由双向指针、使用者标识和一些自定义信息组成,其中双向指针、使用者标识为必选信息。双向指针用于在双向链表中的插入和删除,使用者标识用于定时器超时后通知,自定义信息可由使用者根据自己情况任意定义。

申请者申请定时器成功后,会获得一个定时器标识,该标识具有随机性。释放时基于使用者提供的定时器标识进行定时器回收。为此主要利用一个数组和2 个指针实现了定时器资源的管理,如图1所示。

数组的大小决定了定时器的数量。在初始状态,初始化数组值、定时器标识值和数组下标值相等,首尾指针都指向数组的基地址。当申请定时器时,首指针所指定时器标识被申请并且该指针前移一格。当释放定时器时,定时器标识放入尾指针所指位置并且该指针同样前移一格。图1 中示例为0 和1 号定时器先后被申请,然后1 号定时器被先释放。

任何一个指针指向数组尾部,都要重新指向数组基地址。首指针到尾指针之间的定时器记录还未被申请的定时器。当首指针追上尾指针时,表示定时器已申请耗尽。

1. 2 风铃式定时器架构设计

现实中的风铃由顶层的圆环和多个等间隔的多个风铃串组成,每个风铃串由于铃铛数量不同而长短不一。风铃式定时器借鉴这种理念,将圆环上的串间隔等同于最小定时精度,串越多则间隔越多,一圈可代表的时间就越长。假设1 个串间隔为100 ms,间隔为100,则一圈即可定时长度为10 s。

同时将风铃串上的风铃比喻为定时器,每个串上的定时器可通过双向链表操作实现挂接和卸除,如图2 所示。

每过一个定时精度,当前串下的定时器就意味着超时了,需要停止定时并将超时消息发给使用者,同时,使用者在启动定时器时留存的各种自定义信息也可原样返回给使用者。

启动一个定时器,就是将定时器挂上相应风铃串的过程。首先计算要启动的定时器需要多少个定时间隔,然后将定时器挂到当前串后相应间隔的风铃串的头部上。

停止一个定时器,即将定时器从风铃串上取下来的过程。基于使用者提供的定时器标识,可以索引到定时器的属性。利用属性中提供的双向链表指针即可进行链表的节点删除操作,也就完成了定时器的停止工作。

1. 3 数据结构设计

定时器的数据结构主要包括定时器数量、定时精度、定时长度、定时器及定时器属性的数据设计。

1. 3. 1 定时器数量及标识声明

#define MAX_TIMER_NUM100

该值定义了定时器最大数量,通过更改该数值可以增加定时器数量。

int Timer Id Idx Array[MAX_TIMER_NUM];

该数组用于存储定时器标识。

该数据结构用于定时器资源的管理。其首尾指针主要指向Timer Id Idx Array。

1.3.2定时间隔及风铃串头指针声明

#define TIMING_PERIMETER10

定义了定时圆周间隔数量,通过更改该数值可以增加一圈的最大定时长度。如果定时精度为100 ms,则风铃转一圈为100 ms*10 = 1 s。

该结构数组定义了每个风铃串的头指针。

1. 3. 3 定时器属性声明

上述数据结构描述了定时器属性。正如前述,双向指针、使用者标识为必选信息。双向指针用于风铃串上定时器的插入和删除,使用者标识用于定时器超时后通知,自定义信息可由使用者根据自己情况任意定义。新增的圈数为可选项,通过该值可增加定时长度。风铃转一圈后,该值- 1,只有该值为0 时,才可认为定时器超时。

2 定时器触发源

风铃式定时器能够运行,定时触发是必不可少的。定时触发源主要采用系统时钟之外的一个定时中断,是一种辅助时钟[5]。常用的触发源主要有以下几种:

① 硬件中断。由硬件提供1 个定时中断,每次中断产生就调用一次风铃,风铃就转动一个间隔。其缺点就是在中断处理函数中需要进行过多的软件处理。

② 硬件中断结合信号量。同样利用1 个硬件的定时中断,每次中断发送一个信号量给定时任务。定时任务收到信号量后调用一次风铃,风铃就转动一个间隔。该方法简化了中断处理函数的工作量。

③ 利用操作系统的任务延迟功能。一般情况下,嵌入式实时操作系统会提供任务延迟功能,通过调用该函数,相应的软件任务就会在规定tick数量后( 一般情况下60 ticks = 1 s) 被执行一次。

利用该功能,规定时间内风铃也会被调用一次,即转动一个间隔。其前提需要确保系统时钟非常准确,即60 ticks时长确实是现实中的1 s。

④ 利用操作系统的定时函数加信号量。在操作系统中申请一个系统定时器,启动操作系统定时器时需要指明一个函数作为参数,用于超时后被调用。该函数再重新启动定时器并发送信号量。通过这种无限迭代的方式实现了定时触发源的获取。与硬件中断结合信号量不同之处是利用系统定时器产生软件中断,其前提仍然需要确保系统时钟非常准确。

上述4 种方式可根据实际工程情况进行选择。常见的是②和③。触发源②定时比较精准,触发源③实现比较简单。

3 软件实现

3. 1 定时器的初始化

定时器初始化主要包括定时器标识、定时器属性和风铃圈的初始化。

3. 1. 1 定时器标识初始化

3.1.2定时器属性初始化

3. 1. 3 风铃圈初始化

上述操作让每个风铃串首尾指针首先指向自身。

3. 2 定时器的申请和释放

定时器申请就是要从存储定时器标识的数组中申请定时器。其主要操作如下:

定时器释放就是将定时器标识重新放入存储定时器标识的数组中,以备再次申请。其主要操作如下:

3. 3 定时器的启动和停止

定时器启动和停止就是将定时器挂接到相应风铃串的过程。为此需要计算定时时长在当前位置之后的多少个间隔,然后基于双向链表操作将定时器挂接到相应的风铃串上。其主要操作如下:

定时器停止就是将定时器从相应风铃串删除的过程。其主要操作就是基于定时器属性的双向指针将其从风铃串中删除。

3. 4 定时器超时

每经过一个定时触发时间,后移一个定时间隔后对应的风铃串就变为当前风铃串,其上的所有定时器( 风铃) 就被认为超时。将定时器从当前风铃串上逐一删除,并可利用定时器属性上的信息通知使用者。

4 性能测试和结果分析

在操作系统Vx Works 5. 5 和处理器PPC 860 的测试环境下[6],采用硬件的一个100 ms定时中断做为触发源。从图3 中调用系统函数sys Clk Rate Get可以看到,系统时钟默认1 s = 60 ticks。为避免频繁打印,软件程序每隔1 s( 10 * 100 ms) 打印一次并输出当前的系统tick值。相邻输出的tick的差值正好是60 ticks。说明触发源和系统时间进行了精确校准,即100 ms = 6 ticks。

调用函数Start Timing分别在100 ms和1 s精度下( 函数的第5 个参数为1 表示100 ms精度,为2表示1 s精度,第6 个参数是时长) ,进行了10 s的定时测试,如图4 所示。由图4 可以看到,申请和启动定时在1 tick时间内即可完成。2 次定时分别用时602 ticks和603 ticks,与理论用时600 ticks相差< 6 ticks,即误差< 100 ms,符合预期。

同样调用函数Start Timing分别在100 ms和1 s精度下进行了1 min的定时测试,如图5 所示。

由图5 可以看到,申请和启动定时仍在1 tick时间内完成。2 次定时分别用时3 605 ticks和3 602 ticks,与理论用时3 600 ticks相差< 6 ticks,即误差同样< 100 ms,符合预期。

通过性能测试,验证了定时器的申请、启动效率都没有给定时精准度造成影响。而且由于定时的基本触发源为100 ms,无论采用100 ms还是1 s定时精度,定时误差都不会超过100 ms( 即6 ticks) 。实际应用中,考虑到可容忍误差,该定时器多用于1 s以上到分钟级的定时。

5 结束语

定时器作为一种资源有可能被多个软件重复性地申请和释放,从避免双向链表中断的角度考虑,建议在申请和释放定时器操作时增加信号量互斥操作。此外,使用者只需根据自己实际情况修改宏定义的数值就可调整定时器数量和定时长度,接口简单且易操作。

风铃式定时器由于其占用硬件及系统资源少,对外接口简单、独立性强和软件量少等特点,已被笔者多次应用到通信协议栈和监控项目的开发中,取得了良好的工程实践效果。此外,使用首尾指针前后追赶实现定时器管理的方法,不仅效率高,还可被抽象出来应用于具有唯一标识的各种资源管理中去。

参考文献

[1]窦志斌.基于C语言的高性能LTE RLC层设计与实现[J].无线电工程,2014,44(12):11-13.

[2]潘金贵,顾铁成,李成法,等.算法导论[M].北京:机械工业出版社,2012.

[3]严蔚敏,吴伟民.数据结构&lt;C语言版&gt;[M].北京:清华大学出版社,2000.

[4]李光.大型有限状态机系统中的定时器设计[J].无线电工程,2005,35(6):54-56.

[5]山清.Vx Works下基于辅助时钟的通用定时器设计[J].电子科技,2014,27(3):126-128.

上一篇:同质团体辅导下一篇:语文教学评价小议