DS1302+AT89S51构成的万年历(源程序四)
;*********************************************************
; 减一以后个位是F的数应该变成9的子程序
;入口信息:
;出口信息:
;影响资源:
;占用资源:
;*********************************************************
NUMBER_F_9: DEC R3;
MOV A,R3;
CJNE A,#00H,LOOP1_1;
SJMP LOOP1;
LOOP1_1: CLR AC;
CLR C;
SUBB A,#0FH;
ANL A,#00001111B;
JNZ LOOP1;
MOV A,R3;
CLR C;
CLR AC;
SUBB A,#6;
MOV R3,A;
LOOP1: RET;
;******************************************************
; * * * 温度检测子程序 * * *
;入口信息:
;出口信息:
;影响资源:
;占用资源:
;入口条件:程序调用TEMP_UTER
;出口信息:温度值存于STEMP单元中
;影响资源:A PSW R1 DPTR C P1.4 P1.5
;*****************************************************
TEMP_UTER: MOV DPTR,#TAB_TEMP;
MOV R1,#00H
CLR EA;
CLR ET1;
BOOK3: MOV TMOD,#11H;
MOV TH1,#0FFH
MOV TL1,#0F0H ;#0F0
SETB TR1
SETB P1.4
BOOK2: JB P1.5,BOOK1
JNB TF1,BOOK2
CLR TF1
INC R1 ;加初始值
SJMP BOOK3
BOOK1: MOV A,R1
ADD A,#0DH;
CLR TR1
CLR P1.4
PUSH ACC;
SUBB A,#32H ;超过50度按50度处理
POP ACC;
JC NEST;
MOV TEMP_SG,#32H;
SJMP NEST2;
NEST: MOVC A,@A+DPTR;
MOV TEMP_SG,A;
NEST2: RET;
;-9 -8 -7 -6 -5 -4 -3 -2 -1
TAB_TEMP: DB 0B9H,0B8H,0B7H,0B6H,0B5H,0B4H,0B3H,0B2H,0B1H
DB 00H,01H,02H,03H,04H,05H,06H,07H,08H,09H,10H
DB 11H,12H,13H,14H,15H,16H,17H,18H,19H,20H,21H
DB 22H,23H,24H,25H,26H,27H,28H,29H,30H,31H,32H
DB 33H,34H,35H,36H,37H,38H,39H,40H,41H,41H,43H
DB 44H,45H,46H,47H,48H,49H,50H
;*********************************************************
;以下子程序用于从当前公历日期,推算星期, 子程序
;入口信息:
;出口信息:
;影响资源:
;占用资源:
;入口:YEAR_SG,MONTH_SG ,DATE_SG ,定义公历年月日,BCD 码,其中月的
;BIT7 表示世纪,0 表示20 世纪,1 表示19 世纪,与PCF8563 一致
;出口WEEK, 0-6 表示星期日-星期六,与PCF8563 一致,程序不改变入口数据
;使用资源:ACC,B,PSW,TEMP_BYTE1,TEMP_BYTE2,TEMP_BYTE3
;***********************************************************
GET_WEEK: MOV A,YEAR_SG
MOV B,#16
DIV AB
MOV TEMP_BYTE1,B
MOV B,#10
MUL AB
ADD A,TEMP_BYTE1
MOV TEMP_BYTE1,A ;TEMP_BYTE1=年
MOV A,MONTH_SG
JNB ACC.4,GETW04
ADD A,#10
CLR ACC.4
GETW04: MOV TEMP_BYTE2,A ;TEMP_BYTE2=月
MOV A,DATE_SG













