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

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

   cuittao 
cuittao发表的帖子 

 有空的,没上班的,有兴趣的兄弟过来帮帮忙!!
说明:本程序通过定时器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




发表时间:2004年7月19日19:10:26

  
回复该帖

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

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

  58536.[详细]能不能解释你要用P0的理由?...节约P1做种吗?
摘要:能不能解释你要用P0的理由?...  节约P1做种吗?......(45字)
- [guest][701次] 2004年7月20日

  58694.[详细]兄弟,P1口我有其它用呀!
摘要:......(无内容)
- [cuittao][829次] 2004年7月21日

  58760.[详细]最后的原因不是很清楚,但可能是这样
摘要:因为我用了INT1外部中断和T0定时中断,因系统默认T0中断的 优先级别为高,因此当我有键盘中断(即外部中断)时,系统 在我键盘中断还没完成时即已转入定时中断,造成错乱(见加星号处)。 另,程序中的一些调用语句......(841字)
- [cuittao][942次] 2004年7月22日

[上一篇帖子]:请教各位大侠小弟初到贵宝地,有几个很弱的问题请教大家: 一:在protal自制的元件中,怎么
[下一篇帖子]:[原创]有没有人用SM2965的单片机的啊台湾的,51