你现在位置:首页>技术论文>电气常识>仪器仪表>正文
C51的精准延时程序(Timer)
日期:2011-9-16 20:20:20 点击:
来源:本站整理
作者:
点击【】放大字体.

使用定时器 /  计数器实现精确延时

——可——编——程——控-制-器-技——术——门——户

单片机系统一般常选用 11.059 2 MHz 、 12 MHz 或 6 MHz 晶振。第一种更容易产生各种标准的波特率,
P_L_C_技_术_网——可——编——程——控-制-器-技——术——门——户

后两种的一个机器周期分别为 1 μ s 和 2 μ s ,便于精确延时。本程序中假设使用频率为 12 MHz 的晶振。 最
WWW※PLCJS_COM-PL#C-技.术_网(可编※程控※制器技术门户)

长的延时时间可达 216=65 536 μ s 。若定时器工作在方式 2 ,则可实现极短时间的精确延时;如使用其他
WW.W_PLCJS_COM-PLC-技.术_网

定时方式,则要考虑重装定时初值的时间(重装定时器初值占用 2 个机器周期)。
P_L_C_技_术_网——可——编——程——控-制-器-技——术——门——户

在实际应用中,定时常采用中断方式,如进行适当的循环可实现几秒甚至更长时间的延时。使用定时
WWW_PLCJS※COM-PLC-技.术_网(可※编程控※制器技术门户)

器 / 计数器延时从程序的执行效率和稳定性两方面考虑都是最佳的方案。但应该注意, C51 编写的中断服务
——可——编——程——控-制-器-技——术——门——户

程序编译后会自动加上 PUSH ACC 、 PUSH PSW 、 POP PSW 和 POP ACC 语句,执行时占用了 4 个机器周
WWW_PLC※JS_COM-PmLC-技.术_网

期;如程序中还有计数值加 1 语句,则又会占用 1 个机器周期。这些语句所消耗的时间在计算定时初值时要
P.L.C.技.术.网——可编程控制器技术门户

考虑进去,从初值中减去以达到最小误差的目的。
P.L.C.技.术.网——可编程控制器技术门户

软件延时与时间计算

WWW_PLCJS_COM-PLC-技.术_网

在很多情况下,定时器 / 计数器经常被用作其他用途,这时候就只能用软件方法延时。下面介绍几种 软
W1WW_P4LCJS_COM-PLC-技.术_网

件延时的方法。
P.L.C.技.术.网——可编程控制器技术门户

 短暂延时

WWcW_PLCJS_COM-PLC-技.术_网

可以在 C 文件中通过使用带 _NOP_( ) 语句的函数实现,定义一系列不同的延时函数,如 Delay10us( ) 、
WWW_PLCJ-S_COM-PLC-技.术_网(可-编程控-制器技术-门户)

Delay25us( ) 、 Delay40us( ) 等存放在一个自定义的 C 文件中,需要时在主程序中直接调用。如延时 10 μ s
WWW_PLCJS※COM-PLC-技×术_网(可编程控※制器技术门户)

的延时函数可编写如下:
WWW_P※LCJS_COM-PLC-)技.术_网

void Delay10us( ) {
WWW_PLCJS※COM-PLC-技×术_网(可编程控※制器技术门户)

_NOP_( );
WWW_PLC※JS_COM-PLC-技.术_网(可编程控※制器技术门户)

_NOP_( );
WWW_PLCJS_COM-PLC-技.术_网

_NOP_( );
WW.W_PLCJS_COM-PLC-技.术_网

_NOP_( );
P.L.C.技.术.网——可编程控制器技术门户

_NOP_( );
WWW_PLCJS※COM-PLC-技×术_网(可编程控※制器技术门户)

_NOP_( );
WWW※PLCJS_COM-PL#C-技.术_网(可编※程控※制器技术门户)

}
WWW.PLCJS.COM——可编程控制器技术门户

Delay10us( ) 函数中共用了 6 个 _NOP_( ) 语句,每个语句执行时间为 1 μ s 。主函数调用 Delay10us( )
——可——编——程——控-制-器-技——术——门——户

先执行一个 LCALL 指令( 2 μ s ),然后执行 6 个 _NOP_( ) 语句( 6 μ s ),最后执行了一个 RET 指令( 2
WWW_P※LCJS_COM-PLC-)技.术_网

),所以执行上述函数时共需要 10 μ s 。 可以把这一函数当作基本延时函数,在其他函数中调用,
P.L.C.技.术.网——可编程控制器技术门户

套调用 \[4\] ,以实现较长时间的延时;但需要注意,如在 Delay40us( ) 中直接调用 4 次 Delay10us( ) 函 数 ,
W1WW_P4LCJS_COM-PLC-技.术_网

的延时时间将是 42 μ s ,而不是 4 0 μ s 。这是因为执行 Delay40us( ) 时,先执行了一次 LCALL 指令( 2
WWW_P※LCJS_COM-PLC-)技.术_网

),然后开始执行第一个 Delay10us( ) ,执行完最后一个 Delay10us( ) 时,直接返回到主程序。依此类 推 ,
W1WW_P4LCJS_COM-PLC-技.术_网

是两层嵌套调用,如在 Delay80us( ) 中两次调用 Delay40us( ) ,则也要先执行一次 LCALL 指令( 2 μ s ),
WWW_PLCJS_COM-PLC-技.术_网

执行两次 Delay40us( ) 函数( 84 μ s ),所以,实际延时时间为 86 μ s 。简言之,只有最内层的函数 执
WWW_P※LCJS_CO※M-PLC-技-.术_网

ET 指令。该指令直接返回到上级函数或主函数。如在 Delay8 0 μ s( ) 中直接调用 8 次 Delay10us( ) ,此 时
plcjs.技.术_网

时时间为 82 μ s 。通过修改基本延时函数和适当的组合调用,上述方法可以实现不同时间的延时。
W1WW_P4LCJS_COM-PLC-技.术_网

//--------------------------------------------------------------------------------------------------

WWW_PLCJS@_COM%-PLC-技.术_网

// 函数名称: Timer0_init()
WWW_PLCJ-S_COM-PLC-技.术_网(可-编程控-制器技术-门户)

// 函数功能: 初始化设置
WWW_PLCJS※COM-PLC-技.术_网(可※编程控※制器技术门户)

// 设定 INT0 的工作方式
WWW_P※LCJS_CO※M-PLC-技-.术_网

//--------------------------------------------------------------------------------------------------
WWW_PLC※JS_COM-PmLC-技.术_网

void Timer0_init(void )
WWW_PLC※JS_COM-PLC-技.术_网(可编程控※制器技术门户)

{
P_L_C_技_术_网——可——编——程——控-制-器-技——术——门——户

TMOD="0x20"; // 定时器 0 工作在方式 2 的定时模式
WWW_PL※CJS_COM-PLC-技.术_网

ET0=1; // 定时器 0 中断允许
WWW_P※LCJS_CO※M-PLC-技-.术_网

TH0=0;
WWW_PLCJ-S_COM-PLC-技.术_网(可-编程控-制器技术-门户)

TL0=0;
W1WW_P4LCJS_COM-PLC-技.术_网

TR0=1; // 定时器 0 开始计数
plcjs.技.术_网

EA="1"; // 系统中断允许
WW.W_PLCJS_COM-PLC-技.术_网

}
WW.W_PLCJS_COM-PLC-技.术_网

//--------------------------------------------------------------------------------------------------
WW.W_PLCJS_COM-PLC-技.术_网

// 函数名称: TIMER0_intrupt
WWW_PLC※JS_COM-PmLC-技.术_网

// 函数功能: 定时器 0 中断处理程序 按键定时查询
P_L_C_技_术_网——可——编——程——控-制-器-技——术——门——户

//--------------------------------------------------------------------------------------------------
WWW_PLCJS※COM-PLC-技.术_网(可※编程控※制器技术门户)

void TIMER0_SCANkey() interrupt 1 using 1
P_L_C_技_术_网——可——编——程——控-制-器-技——术——门——户

{
WWW_PLC※JS_COM-PLC-技.术_网(可编程控※制器技术门户)

EA="0"; // 系统中断禁止
WWW_PLCJS※COM-PLC-技.术_网(可※编程控※制器技术门户)

if(( COUNT_TI)0==0)
WWW※PLCJS_COM-PL#C-技.术_网(可编※程控※制器技术门户)

{
WWW.PLCJS.COM——可编程控制器技术门户

switch(COUNT_TI/30)
WW.W_PLCJS_COM-PLC-技.术_网

{
WW.W_PLC※JS_C,OM-PL,C-技.术_网

case 1:if(scan_key()==0)
——可——编——程——控-制-器-技——术——门——户

COUNT_TI=0; // 无键按下,计数值归零
WWW_P※LCJS_COM-PLC-)技.术_网

break;
WWW_PLCJS※COM-PLC-技.术_网(可※编程控※制器技术门户)

case 2:break;
WWW_PLCJS_COM-PLC-技.术_网

case 3:if(scan_key()==0)
WWcW_PLCJS_COM-PLC-技.术_网

COUNT_TI=0; // 无键按下,计数值归零,上次按键未扰动
plcjs.技.术_网

else
——可——编——程——控-制-器-技——术——门——户

key_code=scan_key(); // 又有效建,获取键值
WWW_PLCJS@_COM%-PLC-技.术_网

break;
plcjs.技.术_网

default:if(scan_key()==0) // 等待按键释放
WWW.PLCJS.COM——可编程控制器技术门户

key_manage(key_code); // 有一个有效按键,调用按键处理程序
WWcW_PLCJS_COM-PLC-技.术_网

}
WWW_PLC※JS_COM-PLC-技.术_网(可编程控※制器技术门户)

}
P_L_C_技_术_网——可——编——程——控-制-器-技——术——门——户

EA=1;
WW.W_PLC※JS_C,OM-PL,C-技.术_网

}
plcjs.技.术_网

WWW_P※LCJS_CO※M-PLC-技-.术_网

//--------------------------------------------------------------------------------------------------
WWW_PLC※JS_COM-PmLC-技.术_网

// 函数名称: delay
WWW_PLCJS_COM-PLC-技.术_网

// 入口参数: N
WWW_PLCJS_COM-PLC-技.术_网

// 函数功能:延时子程序,实现 (16*N 24)us 的延时
WW.W_PLC※JS_C,OM-PL,C-技.术_网

// 系统采用 11.0592MHz 的时钟时 , 延时满足要求 , 其它情况需要改动
WWW_PLCJS※COM-PLC-技×术_网(可编程控※制器技术门户)

//--------------------------------------------------------------------------------------------------
WW.W_PLCJS_COM-PLC-技.术_网

void delay(unsigned int N)
P.L.C.技.术.网——可编程控制器技术门户

{
P_L_C_技_术_网——可——编——程——控-制-器-技——术——门——户

int i;
WWW_PLCJS@_COM%-PLC-技.术_网

for(i=0;i<N;i );
P_L_C_技_术_网——可——编——程——控-制-器-技——术——门——户

}
WW.W_PLC※JS_C,OM-PL,C-技.术_网

评论内容
载入中...
载入中...
P
L
C



|










|


P
L
C









·最新招聘信息
·最新求职信息
·推荐产品
·推荐厂商
·栏目热门排行
·站内热门排行