这个程序的目的是为了练习用定时器产生实时时钟信号,此程序是自动打铃器程序的一部分,个别地方有改动,主要是不让一些其他功能影响定时器的思路。仿真文件名是:T0实时钟.ASM。可以使用伟福纯软件仿真来观察程序的运行和所产生的时间信息。利用伟福软件打开这个程序,编译通过后,复位,全速运行,一小会之后,按暂停。软件界面下方有运行时间,然后比较在DATA窗口中地址为08H,09H,0AH,0BH等单元的数据所代表的时间,应该是相同的。注意,DATA窗口中的数据是16进制的。还要注意一点,把仿真器设置的晶振频率设置为6MHZ。程序中有几条指令前面打了分号,是不用的指令,保留在此的目的是与自动打铃器建立联系(见第11章)。 ;f=6MHz ;T0方式1,定时,0.1秒
;T0中断允许,高优先
;主程序使用工作寄存器第0组,T0中断使用第1头部跟踪组
;------------定时器T0时间常数------------------------------
TH0H EQU 26H ;高字节
TL0L EQU 27H ;低字节
;-----------1字节 直接地址 变量----------------------------
XX EQU 6DH ;临时存储一字节数据
YY EQU 6EH
;-----------程序开始--------------------------------------
org 0000h
ljmp main ;转主程序
org 000bh
ljmp T0FW ;转t0中断服务程序
org 0030h
main: mov sp,#2fh ;堆栈从30H开始,初始化开始
clr rs1 ;主程序使用工作寄存器第0组
clr rs0
mov r7,#16 ;以下16个单元请0
mov th0h,#03ch ;t0初值高字节,定时0.1秒,初始值为
;15536=3cb0h
mov tl0l,#0b0h ;t0初值低字节,定时0.1秒,初始值为
;15536=3cb0h
mov tcon,#01h ;01H=00000001B,INT0下降沿触发
mov ie,#9fh ;9FH=10011111B,全允许
mov ip,#02h ;02h=00000010b,t0高优先
mov tmod,#01h ;t0方式1
mov th0,th0h ;定时0.1秒,初始值为15536=3cb0h
mov tl0,tl0l ;定时0.1秒,初始值为15536=3cb0h
setb tr0 ;启动t0,初始化完
loop: nop ;主循环
nop ;暂时没有任务
nop ;等待中断
sjmp loop ;死循环,永不结束
;-----------------------
org 0100h指路器
;--------定时器0中断服务程序-------------------------------
;t0方式1,初值15536,100毫秒中断一次,高优先级
;产生时间:100毫秒在08H,即0.1秒=08H
;秒=09H;分=0AH;时=0BH;日=0CH;月=0DH;星期=0EH;年(末2位)=0fh
T0FW: PUSH ACC ;保护现场
PUSH B ;保护现场
PUSH PSW
SETB 脉动测速中心RS0 ;选择工作寄存器第1组
CLR RS1
MOV TH0,TH0H ;定时器重新赋值,高字节
MOV TL0,TL0L ;低字节
INC R0 ;100毫秒数 (在08H中)
CJNE R0,#10,$+3 ;比较100毫秒数够10?
JC T0FWZ ;不够10就是不够1秒,转中断结束
INC R1 ;100毫秒数够10,1秒数加1 (在09H中)
SETB kvm管理系统DSP ;可以调用一次显示程序
INC SEC1 ;临时计数器秒数加1
MOV R0,#0 ;100毫秒数从0开始
CJNE R1,#60,$+3 光标跟随 ;秒数加1后,要判断是否够1分
JC T0FWZ ;不够,结束中断
INC R2 ;够1分,分数加1 (在0AH中)
SETB COMPARE ;允许比较打铃时间
MOV R1,#0 ;够1分,秒数要从0开始
CJNE R2,#60,$+3
JC T0FWZ
INC R3 ;60分=1小时 数葵花脱粒机 (在0BH中)
MOV R2,#0
CJNE R3,#24,$+3
JC T0FWZ
MOV R3,#0
INC R4 ;日数 (在0CH中)
MOV A,R5 ;月份
DEC A ;月份表中一月在第0位置
MOV DPTR,#MONTH_TAB ;每月日数表首
MOVC A,@A+DPTR ;查表得到日数
MOV XX,A ;日期送XX,以便比较
INC XX ;超限数
MOV A,R4 ;日数
CJNE A,XX,$+3
JC T0FWA ;比较日数和本月应该有的日数
MOV R4,#1 ;超过本月最大日期就回到1号
INC R5 ;月数 (在0DH中)
CJNE R5,#13,$+3
JC T0FWA
MOV R5,#1 ;月=1
INC R7 ;年加1(最后2位数。年的前2位数默认是20)
T0FWA: INC R6 ;星期(在0EH中)
CJNE R6,#08H,$+3
JC T0FWZ
MOV R6,#1
T0FWZ: POP PSW ;恢复现场
POP B
POP ACC
RETI ;定时器0中断服务程序到此结束
;每月日数表
MONTH_TAB: DB 31,28,31,30,31,30,31,31,30,31,30,31 ;1月,2月
;---------------------------------------------------------------------
END