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

📄 ds1302.a

📁 基于单片机的汇编程序
💻 A
字号:
/*时钟程序,大家是否想到用定时器,对,也可用定时器的中断来处理,这样的程序我想不用我说了吧!
你们可自己发辉下,本程序采用外元件DS1302时钟IC,使用此IC不增加系统资源,要时钟时直接去读取就可以了
本IC跟ADC0831一样以串口方式传送数据,不同的是协议,只要你读懂它的串口协议,就可以用P口来模拟协议进行
,这样更能使你对传送数据协议的了解,在看本程序之前,先看看芯片的串口协议*/

SCL2	BIT	P1.3;		//SCL2定义为P1口的第3位脚,连接ADC0831SCL脚
SDA2	BIT	P1.4;		//SDA2定义为P1口的第4位脚,连接ADC0831SDA脚
CS2	BIT	P1.6;		//CS2定义为P1口的第4位脚,连接ADC0831CS脚
RST	BIT	P1.5;// DS1302片选,因这两芯片采用同一数据脚(SDA,SCL),所以我们要定义它,将DS1302片选关掉,否则发生冲突
L_DISPLAY	EQU	30H
L_TMPDATE1	EQU	38H	;秒
L_TMPDATE2	EQU	39H	;分
L_TMPDATE3	EQU	3AH	;时
L_TMPDATE4	EQU	3BH	;星期
L_TMPDATE5	EQU	3CH	;日
L_TMPDATE6	EQU	3DH	;月
L_TMPDATE7	EQU	3EH	;年

ORG 0100H
write_rtc_address:	DB	80H,82H,84H,86H,88H,8aH,8cH
read_rtc_address:	DB	81H,83H,85H,87H,89H,8bH,8dH
L_TIMER:	DB	00H,59H,18H,01H,01H,01H,01H
TABLE:	DB	3fH,06H,5bH,4fH,66H,6dH,7dH,07H,7fH,6fH,40H
			/*共阴数码管 0-9 - 表*/

ORG 0000H
LJMP MAIN

ORG 0200H
MAIN:	MOV SP,#60H
	CLR RST
	LCALL SET_RTC			;先写入初值
M0:	LCALL READ_RTC			;循环读取时间数据
	MOV R0,#L_DISPLAY
	MOV A,L_TMPDATE3		;把时拆分为两个数据,个时和十时		
	MOV B,#16
	DIV AB
	MOV @R0,A			;十时
	INC R0
	MOV @R0,B			;个时
	INC R0
	MOV @R0,#10			;加"-"
	INC R0
	MOV A,L_TMPDATE2		;同上
	MOV B,#16
	DIV AB
	MOV @R0,A
	INC R0
	MOV @R0,B
	INC R0
	MOV @R0,#10
	INC R0
	MOV A,L_TMPDATE1
	MOV B,#16
	DIV AB
	MOV @R0,A
	INC R0
	MOV @R0,B
	MOV R0,#L_DISPLAY
	MOV R7,#8
	LCALL DISPLAY
	SJMP M0


DISPLAY:MOV DPTR,#TABLE 	/*R0为地址,R7为个数*/
	MOV P2,#0
	ANL P1,#0F8H
L2:	MOV A,@R0
	MOVC A,@A+DPTR
	MOV P2,A
	LCALL DELAY
	MOV P2,#0
	INC P1
	INC R0
	DJNZ R7,L2
	RET

DELAY:	MOV R5,#20
D1:	DJNZ R5,D1
	RET	


SET_RTC:MOV R6,#7			;转输7个数据:秒、分、时、星期、日、月、年
	MOV DPTR,#L_TIMER		;初始的7个数据从ROM中转到我们定义的RAM中
	MOV R0,#L_TMPDATE1	
S0:	CLR A		
	MOVC A,@A+DPTR
	MOV @R0,A
	INC R0
	INC DPTR
	DJNZ R6,S0
	MOV R1,#8EH
	MOV R2,#0
	LCALL W1302			;首先写入地址8EH为0,即解锁,否则写入不了数据
	MOV R0,#L_TMPDATE1		;数据保存的地址
	MOV DPTR,#write_rtc_address	;所写数据的地址
	MOV R6,#7			;写入7个数据:秒、分、时、星期、日、月、年
S1:	MOV A,@R0
	MOV R2,A
	CLR A
	MOVC A,@A+DPTR
	MOV R1,A
	LCALL W1302
	INC DPTR
	INC R0
	DJNZ R6,S1
	MOV R1,#8EH			
	MOV R2,#80H
	LCALL W1302			;;最后写入地址8EH为80H,即加上锁,不让写入不了数据
	RET

READ_RTC:MOV R6,#7			;读出7个数据:秒、分、时、星期、日、月、年
	MOV R0,#L_TMPDATE1		;存入定义的RAM中
	MOV DPTR,#read_rtc_address
RE0:	CLR A
	MOVC A,@A+DPTR
	MOV R1,A
	LCALL R1302
	MOV @R0,A
	INC DPTR
	INC R0
	DJNZ R6,RE0
	RET

W1302B:	MOV R7,#8			;单字节写,R1参数为所写数据
	MOV A,R1
W0:	RRC A
	MOV SDA2,C
	NOP
	SETB SCL2
	NOP
	CLR SCL2
	DJNZ R7,W0
	RET

W1302:	CLR RST				;指定地址写入数据,R1:地址,R2:数据
	NOP
	CLR SCL2
	NOP
	SETB RST
	NOP
	LCALL W1302B
	MOV A,R2
	MOV R1,A
	LCALL W1302B
	CLR RST
	NOP
	RET

R1302:	MOV R2,#0			;指定地址读数据,R1:地址,A:返回的数据
	CLR RST
	NOP
	CLR SCL2
	NOP
	SETB RST
	NOP
	LCALL W1302B
	MOV R7,#8
	CLR A
RR0:	MOV C,SDA2			;;单字节读,读出数据存入A传出
	RRC A
	SETB SCL2
        NOP
	CLR SCL2
	DJNZ R7,RR0
	CLR RST
	NOP
	CLR SCL2
	NOP
	SETB SCL2
	NOP
	CLR SDA2
	NOP
	SETB SDA2
	NOP
	RET

END

⌨️ 快捷键说明

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