大家帮忙看看,关于用定时器T0测频宽的一个错误
我想用定时器T0测量一个50Hz方波信号,用INT0捕捉下降沿,在INT0中断服务程序中启动T0;T0定式参数设置为500us,在T0中断服务程序中重载定时参数。主程序等待信号的上升沿到来,上升沿一到,就关闭T0。其中INT0仅仅触发一次,下载开中断有主程序决定。现在的问题是:T0检测到的中断次数R3不定---按照计算,大概范围是R3=20次左右;实际上程序运行不可靠,经常程序3次等等不正常现象。不知道问题出在哪里。源程序如下:
; 本程序采用晶振: 12MHz
; 50Hz和100Hz采样
;*******************************************************************
BYT_DLY EQU 30H
BIT_INT0 BIT 01H
BIT_T0 BIT 00H
ORG 0000H
AJMP Main
ORG 0003H
AJMP INT_INT0 ; 外部中断INT0
ORG 000BH ; 定时器T0
AJMP INT_T0
ORG 002BH
RETI
;*******************************************************************
;*******************************************************************
MAIN:
MOV SP,#68H
;-------------------------------------------------
Initial:
CLR P1.0
CLR P1.1
CLR BIT_INT0 ; T0启动标志
Initialized:
MOV R3,#00H ; T0中断次数
;-------------------------------------------------
;设置T0
MOV TMOD,#01H ; T0,方式1
;-------------------------------------------------
;设置INT0
SETB TCON.0 ; IT0=1,边沿触发
SETB IP.0 ; PX0=1,设INT0为高优先级
SETB EX0 ; 允许INT0中断
;-------------------------------------------------
SETB EA ; 开中断
;*******************************************************************
; ※※※※※※※※※※※※※※※※※
; ※※ ※※
; ※※ 主程序流程 ※※
; ※※ ※※
; ※※※※※※※※※※※※※※※※※
;*******************************************************************
; 判断脉冲个数,确定脉冲频率
Wait:
;-------------------------------------------------
JNB BIT_INT0,$ ; 等待T0启动
CLR BIT_INT0
;-------------------------------------------------
; 判断上升沿,已到,不再重载定式常数;否则,等待
JNB P3.2,$
;-------------------------------------------------
; 停止T0
CLR ET0 ; 停止T0中断
CLR TR0 ; 停止T0
;-------------------------------------------------
; 比较R3,确定脉冲宽度
......
AJMP Wait
;-------------------------------------------------
;*******************************************************************
; 外部中断INT0
INT_INT0:
;设置T0
MOV TH0,#0FEH ; 定式脉冲宽度500us
MOV TL0,#18H ; #0BH
; 启动T0
SETB TR0 ; 启动T0
SETB ET0 ; 允许T0中断
;-------------------------------------------------
CLR IE0 ; TCON.1
CLR EX0 ; IE.0,停止INT0
;-------------------------------------------------
RETI
;*******************************************************************
; 定时器中断T0
INT_T0:
SETB BIT_INT0 ; T0启动标志
;-------------------------------------------------
MOV TH0,#0FEH ; 定式脉冲宽度500us
MOV TL0,#0BH
SETB TR0 ; 启动T0
SETB ET0 ; 允许T0中断
INC R3
;-------------------------------------------------
RETI
;*******************************************************************
END
发表时间:2005年1月7日11:16:36