问题如下:
定时器为什么不能定时(实际板子工作所得)??!!!(程序在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
节约P1做种吗?
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中断优先级别为高
;************************