⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 万年历最终版.asm

📁 用89S52实现的万年历
💻 ASM
📖 第 1 页 / 共 4 页
字号:
			                                        ;*****************************
                                      ;*        万年历程序         *
                                      ;*****************************
                          ;67H(高两位年)66H(低两位年)65H(月)64H(星期)
                          ;63H(日)62H(小时)61H(分)60H(秒)57H(农历月)56H(农历日)
                          ;显示缓冲单元7CH~7BH(4CH~4BH)年低位,7AH~79H(4AH~49H)月,
                          ;78H(48H)星期,77H~76H(47H~46H)日,75H~74H(45H~44H)时,
                          ;73H72H(43H~42H)分,71H~70H(41H~40H)秒,5EH~5DH(55H~54H)农历年
                          ;5CH~5BH(53H~52H)农历月,5AH~59H(51H~50H)农历日
                          ;闰年标志为F0,定时器T1为调整时候闪烁用
                          ;
                          ;
                                         SCLK  EQU  P2.3
                                         IO    EQU  P2.4
                                         RST   EQU  P2.5
                                         YEAR  DATA 66H
                                         MONTH DATA 65H
                                         WEEK  DATA 64H
                                         DAY   DATA 63H
                                         HOUR  DATA 62H
                                        MINTUE DATA 61H
                                       SECOND  DATA 60H
                                   DS1302_ADDR DATA 32H
                                   DS1302_DATA DATA 31H





				   						WFLAG1 BIT 2EH.2 ;DS18B20存在标志位
					 					DQ BIT P2.1 ;DS18B20数据线
					  					TEMPER_L EQU 3CH
					  					TEMPER_H EQU 3DH
					  					A_BIT EQU 3EH  ;温度低位	
					 					 B_BIT EQU 3FH  ;温度高位
                                          ORG  0000H
                                          AJMP START
                                          ORG  0003H
                                          RETI
                                          ORG  000BH
                                          RETI
                                          ORG  0013H
                                          RETI


                                          ORG  001BH
                                          LJMP INTT1
                                          ORG  0023H
                                          RETI
                                          ORG  002BH
                                          RETI

                             ;************************************
                             ;*            主程序                *
                             ;************************************
                                 START: MOV 2FH,#10H  ;设初试模式 
				                          MOV SP,#33H
                                          CLR 2EH.1   ;清秒闪标志
                                          CLR 2EH.3    ;清负温度标志
                                          MOV 3AH,#0H    ;设秒闪记数初值

					  					  SETB EA
                                          MOV SCON,#00H    ;串行输出,方式0
                                          MOV TMOD,#10H    ;计数器1,方式1
                                          MOV TL1,#00H
                                          MOV TH1,#00H
                                          MOV DS1302_ADDR,#8EH
                                          MOV DS1302_DATA,#00H       ;允许写1302
                                          LCALL WRITE
                                          MOV DS1302_ADDR,#90H
                                          MOV DS1302_DATA,#0A6H       ;1302充电,充电电流1.1mA
                                          LCALL WRITE
               	      
				   					MAIN1:JB P1.4,MAIN11
				   					SETM: LCALL DISPLAY
										  JNB P1.4,SETM
					                      MOV A,2FH
					                      RL A
					                      CJNE A,#20H,FLAG1
					                      MOV A,#01H
									FLAG1:MOV 2FH,A		      
				  			 	  MAIN11: MOV DS1302_ADDR,#8DH         ;READ OUT YEAR
                                          LCALL READ
                                          MOV YEAR,DS1302_DATA
                                          MOV DS1302_ADDR,#8BH        ;READ OUT WEEK
                                          LCALL READ
                                          MOV WEEK,DS1302_DATA
                                          MOV DS1302_ADDR,#89H          ;READ OUT MONTH
                                          LCALL READ
                                          MOV MONTH,DS1302_DATA
                                          MOV DS1302_ADDR,#87H          ;READ OUT DAY
                                          LCALL READ
                                          MOV DAY,DS1302_DATA
                                          MOV DS1302_ADDR,#85H       ;READ OUT HOUR
                                          LCALL READ
                                          MOV HOUR,DS1302_DATA
                                          MOV DS1302_ADDR,#83H       ;READ OUT MINTUE
                                          LCALL READ
                                          MOV MINTUE,DS1302_DATA
                                          MOV DS1302_ADDR,#81H       ;READ OUT SECOND
                                          LCALL READ
                                          MOV A,SECOND
                                          CJNE A,DS1302_DATA,SHAND
                                          AJMP SHAN
									SHAND:SETB 2EH.1    ;秒闪标志
									SHAN: MOV SECOND,DS1302_DATA




								    WENDU:JNB 2FH.3,WENDU1    ;不在温度模式下跳过温度读数
										  AJMP	WENDU2
								   WENDU1:LJMP	FENLI
								   WENDU2:LCALL INIT_18B20    ;读温度
                                          LCALL RE_CONFIG
                                          LCALL GET_TEMPER
                                          AJMP CHANGE
                              INIT_18B20: SETB DQ
                                          NOP
                                          CLR DQ
                                          MOV R0,#0FBH
                                    TSR1: DJNZ R0,TSR1;延时
                                          SETB DQ
                                          MOV R0,#25H
                                    TSR2: JNB DQ ,TSR3
                                          DJNZ R0,TSR2
                                    TSR3: SETB WFLAG1 ;置标志位,表明DS18B20存在
                                          CLR P2.2;二极管指示
                                          AJMP TSR5
                                    TSR4: CLR WFLAG1
                                          LJMP TSR7
                                    TSR5: MOV R0,#06BH
                                    TSR6: DJNZ R0,TSR6
									TSR7:SETB DQ;表明不存在
                                          RET
