📄 1302-12232f.asm
字号:
;****************************************************************;
; 时钟\温度计程序( 用1302\18B20\12232F显示) ;
; ;
; AT89C52/12M晶振/编写者LRM/2005.07.10 ;
; ;
;****************************************************************;
;
; 从1302中读出的数据放在 52H(小时)51H(分钟)50H(秒)
; 时间显示缓冲单元:70H-79H: 72H-73H(45H-44H)小时,75H-76H(43H-42H)分钟,78H-79H(41H-40H)秒
; 温度显示缓冲单元:60H-67H: :\空\百\十\个\小数点\小数位\空\℃
; 定时器T1为时间调整时候闪烁用。
; 显示式样第一行为: 时间: 15:38:12
; 显示式样第二行为: 温度: 100.5 ℃
;*****************定义*********************;
PLAYFLG EQU P3.4 ; 主程序运行指示灯用
SCLK EQU P1.0 ; 1302时钟口,1302第7脚
IO EQU P1.1 ; 数据口,1302第6脚
RST EQU P1.2 ; 使能口,1302第5脚
SPEAK BIT P0.2 ;
KEY2 BIT P3.2
KEYSW0 EQU P2.6 ; 调时按键
KEYSW1 EQU P2.7 ; 加1按键
hour DATA 52H ; 1302读出时
mintue DATA 51H ; 1302读出分
second DATA 50H ; 1302读出秒
DS1302_ADDR DATA 3EH ; 1302需操作的地址数据存放
DS1302_DATA DATA 3DH ; 1302读出或需写入的数据存放
INTCON DATA 3CH ; 闪烁中断计时用
CON_DATA DATA 06H ; 闪烁时间=65*6=0.39秒
CON1S DATA 3BH ; 1秒计时用,温度1-2秒测量一次
CON1S_DATA DATA 0FH ; 测温间隔定时值65*15ms
FLG1S EQU 07H ; 1秒到标志
;************LCD定义***********************;
LAMPBLAK EQU P1.4 ;背光灯控制,=0时开,=1时关.
CS EQU P1.5 ;液晶使能,=1操作,=0禁止.
SID EQU P1.6 ;液晶串行数据输入口
CLK EQU P1.7 ;液晶串行操作时钟口
;温度部分定义
TEMPHEAD EQU 30H ;
TEMPL DATA 26H
TEMPH DATA 27H
TEMPHC DATA 28H
TEMPLC DATA 29H
TEMPDIN BIT P1.3
;
VSDA BIT P3.6 ; EEPROM数据传送口,24C16的5脚
VSCL BIT P3.5 ; EEPROM时钟传送口 ,24C16的6脚
BDATA DATA 2AH ;百十个小数位比较用
SDATA DATA 2BH
GDATA DATA 2CH
XSDATA DATA 2DH
;
;*********************程序入口*********************;
;
ORG 0000H
LJMP START
ORG 0003H
RETI
ORG 000BH
LJMP INTT0
ORG 0013H
RETI
ORG 001BH
LJMP INTT1
ORG 0023H
RETI
ORG 002BH
RETI
;
;*****************;主程序;*********************;
;
START:
CLR CS ;液晶操作禁止
mov SP, #80H ;堆栈在80H上
MOV 70H,#0AH ;放北京时间后的“:”代码字
MOV 71H,#0FH ;空
MOV 74H,#0AH ; ": "
MOV 77H,#0AH ; ": "
LCALL READTEMP ;上电时先温度转换一次
MOV TMOD,#11H ;计数器1,方式1
MOV TL1,#00H
MOV TH1,#00H
MOV TL0,#00H ;1秒定时用
MOV TH0,#00H
MOV INTCON,#CON_DATA
CLR 00H ;清闪烁标志
CLR 01H ;清闪烁标志
CLR A ;
MOV R0, A ;从24C16中 0000H开始读出4个字节放在40H始单元
MOV R1, #BDATA ;
MOV R7, #04H ;
LCALL C16SERD ;
SETB EA
MOV DS1302_ADDR,#8EH
MOV DS1302_DATA,#00H ;允许写1302
LCALL WRITE
MOV DS1302_ADDR,#80H
MOV DS1302_DATA,#00H ;1302晶振开始振荡
LCALL WRITE
MOV DS1302_ADDR,#90H
MOV DS1302_DATA,#0A6H;1302充电,充电电流1.1MA
LCALL WRITE
MOV DS1302_ADDR,#8EH
MOV DS1302_DATA,#80H ;禁止写入1302
LCALL WRITE
;
LCALL SETUP ;LCD初始化
LCALL LOGON ;开机显示画面
LCALL TIME ;上行显示"时间: 00:00:00"
LCALL TEMPP ;下行显示“温度:
SETB ET0
SETB TR0
CLR FLG1S
MOV CON1S,#CON1S_DATA
AJMP MAIN11
;以下主程序
MAIN1: MOV DS1302_ADDR,#85H ;读出小时
LCALL READ
MOV hour,DS1302_DATA
MOV DS1302_ADDR,#83H ;读出分钟
LCALL READ
MOV mintue,DS1302_DATA
MOV DS1302_ADDR,#81H ;读出秒
LCALL READ
MOV second,DS1302_DATA
;
MOV R0,hour ;小时分离,送显示缓存
LCALL DIVIDE
MOV 73H,R1 ;时个位
MOV 44H,R1
MOV 72H,R2 ;时十位
MOV 45H,R2
MOV R0,mintue ;分钟分离,送显示缓存
LCALL DIVIDE
MOV 76H,R1 ;时个位
MOV 42H,R1
MOV 75H,R2 ;时十位
MOV 43H,R2
MOV R0,second ;秒分离,送显示缓存
LCALL DIVIDE
MOV 79H,R1 ;秒个位
MOV 40H,R1
MOV 78H,R2 ;秒十位
MOV 41H,R2
LCALL TIMEUP ;时间显示涮新一次
JNB KEYSW0,SETGG ;调整时间控制键
JNB KEY2,BAOJSET ;设置温度报警
JBC FLG1S,MAIN11
AJMP MAIN1
SETGG: LJMP SETG
MAIN11:
LCALL READTEMP1 ;读出温度值子程序
LCALL CONVTEMP ;温度BCD 码计算处理子程序
LCALL DISPTEMP ;温度值显示涮新子程序
LCALL BAOJ ; 报警处理
LCALL READTEMP ;再发一次转换温度命令
SETB TR0
SETB ET0
CPL PLAYFLG ;程序运行指示灯
LJMP MAIN1
;
BAOJSET: LCALL DELAY1
JNB KEY2,BAOJSET
CLR ET0
CLR EA
CLR TR0
MOV A,#90H ;第二行左第一个字开始
LCALL WRITE_COM
MOV DPTR,#CHINESE4 ;16*16点阵“报警-----”
LCALL WRITE_HZ
MOV 66H,XSDATA
MOV 64H,GDATA
MOV 63H,SDATA
MOV 62H,BDATA
MOV 60H,#0AH ; :
MOV 61H,#0FH ; 空
MOV 65H,#11H ; 小数点.
MOV 67H,#0FH ; 空
LCALL TEMPUP ;显示报警温度
MOV R0,#62H
SET10:
JNB KEY2,SET2
JNB KEYSW0,SAFEADD1
JNB KEYSW1,SAFESUBB1
LCALL TEMPUP ;显示报警温度
LJMP SET10
SET2: LCALL DELAY1
JNB KEY2,SET2
INC R0
MOV A,R0
CLR C
CJNE A,#65H,SET101
SET101: JC SET10
AJMP SETOUT
;
SAFEADD1: LCALL DELAY1
JNB KEYSW0,SAFEADD1
MOV A,@R0
LCALL ADD11
MOV @R0,A
LJMP SET10
SAFESUBB1: LCALL DELAY1
JNB KEYSW1,SAFESUBB1
MOV A,@R0
LCALL SUBB11
MOV @R0,A
LJMP SET10
;
SETOUT: MOV BDATA,62H
MOV SDATA,63H
MOV GDATA,64H
MOV XSDATA,66H
CLR A ; 把4 字节写入24C16的0000H开始地址中
MOV R0, A ;
MOV R1, #BDATA ;
MOV R7, #4 ;R7中的最大数据在1-16
LCALL C16PAWR ;
LCALL TEMPP
SETB ET0
SETB EA
SETB TR0
MAIN111: LJMP MAIN1
;
ADD11:
ADD A,#01H
CJNE A,#0AH,OLOOP
OLOOP: JC OUTT
MOV A,#00H
OUTT: RET
;
SUBB11:
JZ PPP1
DEC A
OUTP: RET
PPP1: MOV A,#09H
AJMP OUTP
;******************公历设置程序*********************;
;
SETG : LCALL DELAY1
JB KEYSW0,MAIN111
SETB TR1
SETB ET1
CLR TR0
CLR ET0
MOV 78H,#00H ;调时时秒位为0
MOV 79H,#00H ;调时时秒位为0
MOV 40H,#00H ;调时时秒位为0
MOV 41H,#00H ;调时时秒位为0
MOV DS1302_ADDR,#8EH
MOV DS1302_DATA,#00H ;允许写1302
LCALL WRITE
MOV DS1302_ADDR,#80H
MOV DS1302_DATA,#80H ;1302停止振荡
LCALL WRITE
GWAIT8: LCALL DELAY1
JNB KEYSW0,GWAIT8
;
SETG9: JNB KEYSW0,SETG10
JNB KEYSW1,GADDHOUR
AJMP SETG9
GADDHOUR: MOV R7,52H ;小时加一
LCALL ADD1
MOV 52H,A
CJNE A,#24H,GADDHOUR11
GADDHOUR11: JC GADDHOUR1
MOV 52H,#00H
GADDHOUR1: MOV DS1302_ADDR,#84H ;小时值送人1302
MOV DS1302_DATA,52H
LCALL WRITE
MOV R0,52H
LCALL DIVIDE ;小时值分离送显示缓存
MOV 73H,R1
MOV 44H,R1
MOV 72H,R2
MOV 45H,R2
WAITT5:
JNB KEYSW1,WAITT5
AJMP SETG9
SETG10: SETB 01H ;调分时候闪标志
GWAIT10: LCALL DELAY1
JNB KEYSW0,GWAIT10
SETG11:
JNB KEYSW0,SETGOUT
JNB KEYSW1,GADDMINTUE
AJMP SETG11
GADDMINTUE: MOV R7,51H ;分钟加一
LCALL ADD1
MOV 51H,A
CJNE A,#60H,GADDMINTUE11
GADDMINTUE11: JC GADDMINTUE1
MOV 51H,#00H
GADDMINTUE1: MOV DS1302_ADDR,#82H ;分钟值送人1302
MOV DS1302_DATA,51H
LCALL WRITE
MOV R0,51H
LCALL DIVIDE ;分钟值分离送显示缓存
MOV 76H,R1
MOV 42H,R1
MOV 75H,R2
MOV 43H,R2
WAITT6:
JNB KEYSW1,WAITT6
AJMP SETG11
SETGOUT: LCALL DELAY1
JNB KEYSW0,SETGOUT
MOV DS1302_ADDR,#80H
MOV DS1302_DATA,#00H ;1302晶振开始振荡
LCALL WRITE
MOV DS1302_ADDR,#8EH
MOV DS1302_DATA,#80H ;禁止写入1302
LCALL WRITE
CLR 00H
CLR 01H
CLR ET1 ;关闪中断
CLR TR1
SETB TR0
SETB ET0
LJMP MAIN1
;以下中断程序用于1秒定时用
INTT0:
DJNZ CON1S,INTOUT
CLR TR0
CLR ET0
MOV CON1S,#CON1S_DATA
SETB FLG1S
INTOUT: RETI
;
BAOJ: SETB SPEAK
MOV A,62H
CJNE A,#0FH,BB3
MOV A,#00H
CLR C
BB3: CJNE A,BDATA,BAO1
MOV A,63H
CJNE A,#0FH,BB2
MOV A,#00H
CLR C
BB2: CJNE A,SDATA,BAO1
MOV A,64H
CLR C
CJNE A,GDATA,BAO1
MOV A,66H
CLR C
CJNE A,XSDATA,BAO1
BAOJING: CLR SPEAK
BBAO: RET
;
BAO1: JC BBAO
LJMP BAOJING
;
;****************闪动调时程序*********************;
;
INTT1: PUSH ACC
PUSH PSW
DJNZ INTCON,GFLASHOUT
MOV INTCON,#CON_DATA
GFLASH: CPL 00H
JB 00H,GFLASH5
MOV 72H,45H ;全显示
MOV 73H,44H
MOV 75H,43H
MOV 76H,42H
MOV 78H,41H
MOV 79H,40H
GFLASHOUT: LCALL TIMEUP
POP PSW
POP ACC
RETI
;
GFLASH5: JB 01H,GFLASH6 ;调小时闪
MOV 72H,#0FH
MOV 73H,#0FH
AJMP GFLASHOUT
GFLASH6: MOV 75H,#0FH ;调分钟闪
MOV 76H,#0FH
AJMP GFLASHOUT
;
;*******************加一程序***************;
;
ADD1: MOV A,R7
ADD A,#01H
DA A
RET
;
;*****************分离程序**********************;
;
DIVIDE: MOV A,R0
ANL A,#0FH
MOV R1,A
MOV A,R0
SWAP A
ANL A,#0FH
MOV R2,A
RET
;
;****************写1302程序****************;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -