header
嵌入式开发 > 详情

stc单片机1TMCU控制DS1302程序

发布时间:2020-07-13 发布时间:
|
SCLKBITP1.0;DS1302时钟口P1.0
IOBITP1.1;DS1302数据口P1.1

RSTBITP1.2;DS1302片选口P1.2 NOWDATA40H ORG0
JMPReset ORG100H
Reset:
CALLDS1302_Initial;初始化DS1302
MOV DPTR,#INIT
CALLDS1302_SetTime;设置初始时间
MOV R0,#NOW
CALLDS1302_GetTime;读取当前时间 JMP$ INIT://秒分时日月星期年
DB00H,00H,20H,01H,01H,05H,10H
;**************************************
;延时X微秒(STC12C5A60S2@12M)
;不同的工作环境,需要调整此函数
;入口参数:R7
;出口参数:无
;**************************************
Delay:;6此延时函数是使用1T的指令周期进行计算,与传统的12T的MCU不同
NOP;1
NOP;1
RET;4
;**************************************
;从DS1302读1字节数据
;入口参数:无
;出口参数:ACC
;**************************************
DS1302_ReadByte:
CLRA
PUSH0
MOV 0,#8;8位计数器
ReadNext:
CLRSCLK;时钟线拉低
CALLDelay;延时等待
MOV C,IO;读取数据
RRCA;保存数据
SETBSCLK;时钟线拉高
CALLDelay;延时等待
DJNZ0,ReadNext
POP0
RET ;**************************************
;向DS1302写1字节数据
;入口参数:ACC
;出口参数:无
;**************************************
DS1302_WriteByte:
PUSH0
MOV 0,#8;8位计数器
WriteNext:
CLRSCLK;时钟线拉低
CALLDelay;延时等待
RRCA;移出数据
MOV IO,C;送出到端口
SETBSCLK;时钟线拉高
CALLDelay;延时等待
DJNZ0,WriteNext
POP0
RET ;**************************************
;读DS1302某地址的的数据
;入口参数:ACC(地址)
;出口参数:ACC(读出的数据)
;**************************************
DS1302_ReadData:
CLRRST;拉低片选
CALLDelay;延时等待
CLRSCLK;时钟线拉低
CALLDelay;延时等待
SETBRST;使能片选
CALLDelay;延时等待
CALLDS1302_WriteByte;写地址
CALLDS1302_ReadByte;读数据
RET ;**************************************
;往DS1302的某个地址写入数据
;入口参数:ACC(地址)B(需写入的数据)
;出口参数:无
;**************************************
DS1302_WritEDAta:
CLRRST;拉低片选
CALLDelay;延时等待
CLRSCLK;时钟线拉低
CALLDelay;延时等待
SETBRST;使能片选
CALLDelay;延时等待
CALLDS1302_WriteByte;写地址
MOV A,B;地址数据送入ACC
CALLDS1302_WriteByte;写数据
RET ;**************************************
;写入初始时间
;入口参数:DPTR(初始值地址)
;出口参数:无
;**************************************
DS1302_SetTime:
MOV A,#8EH
MOV B,#0
CALLDS1302_WriteData;允许写操作
MOV R7,#80H;从寄存器80开始
MOV R6,#7;连续写7次
SetNext:
CLRA
MOV CA,@A+DPTR
MOV B,A;数据
MOV A,R7;地址
CALLDS1302_WriteData;写数据
INCR7
INCR7;寄存器地址+2
INCDPTR;数据地址+1
DJNZR6,SetNext
MOV A,#8EH
MOV B,#80H
CALLDS1302_WriteData;写保护
RET ;**************************************
;读取当前时间
;入口参数:R0(数据缓冲区首地址)
;出口参数:无
;**************************************
DS1302_GetTime:
MOV R7,#81H;从寄存器81开始
MOV R6,#7;连续读7次
GetNext:
MOV A,R7;地址
CALLDS1302_ReadData;读数据
MOV @R0,A;保存数据
INCR7
INCR7;寄存器地址+2
INCR0;数据地址+1
DJNZR6,GetNext
RET ;**************************************
;初始化DS1302
;**************************************
DS1302_Initial:
CLRRST
CLRSCLK
MOV A,#8EH
MOV B,#0
CALLDS1302_WriteData;允许写操作
MOV A,#80H
MOV B,#0
CALLDS1302_WriteData;时钟启动
MOV A,#90H
MOV B,#0A6H
CALLDS1302_WriteData;一个二极管+4K电阻充电
MOV A,#8EH
MOV B,#80H
CALLDS1302_WriteData;写保护
RET END


『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
从RS-232串口到PROFIBUS-DP总线的转换接口设计
footer