导航: 老古网老古论坛XMOS公共讨论区XMOS开源项目区单片机程序设计嵌入式系统广告区域
→有空的,没上班的,有兴趣的兄弟过来帮帮忙!![cuittao]

 *第23879篇: 有空的,没上班的,有兴趣的兄弟过来帮帮忙!!

  
楼 主:cuittao 2004年7月19日19:10
 有空的,没上班的,有兴趣的兄弟过来帮帮忙!!
说明:本程序通过定时器T0产生一个方波脉冲,同时用于一个小时定时
其它的键盘中断是实际中要做的相应操作。其中NOP语句为省略的操作性语句
与定时没有任何关系。晶振 f = 6MHz

    问题如下:
         定时器为什么不能定时(实际板子工作所得)??!!!(程序在Keil C51 V6.12下仿真能正常计数)
       我现在的想法是:编程器出错!(可能,但可能性很低吧) 
       
    部分程序如下:


;定义 2AH.0 为开始计时标志,当 2AH.0= 1 时,计时开始
;
;定义R4,R5为产生一秒的计数器
;取基准时间为 1 ms


 
 
SECOND     EQU      21H  ;  秒计数器 
MINUTE     EQU      22H  ;  分种计数器 


        ORG     0000H
        AJMP    MAIN
        ORG     000BH                   ;T0中断入口
        AJMP    INT_T0
        ORG     0013H                   ;INT1键盘中断入口
        AJMP    KEY_INT
       
 
 ORG  0100H
MAIN:
 CALL  START 
CHECK:
 CALL  CONCHECK
 JB    2AH.0,TIMESUM  ;查询开始工作标志位 
 JMP   CHECK
 
TIMESUM:  
 MOV     A,SECOND                     ;检查1S单位
 CLR     C   ;电路十秒延时
 SUBB    A,#10   
 JC      TIMESUM
 MOV     A,SECOND
 CJNE    A,#10,TIMECON 
 SETB    P0.4   ; 关第一路 Power On 1
  NOP
TIMECON:
 MOV     A,SECOND
 CJNE    A,#3CH,MIDDLE           ;不足60S,从头检查
 MOV     SECOND,#00H             ;够60S,秒单元清零
 INC     MINUTE                       ;分单元加1
 
MIDDLE:
 MOV     A,MINUTE                ;检查分单元
 CJNE    A,#10D,NEXT_1        ;检查分单元是否够10分
  SETB    P3.6                       ;打开74LS373
 MOV     P1,#0FCH                ;打开10分灯
 CLR     P3.6                        ;关闭74LS373
 
 SETB    2DH.7
 MOV     P1,2DH                  ;恢复错误状态指示
  

NEXT_1:                
 CJNE    A,#20D,NEXT_2 
 SETB    P3.6
 MOV     P1,#0F8H
 CLR     P3.6
 SETB    2DH.7
 MOV     P1,2DH                  ;恢复错误状态指示 
NEXT_2:       
 CJNE    A,#30D,NEXT_3 
 SETB    P3.6
 MOV     P1,#0F0H
 CLR     P3.6
 SETB    2DH.7
 MOV     P1,2DH                  ;恢复错误状态指示
NEXT_3:        
 CJNE    A,#40D,NEXT_4 
 SETB    P3.6
 MOV     P1,#0E0H
 CLR     P3.6
 SETB    2DH.7
 MOV     P1,2DH                  ;恢复错误状态指示
NEXT_4:        
 CJNE    A,#50D,NEXT_5 
 SETB    P3.6
 MOV     P1,#0C0H
 CLR     P3.6
 SETB    2DH.7
 MOV     P1,2DH                  ;恢复错误状态指示
NEXT_5:        
 CJNE    A,#60D,ERRORCHECK 
 SETB    P0.0   ;关ACPOWER总开关
 CLR P1.7   ;关电路电源
 SETB    P0.7   ;停止产生方波
 SETB    P0.6   ;开始指示灯停
 CLR     P3.7   ;停止指示灯亮
 CLR     TR0    ;停止计时器 T0
 CLR     2AH.0

 SETB    P3.7   ;打开573
 MOV     P1,#080H                 ;送时间指示
 CLR     P3.7   ;关 573
 MOV     P1,2DH                                         ;恢复错误状态指示
 JMP     $                ;程序指针停止

;出错检查

ERRORCHECK:
                NOP
                NOP
  JMP TIMESUM 
  
;系统初始化 
 
START:     
 MOV     SP,#60H                 ;置堆栈初始位置   
                MOV     IE,#8EH                 ;开放T0/T1/INT1 
 SETB    EA   ; 总中断允许
 SETB    ET0          ; 定时器 T0 中断允许
 MOV     TMOD,#01H               ;计时器T0工作在方式 1 
 
 MOV     TH0,#0FEH               ; 65536 - 500 = 65036 = 0FE0CH
                MOV     TL0,#0CH  ;
 MOV     R4,#0E0H  ;  一秒计数器 
 MOV     R5,#04   ;   0E0H = 250   250 * 4 * 1 ms = 1 S
 
                MOV    2AH,#0                

                MOV     SECOND,#00H             ;秒计数单位初始化
                MOV     MINUTE,#00H             ;分计数单位初始化  
  RET


 

CONCHECK:   
         NOP
                NOP
 RET

;键盘中断程序 

KEY_INT:            
 PUSH    PSW
 PUSH    ACC  
 CALL    DELAY   ;延时
                NOP
                NOP
  SETB    TR0   ; 开启定时器 T0
 
  RETI


; 计时器 T0 中断程序


INT_T0:           
 PUSH    PSW
 PUSH    ACC
 MOV     TH0,#0FEH  ; 计数500次
 MOV     TL0,#0CH  ; 65536 - 500 = 65036 = 0FE0CH 
 CPL     P0.7    ; 产生方波脉冲
 DEC     R4
 CJNE    R4,#0,T0_BACK
 DEC     R5
 CJNE    R5,#0,SENDDATA
 INC      SECOND
 MOV     R4,#0E0H  
 MOV     R5,#4 
 JMP     T0_BACK
SENDDATA:
 MOV     R4,#0E0H 
T0_BACK:       
 POP     ACC
 POP     PSW
 RETI

 

;软件延时程序

DELAY:        
 MOV     R6,#05H
DLY0:          
 MOV     R7,#07FH
DLY1:   
 NOP 
                NOP
 DJNZ    R7,DLY1
 DJNZ    R6,DLY0
 RET

    END


  
2楼:guest 2004年7月20日11:44
 能不能解释你要用P0的理由?...

能不能解释你要用P0的理由?...

节约P1做种吗?

  
3楼:cuittao 2004年7月21日20:01
 兄弟,P1口我有其它用呀!
  
4楼:cuittao 2004年7月22日20:05
 最后的原因不是很清楚,但可能是这样
因为我用了INT1外部中断和T0定时中断,因系统默认T0中断的
优先级别为高,因此当我有键盘中断(即外部中断)时,系统
在我键盘中断还没完成时即已转入定时中断,造成错乱(见加星号处)。
另,程序中的一些调用语句我也改了(见注释句后句)
,虽没什么必要,但总可以顺利运行呀!!

 ORG     0000H
;  AJMP    MAIN
LJMP   MAIN
ORG     000BH                   ;T0中断入口
;        AJMP    INT_T0
LJMP    INT_T0
ORG     0013H                   ;INT1键盘中断入口
;        AJMP    KEY_INT
LJMP    KEY_INT
       
 
 ORG  0100H
MAIN:
 ;CALL  START 
LCALL  START

MOV     IE,#8EH                 ;开放T0/T1/INT1 
 SETB    EA   ; 总中断允许
 SETB    ET0          ; 定时器 T0 中断允许
 MOV     TMOD,#01H               ;计时器T0工作在方式 1 
;************************
SETB    PX1   ; 设外部中断INT1中断优先级别为高
;************************


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

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


[上一篇主题]:请教各位大侠

[下一篇主题]:[原创]有没有人用SM2965的单片机的啊