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

📄 ds1302+ds18b20+ʦ

📁 RM51单片机实验板配套实验例程库
💻
📖 第 1 页 / 共 2 页
字号:

;****************************************************************
;*  ★★★  DS1302 + DS18B20 + 1602万年历测试实验程序   ★★★  *
;* (电子驿站单片机实验板、开发板配套例程,程序转载请著明出处。) *
;*  E-mail: support@ourmpu.com     QQ留言:451338254 476485321  *
;*  编程:ourmpu  http://www.ourmpu.com/ 更多例程请登陆网站     *
;****************************************************************
;*  1602液晶模块第一行显示当前年、月、日及星期                  *
;*  1602液晶模块第二行显示实时温度,1位小数显示,分辨率0.1度    *
;*  测试程序中没有K1为液晶模块背光控制,按压可以控制背光的开关  *
;*  本程序供参考,没有加入时间调整功能及定时,闹铃功能          *
;*  用户可以修改该程序,实现多点定时、定闹功能,定时时间设置    *
;*  可以保存在24C04或93C46上,实现断电保存设置                  *
;*  设置参数也可以保存在DS1302内部的31自己RAM当中,也可以保存   *
;****************************************************************
			
			ORG		0000H
			AJMP		START
			
			ORG		0033H
START:
			BMJSBUF	EQU	30H	;半秒计数
			SECOND	EQU	31H	;妙
			MIN		EQU	32H	;分
			HR			EQU	33H	;时
			DATE		EQU	34H	;日
			MONTH		EQU	35H	;月
			DAY		EQU	36H	;年
			YEAR		EQU	37H	;星期
					
			TEMPFH	EQU	31H	;温度符号位
			TEMPBW	EQU	32H	;温度"百"位
			TEMPSW	EQU	33H	;温度"十"位
			TEMPGW	EQU	34H	;温度"个"位
			TEMPXS1	EQU	35H	;温度小数位第"1"位
			TEMPXS2	EQU	36H	;温度小数位第"2"位
			TEMPXS3	EQU	37H	;温度小数位第"3"位
			TEMPXS4	EQU	38H	;温度小数位第"4"位
			TEMPXSD	EQU	39H
			TEMPZS	EQU	3AH
			TEMPXS	EQU	3BH
			TEMPL		EQU	3CH
			TEMPH		EQU	3DH
						
			DLCD1		EQU	3EH
			DLCD2		EQU	3FH
			DLCD3		EQU	40H
			DLCD4		EQU	41H
			DLCD5		EQU	42H
			DLCD6		EQU	43H
			DLCD7		EQU	44H
			DLCD8		EQU	45H
			DLCD9		EQU	46H
			DLCD10	EQU	47H
			DLCD11	EQU	48H
			DLCD12	EQU	49H
			DLCD13	EQU	4AH
			DLCD14	EQU	4BH
			DLCD15	EQU	4CH
			DLCD16	EQU	4DH
						
			RST		BIT	P1.0
			IO			BIT	P1.1
			CLK		BIT	P1.2
			K1			BIT	P3.2
			K2			BIT	P3.3
			K3			BIT	P3.4
			K4			BIT	P3.5
			DQ			BIT	P3.3
			RS 		BIT 	P2.0 
			RW 		BIT 	P2.1 
			E  		BIT 	P2.2 
			LED8P		BIT	P2.6
			BLA		BIT	P2.7
			LCD 		EQU 	P0
			
			DPBIT		BIT	00H	;半秒标志
			SSEC		BIT	01H	;设置妙
			SMIN		BIT	02H	;设置分
			SETHR		BIT	03H	;设置时
			SDATE		BIT	04H	;设置日
			SMON		BIT	05H	;设置月
			SDAY		BIT	06H	;设置星期
			SYEAR		BIT	07H	;设置年
			SETBIT	BIT	08H	;总设置状态标志
			DS18OK	BIT	09H
			TEMPERRB	BIT	0AH
			TEMPSBIT	BIT	0BH
			LCDSX		BIT	0CH	;显示第二行标志
			BLABIT	BIT	0DH	;液晶背光开启标志
			
			MOV		P0,#0FFH
			MOV		P1,#0FFH
			MOV		P2,#0FFH
			MOV		P3,#0FFH
			MOV		20H,#00H
			MOV		BMJSBUF,#2
			MOV		SP,#60H
			
			MOV     	SECOND,#02H
        	MOV     	MIN,#41H
        	MOV     	HR,#21H
        	MOV     	DATE,#26H
        	MOV     	MONTH,#03H
        	MOV     	DAY,#03H
        	MOV     	YEAR,#08H
;      	LCALL		SET1302   		;初始化为07年3月8日 星期二 02:15:02
			LCALL		STR1302		;启动计时

