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

📄 clocl.asm

📁 读取DS1302的时间数据并用LED动态显示的51汇编(有注释)
💻 ASM
字号:
;电子钟电路程序
;CD4511作段译码,74HC138作位译码
;DS1822作温度,DS1302为时钟,24C02存储定闹数据
;数据管为共阴型,89C2051时钟为4MHz
;
;
;
 SCK      BIT P3.0               ;DS1302,24C02时钟
 K_on     BIT P3.1               ;按键侦测
 S_on     BIT P3.2               ;闹铃输出
 SDA      BIT P3.3               ;24C02数据
 I/O      BIT P3.4               ;DS1302输入输出
 RST      BIT P3.5               ;DS1302复位
 DQ       BIT P3.7               ;DS1822输入输出

SECOND  EQU 60H
;60H  秒
;61h  分
;62h  时
;63h  日
;64h  月
;65h  DAY
;66h  年
;6Ah  闹分    from 00(1302)
;6BH  闹时    from 01(1302)
;***************************
        ORG   0000H
        AJMP  START
        ORG   0003H
        LJMP  S_INT            ;IRF
        ORG   000BH            ;200Us
        LJMP  P_INT            ;
        ORG   001BH            ;display LED
        LJMP  DISPLAY
;****************************  ;main program
















		ORG 0000H
START:
		MOV P1,#81H
		CALL DELAY
		MOV P1,#92H
		CALL DELAY
		MOV P1,#0A3H
		CALL DELAY
		MOV P1,#0B4H
		CALL DELAY
		MOV P1,#0C5H
		CALL DELAY
		MOV P1,#0D6H
		CALL DELAY
		SETB P1.7
		AJMP START
DELAY:
		NOP
		CLR P1.7
		MOV R7,#20
D1:	MOV R6,#100
D2:	DJNZ R6,D2
		DJNZ R7,D1
		RET
BB:	
	
		END	

		
		



 
Write_Enable:
;当写保护寄存器的最高位为0 时允许数据写入寄存器写保护寄存器可以通过命令字节8E /8F 来规定禁止
;写入/读出写保护位不能在多字节传送模式下写入

MOV Command,#8Eh 	;命令字节为8E
MOV ByteCnt,#1 		;单字节传送模式
MOV R0,#XmtDat 		;数据地址覆给R0
MOV XmtDat,#00h 	;数据内容为0 写入允许
									;7位为0时24小时计时
									;5位A、P选择位成时十位;
									;7位为1时12小时计时
									;5位A、P选择位成A、P位

ACALL Send_Byte 	;调用写入数据子程序
RET 							;返回调用本子程序处

Write_Disable:
;当写保护寄存器的最高位为1 时禁止数据写入寄存器

MOV Command,#8Eh 	;命令字节为8E
MOV ByteCnt,#1 		;单字节传送模式
MOV R0,#XmtDat 		;数据地址覆给R0
MOV XmtDat,#80h 	;数据内容为80h 禁止写入
ACALL Send_Byte 	;调用写入数据子程序
RET 							;返回调用本子程序处

;时钟停止位操作
;当把秒寄存器的第7 位时钟停止位设置为0 时起动时钟开始

Osc_Enable:

MOV Command,#80h 	; 命令字节为80
MOV ByteCnt,#1 		; 单字节传送模式
MOV R0,#XmtDat 		;数据地址覆给R0
MOV XmtDat,#00h 	;数据内容为0 振荡器工作允许
ACALL Send_Byte 	;调用写入数据子程序
RET 							;返回调用本子程序处
 
;当把秒寄存器的第7 位时钟停止位设置为1 时时钟振荡器停止HT1380 进入低功耗方式

Osc_Disable:

MOV Command,#80h 	;命令字节为80
MOV ByteCnt,#1 		;单字节传送模式
MOV R0,#XmtDat 		;数据地址覆给R0
MOV XmtDat,#80h 	;数据内容为80h 振荡器停止
ACALL Send_Byte 	;调用写入数据子程序
RET 							;返回调用本子程序处

;多字节传送方式
;当命令字节为BE 或BF 时DS1302 工作在多字节传送模式8 个时钟/日历寄存器从寄存器0 地址开始连续
;读写从0 位开始的数据当命令字节为FE 或FF 时DS1302 工作在多字节RAM 传送模式31 个RAM 寄存器从
;0 地址开始连续读写从0 位开始的数据
;例如写入09 年3 月20 日星期五13 时59 分20 秒程序设置如下

Write_Multiplebyte:

MOV Command,#0BEh ;命令字节为BEh
MOV ByteCnt,#8 		;多字节写入模式此模块为8 个
MOV R0,#XmtDat 		;数据地址覆给R0
MOV XmtDat,#20h 	;秒单元内容为20h
MOV XmtDat+1,#59h ;分单元内容为59h
MOV XmtDat+2,#13h ;时单元内容为13h
MOV XmtDat+3,#20h ;日期单元内容为20h
MOV XmtDat+4,#03h ;月单元内容为03h
MOV XmtDat+5,#035h ;星期单元内容为05h
MOV XmtDat+6,#09 	;年单元内容为09h
MOV XmtDat+7,#0 	;写保护单元内容为00h
ACALL Send_Byte 	;调用写入数据子程序
RET 							;返回调用本子程序处

;读出寄存器0-7 的内容程序设置如下

Read_Multiplebyte:

MOV Command,#0BFh ;命令字节为BFh
MOV ByteCnt,#8 		;多字节读出模式此模块为8 个
MOV R1,#RcvDat 		;数据地址覆给R1
ACALL Receive_Byte ;调用读出数据子程序
RET 							;返回调用本子程序处

;单字节传送方式
;例如写入8 时12 小时模式程序设置如下

Write_Singlebyte:

MOV Command,#84h 	; 命令字节为84h
MOV ByteCnt,#1 		; 单字节传送模式
MOV R0,#XmtDat 		;数据地址覆给R0
MOV XmtDat,#88h 	;数据内容为88h
ACALL Send_Byte 	;调用写入数据子程序
RET 							;返回调用本子程序处

;举例说明如何单字节读出小时单元的内容.

Read_Singlebyte:

MOV Command,#85h 	; 命令字节为85h
MOV ByteCnt,#1 		; 单字节传送模式
MOV R1,#RcvDat 		;数据地址覆给R1
ACALL Receive_Byte ;调用读出数据子程序
RET 							;返回调用本子程序处


;********************************************************************************************
;发送数据程序
;名称:Send_Byte
;描述:发送ByteCnt 个字节给被控器DS1302
;命令字节地址在Command 中
;所发送数据的字节数在ByteCnt 中
;发送的数据在XmtDat 缓冲区中
;********************************************************************************************

Send_Byte:

CLR RST 					;复位引脚为低电平所有数据传送终止
NOP
CLR SCK 					;清时钟总线
NOP
SETB RST 					;复位引脚为高电平逻辑控制有效
NOP
MOV A,Command 		;准备发送命令字节
MOV BitCnt,#08h 	;传送位数为8

S_Byte0:

RRC A 						;将最低位传送给进位位C
MOV IO,C 		;位传送至数据总线
NOP
SETB SCK 				;时钟上升沿发送数据有效
NOP
CLR SCK 					;清时钟总线
DJNZ BitCnt,S_Byte0 ;位传送未完毕则继续
NOP

S_Byte1: 
;准备发送数据

MOV A,@R0 				;传送数据过程与传送命令相同
MOV BitCnt,#08h

S_Byte2:

RRC A
MOV IO,C
NOP
SETB SCK
NOP
CLR SCK
DJNZ BitCnt,S_Byte2
INC R0 						;发送数据的内存地址加1
DJNZ ByteCnt,S_Byte1 ;字节传送未完毕则继续
NOP
CLR RST 					;逻辑操作完毕清RST
RET
;***********************************************************************************
;接收数据程序;
;名称:Receive_Byte
;描述:从被控器DS1302 接收ByteCnt 个字节数据
;命令字节地址在Command 中
;所接收数据的字节数在ByteCnt 中
;接收的数据在RcvDat 缓冲区中
;***********************************************************************************

Receive_Byte:

CLR RST 					;复位引脚为低电平所有数据传送终止
NOP
CLR SCK 					;清时钟总线
NOP
SETB RST 					;复位引脚为高电平逻辑控制有效
MOV A,Command 		;准备发送命令字节
MOV BitCnt,#08h 	;传送位数为8

R_Byte0:

RRC A 						;将最低位传送给进位位C
MOV IO,C 		;位传送至数据总线
NOP
SETB SCK 				;时钟上升沿发送数据有效
NOP
CLR SCK 					;清时钟总线
DJNZ BitCnt,R_Byte0 ;位传送未完毕则继续
NOP

R_Byte1: 					;准备接收数据

CLR A 						;清类加器
CLR C 						;清进位位C
MOV BitCnt,#08h 	;接收位数为8

R_Byte2:

NOP
MOV C,IO 		;数据总线上的数据传送给C
RRC A 						;从最低位接收数据
SETB SCK 				;时钟总线置高
NOP
CLR SCK 					;时钟下降沿接收数据有效
DJNZ BitCnt,R_Byte2 ;位接收未完毕则继续
MOV @R1,A 				;接收到的完整数据字节放入接收内存缓冲区
INC R1 						;接收数据的内存地址加1
DJNZ ByteCnt,R_Byte1 ;字节接收未完毕则继续
NOP
CLR RST 					;逻辑操作完毕清RST
RET
;=============================================================================================
END
	

⌨️ 快捷键说明

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