;********************设定DS18B20暂存器设定值**************
									RE_CONFIG:
                                          JB WFLAG1,RE_CONFIG1
                                          RET
									RE_CONFIG1: MOV A,#0CCH ;放跳过ROM命令
                                           LCALL WRITE_18B20
                                           MOV A,#4EH
                                           LCALL WRITE_18B20  ;写暂存器命令
                                           MOV  A,#00H   ;报警上限中写入00H
                                           LCALL WRITE_18B20
                                           MOV A,#00H  ;报警下限中写入00H
                                           LCALL  WRITE_18B20
                                           MOV  A,#1FH  ;选择九位温度分辨率
                                           LCALL WRITE_18B20
                                           RET
;*****************读转换后的温度值****************
									GET_TEMPER:
                                          SETB DQ
                                          LCALL INIT_18B20
                                          JB WFLAG1,TSS2
                                          RET ;若不存在则返回
									TSS2: MOV A,#0CCH ;跳过ROM
                                          LCALL WRITE_18B20
                                          MOV A,#44H ;发出温度转换命令
                                          LCALL WRITE_18B20
                                          MOV R0,#0FBH
									TSR9: MOV R1,#0F0H
									
									TSR8: DJNZ R1,TSR8
										  DJNZ  R0,TSR9
										  
;LCALL DISPLAY ;延时
                                          LCALL INIT_18B20
                                          MOV A,#0CCH ;跳过ROM
                                          LCALL WRITE_18B20
                                          MOV A,#0BEH;发出读温度换命令
                                          LCALL WRITE_18B20
                                          LCALL READ2_18B20 ;读两个字节的温度
                                          RET
;***************写DS18B20程序************
									WRITE_18B20:
                                          MOV R2,#8
                                          CLR C
									 WR1:
                                           CLR  DQ
                                           MOV R3,#6
                                           DJNZ R3,$
                                           RRC  A
                                           MOV  DQ,C
                                           MOV R3,#23
                                           DJNZ R3,$
                                           sETB DQ
                                           NOP
                                           DJNZ  R2,WR1
                                           SETB DQ
                                           RET
 

 ;***********读18B20程序,读出两个字节的温度*********
 									READ2_18B20:
                                           MOV  R4,#2 ;低位存在29 H,高位存在28H
                                           MOV R1,#29H
 									RE00: MOV R2,#8
 									RE01: CLR  C
                                           SETB  C
                                           NOP
                                           NOP
                                           CLR DQ
                                           NOP
                                           NOP
                                           NOP
                                           SETB DQ
                                           MOV R3,#7
                                           DJNZ R3,$
                                           MOV C,DQ
                                           MOV  R3,#23
                                           DJNZ R3,$
                                           RRC A
                                           DJNZ R2,RE01
                                           MOV @R1,A
                                           DEC R1
                                           DJNZ  R4,RE00
                                           RET
 ;************读出的温度进行数据转换**************
									CHANGE: MOV A,29H
                                           MOV C,28H.0  ;将28H中的最低位移入C
                                           RRC A
                                           MOV C,28H.1
                                           RRC A
                                           MOV C,28H.2
                                           RRC A
                                           MOV C,28H.3
                                           RRC A
 
                                            MOV 29H,a
                                            JNB ACC.7,XZ
                                            SETB 2EH.3
                                            CPL A
                                            ADD A,#01H
                                            MOV 29H,a
									XZ:     Mov a,29H;将29H中的十六进制数转换成10进制
                                            mov b,#10 ;10进制/10=10进制
                                            div ab
                                            mov B_BIT,a ;十位在a
                                            mov A_BIT,b ;个位在b









				
                                 FENLI:   MOV R0,YEAR                ;年分离,送显示缓存

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -