📄 自动校时器.asm
字号:
;**********************************************************
; 自动校时器
;**********************************************************
;主要硬件:
; (1) MCU:AT89C2051或AT89C4051
; (2) FM接收器:TDA7088或SC1088
; (3) 数字电位器:X9315
; (4) 运放:MAX4294
; (4) LCD显示器:LCM06XK
;----------------------------------------------------------
;代码:
; 1.6KB
;----------------------------------------------------------
;主要性能:
; (1)自动搜索电台,自动校准时钟
; (2)自动识别报时信号特征,全球通用
; (3)校时误差小于0.5毫秒
; (4)手工调时
; (5)电池低电量提示
; (6)无电台提示
; (7)音频监听接口
; (8)节电控制
;**********************************************************
; JSQ.ASM
; yaner 2003.9.6
;##########################################################
SDA BIT P1.6 ;串行数据
CLK BIT P1.5 ;串行时钟
DLA BIT P1.7 ;数据装入
;------------------------------------
CS BIT P1.2 ;片选
UD BIT P1.3 ;增/减
STEP BIT P1.4 ;步进
;------------------------------------
RST BIT P1.0 ;复位
SCAN BIT P1.1 ;扫描
PWEN BIT P3.0 ;电源
;------------------------------------
XHIN BIT P3.2 ;音频信号输入
;------------------------------------
MENU BIT P3.3 ;菜单键
UP BIT P3.4 ;+键
DOWN BIT P3.5 ;-键
;------------------------------------
LED BIT P3.7 ;LED
;====================================显示
XSF BIT 20H.0 ;显示忙标志
INST DATA 28H ;LCD指令寄存器
;====================================秒计时
JSF BIT 21H.0 ;秒计时到标志
JSDATA DATA 40H ;40H-42H,计时器
JSCACH DATA 43H ;43H-48H,显示缓存
XHYS DATA 29H ;信号丢失延时计数器
XHYSC EQU 100 ;信号丢失延时常数
;====================================手动调时
MS1 BIT 22H.0 ;调整位指示
MS2 BIT 22H.1 ;
MS3 BIT 22H.2 ;
SID BIT 22H.3 ;首次增/减标志
YSD BIT 22H.4 ;按键延时到标志
IDF BIT 22H.5 ;增/减标志(0增1减)
WSF BIT 22H.6 ;位闪标志
SSSDC EQU 02 ;位闪烁速度常数
AJYSC EQU 30 ;按键延时常数
;====================================电台搜索
DTF BIT 23H.0 ;电台标志
XHF BIT 23H.1 ;信号标志
XHDDF BIT 23H.2 ;信号等待时限到标志
SSCGF BIT 23H.3 ;搜索成功标志
JZTYF BIT 23H.4 ;禁止调音标志
WTF BIT 23H.5 ;无台标志
HTF BIT 23H.6 ;换台标志
SSWCF BIT 23H.7 ;搜索满标志
VOL DATA 38H ;音量位置
PDS DATA 39H ;频道位置
XHDD DATA 2AH ;信号等待计数器
XHDDC EQU 05 ;信号等待时限
;====================================自动校时
JCST BIT 25H.0 ;检测启动标志
JSENF BIT 25H.1 ;校时允许标志
LXJSF BIT 25H.2 ;例行校时标志
LXJSSTF BIT 25H.3 ;例行校时启动标志
JSCGF BIT 25H.4 ;校时成功标志
XHJGF BIT 25H.5 ;信号间隔标志
STRF BIT 25H.6 ;校时启动标志
PLSJF BIT 25H.7 ;频率首检标志
MKSJF BIT 26H.0 ;脉宽首检标志
ZDJSF BIT 26H.1 ;正点校时标志
JSSB DATA 2BH ;校时失败计数器
PL_LL DATA 2CH ;频率下限低字节
PL_LH DATA 2DH ;频率下限高字节
PL_HL DATA 2EH ;频率上限低字节
PL_HH DATA 2FH ;频率上限高字节
MK_LL DATA 30H ;脉宽下限低字节
MK_LH DATA 31H ;脉宽下限高字节
MK_HL DATA 32H ;脉宽上限低字节
MK_HH DATA 33H ;脉宽上限高字节
MK_L DATA 34H ;脉宽低字节
MK_H DATA 35H ;脉宽高字节
KXD DATA 36H ;信号可信度计数器
JSSBC EQU 02 ;校时失败常数
PLSX EQU 0014H ;频率上限常数
PLXX EQU 0014H ;频率下限常数
MKSX EQU 0028H ;脉宽上限常数
MKXX EQU 0028H ;脉宽下限常数
KXDC EQU 02 ;信号可信度
PDSMAX EQU 33 ;最大频道数
;====================================通用
DRY DATA 37H ;通用延时计数器
DRYC EQU 04 ;通用延时常数
;####################################
ORG 0000H
JMP MAIN
ORG 0003H
JMP JCQ ;信号检测器
ORG 0013H
JMP SGJS ;手工校时
ORG 001BH
JMP JSQ ;秒计时器
;====================================
ORG 0033H
MAIN: MOV SP,#50H
MOV PSW,#00H
MOV TMOD,#21H ;定时器1方式2,定时器0方式1
MOV IP,#0CH ;计时中断高优先级
MOV TCON,#05H ;下降沿触发中断
;------------------------------------
MOV P1,#0FFH ;复位端口
MOV P3,#0FFH
MOV 20H,#00 ;清标志
MOV 21H,#00
MOV 22H,#00
MOV 23H,#00
MOV 24H,#00
MOV 25H,#00
MOV 26H,#00
MOV 27H,#00
SETB RS0
MOV R2,#00
MOV R3,#00
MOV JSSB,#00
MOV PDS,#00
MOV KXD,#00
MOV XHDD,#XHDDC
MOV XHYS,#XHYSC
MOV PSW,#00
;------------------------------------初始化LCD
CALL LCDRST
CALL LCDRST
CALL YS60M
MOV INST,#20H
CALL OUTI
MOV INST,#18H
CALL OUTI
MOV INST,#01H
CALL OUTI
MOV INST,#03H
CALL OUTI
MOV R0,#JSDATA ;清计时缓存
MOV R1,#JSCACH
MOV R2,#06
L000: CLR A
MOV @R0,A
MOV @R1,A
INC R0
INC R1
DJNZ R2,L000
CALL XS ;显示
;------------------------------------初始化
MOV PSW,#00
CLR TR1
CLR TF1
MOV TH1,#06
MOV TL1,#06
CLR TR0
CLR TF0
MOV TL0,#00
MOV TH0,#00
SETB ET1
SETB EX0
SETB EX1
CLR IE0
CLR IE1
SETB EA
SETB TR1 ;启动计时器
;====================================LCD显示每秒更新
L003: JNB JSF,L001
CLR JSF
CALL XS
;====================================校时控制
L001: JNB JSENF,L002
CLR JSENF
CALL DTSS
JMP L003
;------------------------------------
L002: JNB LXJSF,L004
JB LXJSSTF,L003
SETB LXJSSTF
SETB JSENF
JMP L003
;------------------------------------
L004: JNB LXJSSTF,L003
CLR LXJSSTF
SETB PWEN
JNB JSCGF,L005
MOV JSSB,#00
CLR JSCGF
JMP L003
;------------------------------------
L005: INC JSSB
MOV A,JSSB
CJNE A,#JSSBC,L003
MOV JSSB,#00
SETB HTF
JMP L003
;####################################
;************************************信号检测器
JCQ: PUSH PSW
PUSH ACC
;------------------------------------REG3
SETB RS0
SETB RS1
;====================================
JB SSCGF,JCQ00
JMP JCQ01A ;EXIT
JCQ04: JMP JCQ01
;------------------------------------
JCQ00: CLR TR0
JNB XHJGF,JCQ02
JMP JCQ03
;------------------------------------
JCQ02: JNB STRF,JCQ04
JNB PLSJF,JCQ05
JMP JCQ06
;------------------------------------保存频率上下限值
JCQ05: SETB PLSJF
MOV A,TL0
ADD A,#LOW PLSX
MOV PL_HL,A
MOV A,TH0
ADDC A,#HIGH PLSX
MOV PL_HH,A
MOV A,TL0
CLR C
SUBB A,#LOW PLXX
MOV PL_LL,A
MOV A,TH0
SUBB A,#HIGH PLXX
MOV PL_LH,A
JMP JCQ01
;------------------------------------与频率上下限值比较
JCQ06: MOV A,TH0
CJNE A,PL_LH,JCQ07
JCQ07: JNC JCQ08
JCQ14: JMP JCQ09
JCQ08: CJNE A,PL_LH,JCQ10
MOV A,TL0
CJNE A,PL_LL,JCQ11
JCQ11: JNC JCQ10
JMP JCQ09
JCQ10: MOV A,TH0
CJNE A,PL_HH,JCQ12
JCQ12: JC JCQ13
CJNE A,PL_HH,JCQ14
MOV A,TL0
CJNE A,PL_HL,JCQ15
JCQ15: JC JCQ13
CJNE A,PL_HL,JCQ14
;------------------------------------脉宽计数器增1
JCQ13: INC MK_L
MOV A,MK_L
CJNE A,#00,JCQ16
INC MK_H
JCQ16: JMP JCQ01
;------------------------------------
JCQ09: JNB ZDJSF,JCQ17
JMP JCQ18
;------------------------------------
JCQ17: CLR STRF
JCQ20: CLR MKSJF
CLR PLSJF
CLR ZDJSF
MOV KXD,#00
JCQ22: CLR XHJGF
MOV MK_L,#00
MOV MK_H,#00
JMP JCQ01
;------------------------------------
JCQ03: JB STRF,JCQ19
SETB STRF
JMP JCQ20
;------------------------------------保存首个脉宽值
JCQ19: JB MKSJF,JCQ21
SETB MKSJF
MOV A,MK_L
ADD A,#LOW MKSX
MOV MK_HL,A
MOV A,MK_H
ADDC A,#HIGH MKSX
MOV MK_HH,A
MOV A,MK_L
CLR C
SUBB A,#LOW MKXX
MOV MK_LL,A
MOV A,MK_H
SUBB A,#HIGH MKXX
MOV MK_LH,A
JMP JCQ22
;------------------------------------与脉宽上下限值比较
JCQ21: MOV A,MK_H
CJNE A,MK_LH,JCQ23
JCQ23: JNC JCQ24
JCQ27: JMP JCQ17
JCQ24: CJNE A,MK_LH,JCQ25
MOV A,MK_L
CJNE A,MK_LL,JCQ26
JCQ26: JC JCQ27
JCQ25: MOV A,MK_H
CJNE A,MK_HH,JCQ28
JCQ28: JC JCQ29
CJNE A,MK_HH,JCQ27
MOV A,MK_HL
CJNE A,MK_HL,JCQ30
JCQ30: JC JCQ29
CJNE A,MK_HL,JCQ27
;------------------------------------
JCQ29: JNB ZDJSF,JCQ31
JMP JCQ22
;------------------------------------检查信号可信度
JCQ31: INC KXD
MOV A,KXD
CJNE A,#KXDC,JCQ32
JCQ32: JC JCQ33
SETB ZDJSF
JCQ33: JMP JCQ22
;====================================正点校时
JCQ18: CLR EA
SETB PWEN ;关闭电源
MOV A,JSDATA+1
CJNE A,#30,JCQ40 ;检查分钟数
JCQ40: JC JCQ41
INC JSDATA+2 ;分钟数大于或等于30,时数增1
MOV A,JSDATA+2
CJNE A,#24,JCQ42 ;时数大于或等于24则清0
JCQ42: JC JCQ41
MOV JSDATA+2,#00
JCQ41: MOV JSDATA+1,#00 ;分钟、秒数清0
MOV JSDATA,#00
CALL XS
;------------------------------------初始化
MOV C,JZTYF
MOV 20H,#00
MOV 21H,#00
MOV 22H,#00
MOV 23H,#00
MOV 24H,#00
MOV 25H,#00
MOV 26H,#00
MOV 27H,#00
MOV JZTYF,C
SETB RS0
CLR RS1
MOV R2,#00
MOV R3,#00
MOV JSSB,#00
MOV KXD,#00
SETB LXJSSTF
SETB JSCGF ;校时成功
MOV XHDD,#XHDDC
MOV XHYS,#XHYSC
MOV PSW,#00
CLR TR1
CLR TF1
MOV TH1,#06
MOV TL1,#06
CLR TR0
CLR TF0
MOV TMOD,#21H
CLR IE0
CLR IE1
SETB TR1
JMP JCQ01A
;====================================
JCQ01: MOV TL0,#00
MOV TH0,#00
SETB TR0
CLR IE0
;====================================复位信号延时计数器
JCQ01A: CLR EA
SETB XHF
CLR LED
MOV XHYS,#XHYSC
SETB EA
;====================================
POP ACC
POP PSW
;====================================
RETI
;************************************自动搜索电台
DTSS: PUSH PSW
;------------------------------------REG2
CLR RS0
SETB RS1
;====================================
MOV TMOD,#21H
CLR SSCGF
CLR SSWCF
CLR WTF
;====================================复位FM接收器
CLR PWEN
CALL YS500M
CALL YS500M
CALL YS500M
DTSS03: CALL YS500M
CLR RST
CALL YS500M
SETB RST
CALL YS500M
;====================================找到原电台
MOV R7,PDS
INC R7
JNB HTF,DTSS00
CLR HTF
INC PDS
INC R7
DTSS00: CJNE R7,#PDSMAX,DTSS01
DTSS01: JC DTSS02
MOV PDS,#00
CLR JZTYF
JMP DTSS03
;------------------------------------扫描
DTSS02: CALL YS100M
CLR SCAN
CALL YS500M
CALL YS500M
SETB SCAN
CALL YS100M
DJNZ R7,DTSS02
;====================================搜索电台
DTSS07: CALL DTSB
JB DTF,DTSS04
CLR JZTYF
INC PDS
MOV R7,PDS
INC R7
CJNE R7,#PDSMAX,DTSS05
DTSS05: JC DTSS06
MOV PDS,#00
CLR JZTYF
JB SSWCF,DTSS08
SETB SSWCF
JMP DTSS03
DTSS08: CLR SSWCF
SETB WTF
SETB PWEN
JMP DTSS09
DTSS06: CALL YS100M ;扫描
CLR SCAN
CALL YS500M
CALL YS500M
SETB SCAN
CALL YS100M
JMP DTSS07
;------------------------------------搜索成功
DTSS04: MOV KXD,#00
CLR WTF
SETB JZTYF
CLR STRF
CLR TR0
MOV TMOD,#29H
MOV TL0,#00
MOV TH0,#00
SETB TR0
CLR XHJGF
SETB SSCGF
;====================================
DTSS09: POP PSW
;====================================
RET
;************************************电台识别
DTSB: PUSH PSW
PUSH ACC
;====================================
CLR DTF
JNB JZTYF,DTSB09
JMP DTSB02
;====================================数字电位器复位
DTSB09: CLR UD
SETB STEP
CALL YS54
CALL YS54
CLR CS
CALL YS54
CALL YS54
MOV R6,#32
DTSB00: CLR STEP
CALL YS54
SETB STEP
CALL YS54
DJNZ R6,DTSB00
;------------------------------------
MOV VOL,#00
;====================================数字电位器步进
DTSB11: CALL YS100M
SETB UD
CALL YS54
CLR STEP
CALL YS54
SETB STEP
CALL YS54
;------------------------------------
INC VOL
MOV R6,VOL
CJNE R6,#12,DTSB01
DTSB01: JC DTSB02
JMP DTSB03
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -