导航: 老古网老古论坛XMOS公共讨论区XMOS开源项目区单片机程序设计嵌入式系统广告区域
→[求助]方波计数及显示程序[feiji11]

 *第4030篇: [求助]方波计数及显示程序

  
楼 主:feiji11 2008年5月9日21:30
 [求助]方波计数及显示程序
我单独用显示程序送个数据可以在我的电路板上正常显示,加上计数程序后PROTEUS中仿真也可以正常显示,可是在我的电路板上就只能显示三个8了。P0口电压都是1.8~2.1V.
老古先生及坛内的高手们,帮我看一下这个程序有没有什么问题。看看是不是寄存器冲突了或其他什么问题。

;TO口输入1HZ左右的方波信号,用定时器获得方波的一个周期,再计算1分钟的周期数
;我的锁存器373使能端全部接地使能,P0口送出数据去显示,P2口锁存信号
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;计数程序
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
       ORG  00H
MAIN:
       MOV  TMOD,#26H    ;Timer1工作在定时模式2下,Timer0工作在计数模式2下
       MOV  TH1,#56    ;定时器Timer1初始值设为56
       MOV  TL1,#56
       MOV  TH0,#0FFH    ;计数器Timer0初始值设为0FFH,计数一次就溢出
       MOV  TL0,#0FFH
RESTART:
       CLR  A            ;清零A
       MOV  R0,A           ;清零R0
       SETB TR0                   ;启动计数器Timer0
CHECK0:
       JNB  TF0,CHECK0      ;第一个周期波放过,以便得到完整的周期波
       CLR  TF0
       SETB TR1 ;启动定时器Timer1
CHECK1:    
       JB   TF0,STOP_T1   ;一次计数完成则停止定时器Timer1
       JNB  TF1,CHECK1    ;定时器Timer1没溢出则继续检测
       CLR  TF1    ;定时器Timer1溢出则清零TF1,重新计数
       INC  A     ;完成一次200uS的定时,A加1       
       CJNE A,#250,CHECK1   ;完成200×250=0.05s定时,R0加1
       CLR  A
       INC  R0    ;R0存储0.05S的个数
       JMP  CHECK1
STOP_T1:         
       CLR  TF0
       CLR  TR1     ;关闭定时器Timer1
CALCULATE:         ;计算一分钟的方波数
       MOV  B,R0         ;公式:60/(0.05*R0)=1200/R0=6*(200/R0)=6*商+6*余数/R0
       MOV  A,#200
       DIV  AB
       MOV  R1,B
       MOV  B,#6
       MUL  AB
       MOV  R2,A
       MOV  B,R1
       MOV  A,#6
       MUL  AB
       MOV  B,R0
       DIV  AB
       ADD  A,R2
       CALL  DISPLAY
       JMP   RESTART 

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;显示程序
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
DISPLAY:
       DGE  EQU 50H    ;个位数存放处
       SHI  EQU 51H       ;十位数存放处
       BAI  EQU 52H       ;百位数存放处
START:
       MOV  B,#100
       DIV  AB
       MOV  BAI,A
       MOV  A,B
       MOV  B,#10    ;把数字10放入b寄存器
       DIV  AB        ;a除以b,a然后存商,b存余数
       MOV  SHI,A     ;把商a放回个位数存放处
       MOV  DGE,B     ;把余数b放回个位数存放处
DLOOP:
       MOV  DPTR,#TABLE   ;指定查表启始地址
       MOV  A,BAI        ;取百位数
       MOVC A,@A+DPTR  ;查百位数的7段代码
       SETB P2.2
       MOV  P0,A        ;送出百位数的7段代码去显示     
       CALL DELAY
       CLR  P2.2    ;来个下降沿,锁存百位数字
       MOV  DPTR,#TABLE   ;指定查表启始地址
       MOV  A,SHI        ;取十位数
       MOVC A,@A+DPTR  ;查十位数的7段代码
       SETB P2.1
       MOV  P0,A        ;送出十位数的7段代码去显示      
       CALL DELAY
       CLR  P2.1     ;来个下降沿,锁存十位数字
       MOV  DPTR,#TABLE   ;指定查表启始地址
       MOV  A,DGE        ;取个位数
       MOVC A,@A+DPTR   ;查个位数的7段代码
      SETB P2.0
       MOV  P0,A         ;送出个位数的7段代码去显示     
       CALL DELAY
       CLR  P2.0    ;来个下降沿,锁存个位数字

DELAY:                   ;延时子程序,延时5ms
       MOV  R4,#20
D1:  
       MOV  R3,#250
       DJNZ R3,$
       DJNZ R4,D1
       RET

TABLE:                                          ;段数码管各划的数字排列表
       DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H ;显示内容的对应代码
          ;0    1     2   3    4   5   6   7    8   9  ;显示内容

       RET
       END


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

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


[上一篇主题]:中兴通讯北京研究所大量招聘嵌入式软件开发人员!待遇优厚!

[下一篇主题]:[求助]SOPC Builder 打开出错