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

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

   懒虫 
懒虫发表的帖子 

 大家帮忙看看,关于用定时器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

  
回复该帖

本主题共有 3 帖,分页:>>>>>该主题的所有内容[3]条

 *树形目录 只列出部分跟帖的标题以及简单的摘要信息 该主题的部分跟帖如下:

  70756.[详细]我实在找不到问题,请大家帮我看看呀
摘要:[em12][em12]......(12字)
- [懒虫][1131次] 2005年1月7日

  70770.[详细]刚才我用查询的方法等待下降沿,重新运行正常了。
摘要:刚才我用查询的方法等待下降沿,重新运行正常了。再看看问题出在哪里......(64字)
- [懒虫][1218次] 2005年1月7日

[上一篇帖子]:我实在找不到问题,请大家帮我看看呀[em12][em12]
[下一篇帖子]:谢谢您,可我谢谢您,可我不会C语言,我刚开始接触了一些汇编,可以吗?