MAIN:		LCALL		R_1302			;读出当前时间
			CLR		LCDSX
			LCALL		CFTIME
			LCALL		DISPLCD			;液晶显示子程序
			
			LCALL		CFTEMP
			LCALL		DISPLCD			;液晶显示子程序
			
			LCALL		SKEY				;扫描按键
			
			MOV		R7,BMJSBUF
			DJNZ		R7,DPBC
			MOV		BMJSBUF,#3
			CPL		DPBIT
			AJMP		MAIN
DPBC:		MOV		BMJSBUF,R7
			AJMP		MAIN
						
;=======================================================
CFTIME:	MOV	DLCD1,#20H			;拆分年、月、日、星期到显示缓冲区
			
			MOV	A,YEAR				;年
			SWAP	A
			ANL	A,#0FH
			ORL	A,#00110000B
			MOV	DLCD2,A
			MOV	A,YEAR				
			ORL	A,#00110000B
			MOV	DLCD3,A
			
			MOV	DLCD4,#2FH
			
			MOV	A,MONTH				;月
			SWAP	A
			ANL	A,#0FH
			ORL	A,#00110000B
			MOV	DLCD5,A
			MOV	A,MONTH
			ANL	A,#0FH
			ORL	A,#00110000B
			MOV	DLCD6,A
			
			MOV	DLCD7,#2FH
			
			MOV	A,DATE				;日
			SWAP	A
			ANL	A,#0FH
			ORL	A,#00110000B
			MOV	DLCD8,A
			MOV	A,DATE
			ANL	A,#0FH
			ORL	A,#00110000B
			MOV	DLCD9,A
			
			MOV	DLCD10,#20H
			MOV	DLCD11,#57H
			MOV	DLCD12,#65H
			MOV	DLCD13,#65H
			MOV	DLCD14,#6BH
			MOV	DLCD15,#2EH
			
			MOV	A,DAY					;星期
			ANL	A,#0FH
			ORL	A,#00110000B
			MOV	DLCD16,A
			RET

;=======================================================
CFTEMP:	MOV	DLCD1,#20H			;读取并拆分温度子程序
			MOV	A,HR					;时
			SWAP	A
			ANL	A,#0FH
			ORL	A,#00110000B
			MOV	DLCD2,A
			MOV	A,HR
			ANL	A,#0FH
			ORL	A,#00110000B
			MOV	DLCD3,A
			
			JB		DPBIT,SJSS1
			MOV	DLCD4,#3AH
			AJMP	SJSS2
SJSS1:	MOV	DLCD4,#20H
SJSS2:	MOV	A,MIN					;分
			SWAP	A
			ANL	A,#0FH
			ORL	A,#00110000B
			MOV	DLCD5,A
			MOV	A,MIN
			ANL	A,#0FH
			ORL	A,#00110000B
			MOV	DLCD6,A

			JB		DPBIT,SJSS3
			MOV	DLCD7,#3AH
			AJMP	SJSS4
SJSS3:	MOV	DLCD7,#20H
SJSS4:	MOV	A,SECOND				;妙
			SWAP	A
			ANL	A,#0FH
			ORL	A,#00110000B
			MOV	DLCD8,A
			MOV	A,SECOND
			ANL	A,#0FH
			ORL	A,#00110000B
			MOV	DLCD9,A	
			MOV	DLCD10,#20H
			LCALL	GETTEMP				;读取当前温度
			SETB	LCDSX
			JNB 	DS18OK,DS18E		;检测温度传感器是否存在
			MOV	A,TEMPSW				;存在,正常显示温度
			ORL	A,#00110000B
			MOV	DLCD11,A
			MOV	A,TEMPGW
			ORL	A,#00110000B
			MOV	DLCD12,A
			MOV	DLCD13,#2EH
			MOV	A,TEMPXS1
			ORL	A,#00110000B
			MOV	DLCD14,A
			MOV	DLCD15,#0DFH
			MOV	DLCD16,#43H
			RET
DS18E:	MOV	DLCD11,#20H		;温度传感器不存在,不显示温度
			MOV	DLCD12,#20H
			MOV	DLCD13,#20H
			MOV	DLCD14,#20H
			MOV	DLCD15,#20H
			MOV	DLCD16,#20H
			RET			

;=======================================================
DISPLCD:        ;------- 液晶模块显示程序---------
		JB			BLABIT,BLAOFF
		CLR		BLA				;开启液晶背光
		AJMP		DLCD
BLAOFF:
		SETB		BLA				;关闭液晶背光
;		MOV		P2,#01111111B
;		MOV 		LCD,#01H		;写指令01H,清屏
;		LCALL 	ENABLE
DLCD:		
		MOV 		LCD,#38H    ;写指令38H,设定LCD为16*2显示,5*7点阵,8位数据接口
		LCALL 	ENABLE
		MOV 		LCD,#0FH    ;写指令0FH,显示ON,光标ON,闪烁ON
		LCALL 	ENABLE
		MOV 		LCD,#06H    ;写指令06H,光标输入方式增量移位
		LCALL 	ENABLE
	
		JB		LCDSX,WXIA
		MOV 	LCD,#80H		;第一行显示第1个字符的位置            
		ACALL ENABLE
		MOV 	R0,#DLCD1
		CALL 	WRITE1
		RET
				
