请帮忙检查使用定时器3制作的定时器程序对不对?
使用STC8H8K64U的定时器3写了一段定时器程序。恳请请行家指点对不对。程序如下:void delayS(u8 delaysvalue) //delaysvalue参数为输入的整数秒值,例如1秒、2秒、5秒、6秒等。
{
u8 i ;
TM3PS = 14 ; //这是根据晶振11059200,通过预分频,使得定时器一个周期为1秒。
// T3_VALUE = 65536-XTAL/(TM3PS+1)/12 ; //1秒定时参数计算公式
T3H = 0x10 ; //计算的定时1秒值
T3L = 0x00 ; //计算的定时1秒值
T4T3M = 0x08 ; //启动T3定时器
for (i=0;i<delaysvalue;i++) //根据需要延时的秒数循环
{
while( ~(0x02 & AUXINTIF) ); //等待定时器3中断。检测T3IF中断请求。
}
T4T3M &= ~0x08 ; //停止T3运行
}
void TM3_Isr() interrupt 19 //定时器3中断服务子程序,同时硬件清除T3的中断标志
{
//其它什么都没有做
}
编译没有问题和警告。但上述程序能否正确运行不太踏实?在循环等待检测T3IF中断请求语句,会不会死循环?
主程序中已经设定:
IE2 |=0x02 ; //允许定时器3中断,没有中断优先级设定。
EA = 1 ; //开CPU中断 运行应该是没问题的。但是请注意,程序中使用的auxintif在某些单片机系列中是只写寄存器,
你如读他,可能不是你预测的值,如逻辑判断不合理,你程序写的不好可能就会自己在那永远循环等待。
比如stc8h1k08和28系列。具体请参考技术手册的中断请求寄存器的注意事项部分
个人建议可以考虑一个定时器作为基准时间计时,或者直接荣rtc来长时间计时,这样用显得有点浪费定时器了 如,楼上所说,建议楼主优化定时器的使用技巧。 谢谢楼上行家的回复!正在使用STC8H8K64U,定时器3/4都没有使用。长时间定时使用的不多,尝试用定时器3。 定时器3延时程序实际测试结果表明,语句“while( ~(0x02 & AUXINTIF) );”会导致死循环!
延时程序中的for循环部分改为如下:
for (i=0;i<delaysvalue;i++)
{
// while( ~(0x02 & AUXINTIF) ); //等待定时器3中断。检测T3IF中断请求
while( ~tm3intflag ); //设置了一个全局位变量:t3mintflag。初始化为0,在中断服务程序中修改
tm3intflag = 0 ; //自定的TM3中断标志清零
View( i ); //编制的CDC串口输出子程序,调用以显示中断是否正常。
}
设置了一个全局位变量:t3mintflag。初始化为0,在“void TM3_Isr() interrupt 19”中断服务程序中置1:
void TM3_Isr() interrupt 19 //定时器3中断服务子程序,同时硬件清除T3的中断标志
{
tm3intflag = 1 ; //TM3中断标志置位
}
程序按上述修改后才可以正常运行。推测应该是TM3中断程序在前清零了中断标志,导致“while( ~(0x02 & AUXINTIF) );”始终检测不到中断发生。
自己设定的中断标志,才能实现定时器3的延时。
页:
[1]