导航: 老古网老古论坛XMOS公共讨论区XMOS开源项目区单片机程序设计嵌入式系统广告区域
→大家帮忙看看,关于用定时器T0测频宽的一个错误[懒虫]

 *第28960篇: 大家帮忙看看,关于用定时器T0测频宽的一个错误

  
楼 主:懒虫 2005年1月7日11:16
 大家帮忙看看,关于用定时器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

  
2楼:懒虫 2005年1月7日11:19
 我实在找不到问题,请大家帮我看看呀
  
3楼:懒虫 2005年1月7日14:52
 刚才我用查询的方法等待下降沿,重新运行正常了。
刚才我用查询的方法等待下降沿,重新运行正常了。再看看问题出在哪里

>>>>>>对该主题发表你的看法

本主题贴数3,分页: [第1页]


[上一篇主题]:Keil(v7.0)编辑器中怎么快速跳到变量/函数定义处?[求助]

[下一篇主题]:[求助]用keil c51编程怎么设置程序段起始地址到0030H?