WXIA:	MOV 	LCD,#0C0h	;第二行位置                            
		CALL 	ENABLE
		MOV 	R0,#DLCD1
		CALL 	WRITE1
		RET

ENABLE:				;写命令时序(参照1602LCD使用说明书)
	CLR 	RS
	CLR 	RW 
	CLR 	E 
	MOV	R7,#188
	DJNZ	R7,$
	SETB 	E 
	RET

WRITE1:					;写字符串				   		
	MOV 	R1,#16
A1:	MOV 	A,@R0
	CALL 	WRITE2
	INC 	R0
	DJNZ 	R1,A1
	RET
                                                                              
WRITE2:              ;写单个字符                                                                             
	MOV 	LCD,A
	SETB 	RS
	CLR 	RW                          
	CLR 	E
	CALL 	DELAY1
	SETB 	E
	RET 

DELAY1:
	MOV 	R7,#1
D11:	MOV 	R6,#18
D12:	DJNZ 	R6,D12
	DJNZ 	R7,D11
	RET


GETTEMP:CLR	EA
	LCALL 	INIT18B20	;先复位DS18OK
	JB 	DS18OK,TSS2
	SETB	EA
	RET
TSS2:	MOV 	A,#0CCH 	; 跳过ROM匹配
	LCALL 	WRITE18B20
	MOV 	A,#44H 		; 发出温度转换命令
	LCALL 	WRITE18B20
	LCALL	YS800M		;延时0.8S,延时>750MS
	LCALL 	INIT18B20
	MOV 	A,#0CCH 	;跳过ROM匹配
	LCALL 	WRITE18B20
	MOV 	A,#0BEH 	;发出读温度命令
	LCALL 	WRITE18B20
	MOV 	R4,#2 		;从DS18OK中读出2字节温度数据
	MOV 	R1,#TEMPL
	LCALL 	READ18B20	;读温度
	SETB	EA


DOTEMP:	MOV	TEMPXSD,#2EH
TESTS1:	MOV	A,TEMPH
	ANL	A,#11111000B
	CJNE	A,#0F8H,TESTS0
	MOV	TEMPFH,#0FFH
	SETB	TEMPSBIT
	CLR	TEMPERRB
	LJMP	DOTEMP1
TESTS0:	CJNE	A,#00H,TEMPERR
	MOV	TEMPFH,#00H
	CLR	TEMPSBIT
	CLR	TEMPERRB
	LJMP	DOTEMP1
TEMPERR:
	SETB	TEMPERRB
	LJMP	TEMPRET
DOTEMP1:
	JNB	TEMPSBIT,DOTEMP2
	MOV	A,TEMPH
	CPL	A
	MOV	TEMPH,A
	MOV	A,TEMPL
	CPL	A
	CLR	C
	ADD	A,#1
	MOV	TEMPL,A
	MOV	A,TEMPH
	ADDC	A,#00H
	ANL	A,#00000111B
	MOV	TEMPH,A
DOTEMP2:
	MOV	A,TEMPH
	SWAP	A
	MOV	TEMPH,A
	MOV	A,TEMPL
	ANL	A,#00001111B
	MOV	TEMPXS,A
	MOV	A,TEMPL
	ANL	A,#11110000B
	SWAP	A
	MOV	R1,TEMPH
	ORL	A,R1
	MOV	TEMPZS,A
HBCD:
	MOV	A,TEMPZS
	MOV 	B,#100
	DIV 	AB
	MOV 	TEMPBW,A
	MOV 	A,#10
	XCH 	A,B
	DIV 	AB
	MOV 	TEMPSW,A
	MOV	A,B
	MOV 	TEMPGW,A
FLXS:	MOV	R2,#4
	MOV	A,TEMPXS
	ANL	A,#00001111B
	MOV	B,#4
	MUL	AB
	MOV	R1,A
	MOV	R0,#TEMPXS1
FLXS1:	MOV	DPTR,#DISPXS
	MOV	A,R1
	MOVC	A,@A+DPTR
	MOV	@R0,A
	INC	R0
	INC	R1
	DJNZ	R2,FLXS1
			
TEMPRET:
	SETB	EA
	RET

;-----------------------------------------------------
INIT18B20:
	SETB	DQ
	NOP
	CLR	DQ
	MOV	R0,#107		;主机发出延时537微秒的复位低脉冲[2]
	MOV 	R1,#3
TSR1:	DJNZ 	R0,TSR1
	MOV 	R0,#107
	DJNZ 	R1,TSR1
	SETB 	DQ
	NOP
	NOP
	NOP
	MOV 	R0,#25H
TSR2:	JNB 	DQ,TSR3
	DJNZ 	R0,TSR2
	AJMP 	TSR4
TSR3:	SETB 	DS18OK
	AJMP 	TSR5
TSR4:	CLR 	DS18OK
	AJMP 	TSR7
TSR5:	MOV 	R0,#107

⌨️ 快捷键说明

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