51单片机,求用汇编语言编写延时1小时的子程序,要精确到秒级别

如题所述

这个可以做到,如果晶振是12M的话,一下方法可以实现延时1小时,精确度在秒级别。
DELAY1H:
MOV R7,#180 ;1/1000000
DLY1H:
LCALL DELAY_20S ;180*19.960603s +2*180
DJNZ R7,DLY1H ;2*180/1000000
RET 2/1000000
共延时时间:3592.9s误差为7.1秒,如果再精确的话,再加一点延时就可以了。

DELAY_20S: ;Total=19.960603s
MOV R2,# ;1
DLY1:
MOV R3,#200 ;1*200
DLY2:
MOV R4,#248 ;1**200*200
DJNZ R4,$ ;2**248*200*200
DJNZ R3,DLY2 ;2*200*200
DJNZ R2,DLY1 ;2*200
RET ;2
温馨提示:答案为网友推荐,仅供参考
第1个回答  推荐于2018-03-13
延时一小时,这么长,应该要用定时器,不能用循环的方式。
ORG 00H
AJMP MAIN
ORG 0BH
AJMP T0INT0
ORG 30H

MAIN:
MOV SP,#60H
MOV R4,#20
MOV TMOD,#01H
MOV TH0,#3CH ;12M晶振时定时初值取#3CB0H,还可细调如 TL=#0B7H,可以更准
MOV TL0,#0B7H
SETB EA
SETB ET0
SETB TR0
AJMP $

T0INT0:
MOV TH0,#3CH ;定时中断子程序。重装定时常数
MOV TL0,#0B7H
DJNZ R4,RTI ;未1S,跳出中断
MOV R4,#20
INC 26H ;秒+1
MOV A,26H
CJNE A,#60,RTI
MOV 26H,#0
INC 27H ;分+1
MOV A,27H
CJNE A,#60,RTI
MOV 27H,#0
INC 28H ;时+1
MOV A,28H
CJNE A,#24,RTI
MOV 28H,#0
RTI:
RETI

END追问

定时器肯定用的,还有这段代码你用软件仿真过了,正确?如果没问题的话,我还可以多加20分

追答

应该是没错的。1小时太长我也没仿真,我只试过满60秒分钟能+1,试了3分钟正常。

本回答被提问者和网友采纳
第2个回答  2012-01-02
单片机时钟,时分秒。
时,即每隔一小时,加一次一。
利用这种程序即可,不用单独编写子程序。