DS1302-51单片机汇编程序
DS1302完整程序

sbit ds1302_RST =P1^6;sbit ds1302_IO =P1^5;sbit ds1302_SCLK=P1^4;sbit ACC0=ACC^0;sbit ACC7=ACC^7;uchar initial_time[]={0x05,0x00,0x09,0x03,0x06,0x02,0x99,0x00};uchar now_time[5],ring_time[3];void init_ds1302();void get_ds1302() ;void set_ds1302(uchar taddr,uchar *P1302);uchar read_data_ds1302(uchar taddr);void write_data_ds1302(uchar taddr,uchar tdata);void write_Byte(uchar tdata);uchar read_Byte();void read_ring();uchar read_Byte() //功能: 从DS1302读取1Byte数据,返回值: ACC {uchar i;for(i=8;i>0;i--){ACC=ACC>>1;ACC7=ds1302_IO; //相当于汇编中的RRCds1302_SCLK=1;ds1302_SCLK=0;}return(ACC);}void write_Byte(uchar tdata) // 往DS1302写入1Byte数据,返回值: 无{uchar i;ACC=tdata;for(i=8;i>0;i--){ds1302_IO=ACC0; //相当于汇编中的RRCds1302_SCLK=1;ds1302_SCLK=0;ACC=ACC>>1;}}void write_data_ds1302(uchar taddr,uchar tdata) //功能: 往DS1302写入数据,返回值: 无{ds1302_RST=0;ds1302_SCLK=0;ds1302_RST=1;write_Byte(taddr); /* 地址,命令*/write_Byte(tdata); /* 写1Byte数据*/ds1302_RST=0;ds1302_SCLK=1;}uchar read_data_ds1302(uchar taddr) //功能: 读取DS1302某地址的数据,返回值: ucDa :读取的数据{uchar tdata;ds1302_RST=0;ds1302_SCLK=0;ds1302_RST=1;write_Byte(taddr);/* 地址,命令*/tdata=read_Byte(); /* 读1Byte数据*/ds1302_RST=0;ds1302_SCLK=1;return(tdata);}void set_ds1302(uchar taddr,uchar *P1302) //功能: 设置初始时间,输入: P1302: 初始时间数组首地址。
实时时钟芯片DS1302 C51源程序

功能:实时时钟写入一字节
说明:往DS1302写入1Byte数据(内部函数)
入口参数:d写入的数据
返回值:无
***********************************************************************/
void RTInputByte(uchar d)
函数名:W1302()
功能:往DS1302写入数据
说明:先写地址,后写命令/数据(内部函数)
调用:RTInputByte() , RTOutputByte()
入口参数:ucAddr: DS1302地址, ucData:要写的数据
返回值:无
***********************************************************************/
允许写保护:W1302(0X8E,0X80)读月:R1302(0X89)
慢充电控制:W1302(0X90,0XAA)写秒(起振):W1302(0X80,0X00)
写秒(停振):W1302(0X80,0X80)
函数名:R1302()
功能:读取DS1302某地址的数据
说明:先写地址,后读命令/数据(内部函数)
调用:RTInputByte() , RTOutputByte()
入口参数:ucAddr: DS1302地址
返回值:ucData :读取的数据
***********************************************************************/
返回值:无
***********************************************************************/
ds1302与单片机的连接,51单片机操作ds1302流程展示

ds1302 与单片机的连接,51 单片机操作ds1302 流程
展示
在许多单片机系统中常需要一些与时间有关的控制这就有需要使用实时时钟,因为在测控系统中需要做一些特殊数据的记录及其出现时间的记
录。
那幺实时时钟就能够很好的解决这个问题,今天我们就来谈谈ds1302 与单片机之间是如何作用联系的,单片机又是如何对时钟芯片进行操作的,一
起来了解一下。
51 单片机操作ds1302 流程展示
DS1302 通过3 根线与MCU 连接串行数据发送,接收时钟信号由MCU 发送,可外接备用电池以便主电源断电后不丢失数据,并可编程对备用电源充电。
DS1302 的结构如下:。
基于单片机的DS1302时钟芯片液晶显示时钟汇编程序

;************由1602显示ds1302时钟*********************rs bit p1.2rw bit p1.3e bit p1.4dio bit p2.6clk bit p2.5rst bit p2.7miao equ 30h ;为秒,分,时,日,月,周,年,分配储存单元fen equ 31hshi equ 32hday equ 33hyue equ 34hzhou equ 35hnian equ 36hbcd equ 37h;bcdh equ 38h;bcdl equ 39hhex equ 40horg 0000hljmp startorg 0030h;****初始化时间为:12:00:00,11年03月16日,周三***start: ;mov sp,#60hmov shi,#15h ;初始化数据mov fen,#59hmov miao,#55hmov day,#10hmov yue,#3hmov zhou,#3hmov nian,#12h;lcall r_ram ;调用读1302数据的子程序;********************初始化lcd1602************************************* mov e,#0mov p2,#0f0h ;关数码管MOV P0,#01H ;清屏并光标复位LCALL WR_CODE ;调用写入命令子程序MOV P0,#02H ;光标回车LCALL WR_CODE ;调用写入命令子程序MOV P0,#038H ;5x7的点阵字符LCALL WR_CODE ;调用写入命令子程序LCALL WR_CODE ;调用写入命令子程序MOV P0,#0cH ;开显示,光标闪烁LCALL WR_CODE ;调用写入命令子程序lcall set1302 ;调用设置1302子程序lcall r_ram ;调用读1302数据的子程序lcall xianshimain: ;mov r5,#5 ;通过定时器来设定循环扫描读1302中的数据mov tmod,#01h ;用定时器0,方式一工作mov th0,#70h ;为定时器赋初值mov tl0,#00hsetb tr0lp1:jbc tf0,lp2 ;定时器溢出跳到lp2处并将tf0清零;ljmp lp1clr tr0lp2: mov th0,#70hmov tl0,#00hlcall r_ram ;调用读1302子程序lcall xianshi ;调用显示程序setb tr0;djnz r5,lp1;mov r5,#5ljmp lp1 ;构成循环; ljmp mainset1302:clr rstclr clknopnopsetb rst ;为读写做好时序准备mov b,#8eh ;写控制命令字地址lcall w_bit ;调用写字节指令mov b,#00h ;写操作前wp=0 ,数据lcall w_bit ;调用写字节指令setb clknopnopclr rst ;写完后禁止写mov r0,#miao ;内存中的秒首地址set_loop:clr rstclr clknopnopsetb rstmov b,r1 ;写入地址lcall w_bitmov a,@r0 ;写完地址写数据mov hex,alcall hex_bcd ;转换成bcd碼mov b,alcall w_bit ;写数据inc r0 ; 秒,分,时,日,月,年,星期inc r1inc r1 ;改变地址指针setb clkclr rstdjnz r7,set_loop ;循环写入7个数据clr rstclr clknopnopsetb rstmov b,#8eh ;写控制命令字地址lcall w_bitmov b,#80h ;wp=1,写保护lcall w_bitsetb clkclr rstret;*******写一个字的节子程序*************************** w_bit: mov r2,#08hw_loop: mov a,brrc amov b,amov dio,c ;sclk上升沿时写入数据setb clknopnopclr clkdjnz r2,w_loopr_bit: ; clr a; clr cmov r4,#08hr_loop: mov c,dio ;之前的下降沿已读出的数据赋予c rrc asetb clk ;上升沿,没用到nopnopclr clk ;下降沿读出djnz r4,r_loop ;循环读8次ret;**********读ram中的数据*************************r_ram: mov r0,#miaomov r1,#81hmov r7,#7rm_loop:clr rstclr clknopnopsetb rstmov b,r1lcall w_bit ;写入地址lcall r_bit ;读出相应地址中的时间mov @r0,a ;读出的时间数据保存在内存中inc r0inc r1inc r1setb clk;nop;nopclr rstdjnz r7,rm_loopretxianshi:;************显示固定符号data,time,: ,—等********************mov p0,#080h ;写地址lcall wr_codemov a,#'d' ;写数据lcall wr_datamov a,#'a'lcall wr_datamov p0,#082hlcall wr_codemov a,#'t'lcall wr_datamov p0,#083hlcall wr_codemov a,#'a'lcall wr_data ;以上显示datamov p0,#0c0hlcall wr_codemov a,#74hlcall wr_datamov p0,#0c1hlcall wr_codemov a,#69hlcall wr_datamov p0,#0c2hlcall wr_codemov a,#6dhlcall wr_datamov p0,#0c3hlcall wr_codemov a,#65hlcall wr_data ;以上显示timemov p0,#84hlcall wr_codemov a,#3ahlcall wr_datamov p0,#0c4hlcall wr_codemov a,#3ahlcall wr_datamov p0,#0c7hlcall wr_codemov a,#3ahlcall wr_datamov p0,#0cahlcall wr_codemov a,#3ahmov a,#2dhlcall wr_datamov p0,#08chlcall wr_codemov a,#2dhlcall wr_data ;以上显示—;***********以下显示:年,月,日等******************** mov p0,#085hlcall wr_codemov a,#32hlcall wr_datamov p0,#086hlcall wr_codemov a,#30hlcall wr_data ;以上是固定数据20mov bcd,nianlcall bcd_decmov p0,#087hlcall wr_codemov dptr,#tab;mov a,hexhlcall WRITE1mov p0,#088hlcall wr_codemov dptr,#tabmov a,blcall WRITE1 ;以上显示年mov bcd,yuelcall bcd_decmov p0,#08ahlcall wr_codemov dptr,#tab;mov a,bcdhlcall WRITE1mov p0,#08bhlcall wr_codemov dptr,#tabmov a,blcall WRITE1 ;以上显示月mov dptr,#tab;mov a,bcdhlcall WRITE1mov p0,#08ehlcall wr_codemov dptr,#tabmov a,blcall WRITE1 ;以上显示日mov bcd,shilcall bcd_decmov p0,#0c5hlcall wr_codemov dptr,#tab;mov a,bcdhlcall WRITE1mov p0,#0c6hlcall wr_codemov dptr,#tabmov a,blcall WRITE1 ;以上显示时mov bcd,fenlcall bcd_decmov p0,#0c8hlcall wr_codemov dptr,#tab;mov a,bcdhlcall WRITE1mov p0,#0c9hlcall wr_codemov dptr,#tabmov a,blcall WRITE1 ;以上显示分mov bcd,miao ;秒数值赋给bcd lcall bcd_decmov p0,#0cbhlcall wr_codemov dptr,#tablcall WRITE1mov p0,#0cchlcall wr_codelcall WRITE1 ;以上显示秒ret;*********************************************************************** ; 读取数据表并将数据写入子程序;*********************************************************************** WRITE1:MOVC A,@A+DPTR ;查表LCALL WR_DATARET;*********************************************************************** ; 写数据子程序;*********************************************************************** WR_DATA:MOV P0,ASETB RS ;RS=1CLR RW ;RW=0 ;准备写入数据CLR E ;E=0 ;执行显示命令LCALL BUSY ;判断液晶模块是否忙?SETB E ;E=1 ;显示完成,程序停车RET;*********************************************************************** ; 写命令子程序;*********************************************************************** WR_CODE:CLR RS ;写入控制命令的子程序CLR RWCLR ELCALL BUSYSETB ERET;*********************************************************************** ; 判断忙碌子程序;*********************************************************************** BUSY:MOV P0,#0FFH ;判断液晶显示器是否忙的子程序CLR RSSETB RWCLR ENOPSETB EJB P0.7,BUSY ;如果P1.7为高电平表示忙就循环等待RET;****************** HEX转BCD碼****************************da aret;***************BCD碼转dec*********************************bcd_dec:mov a,bcdmov b,#16div ab ;a中放置十位,b中放置个位; swap a; add a,bretTAB:DB 30h,31h,32h,33h,34h,35h,36h,37h,38h,39h ;0到9END当我被上帝造出来时,上帝问我想在人间当一个怎样的人,我不假思索的说,我要做一个伟大的世人皆知的人。
PIC单片机读写时钟芯片DS1302汇编程序

DECFSZ COUNT1,F
GOTO TR1
BANK1
BCF TRISC,7 ;OUTPUT
BANK0
BCF SCLK ;恢复
RETURN
NOP
PORT_INI
BANK1
MOVLW B'00000000'
MOVWF TRISC
MOVLW B'0'
MOVWF TRISB
MOVLW B'00000111'
MOVWF ADCON1
MOVLW B'00000000'
MOVWF TRISA
BANK0
MOVLW 18H
MOVWF 20H
MOVLW 19H
MOVWF 21H
MOVLW 05H
MOVWF 22H
MOVLW 13H
MOVWF 23H
; 作用:一次接受7个字节的时间数据,突发模式读取
; INPUT:NONE
; OUTPUT:把7个时间数据保存在TIME_RX_ADD开始的7个寄存器里面
;***********************************************
GET_TIME
MOVLW B'10111111'
读秒,可以读任意7个时间,单字节
MOVLW B'10000001'
MOVWF TIME_TX
BSF RST
CALL TIME_WRITE_1
CALL TIME_READ_1
BCF RST
GOTO $
DS1302和51单片机设计电子钟数码管显示

DS1302和51单片机设计电子钟数码管显示2010-09-03 10:39DS1302和51单片机设计电子钟数码管显示(未作出防真)#include<reg51.h>#define uchar unsigned char#define uint unsigned intuchar dis[16]={0,0,0,0,10,10,0,0,7,2,9,0,9,0,0,2};uchar P2_scan[4]={0xf7,0xfb,0xfd,0xfe}; //位选择显示扫描ucharP0_scan[11]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff}; //数字显示不带小数点ucharP0_scan1[11]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10,0x7f} ;//数字显示带小数点char clock[7]={4,0,15,10,27,9,9};uchar tiao,m=0,n=8,S;bit time=0,p=0;sbit CLK = P1^0;sbit IO = P1^1;sbit RST = P1^2;sbit P32 = P3^2;sbit P33 = P3^3;sbit P34 = P3^4;sbit P35 = P3^5;/**************************** 延时函数 **************************/ void delay(uchar time)//延时0.1ms{uchar i,j;do{for(i=0;i<10;i++)for(j=0;j<20;j++);time--;}while (time>0);}/***************************** 复位函数******************************/void reset(){CLK = 0;RST = 0;RST = 1;}/****************************** 字节写入函数***************************/void wbyte(uchar W_Byte){uchar i;for(i =0;i<8;++i){IO=0;if(W_Byte&0x01)IO=1;CLK=0;CLK=1; //一次上升沿写一位,zwj注 W_Byte>>=1;}}/****************************** 字节读取函数****************************/uchar rbyte(){uchar i;uchar R_Byte;uchar TmpByte;R_Byte=0x00;IO=1;for(i=0;i<8;++i){CLK=1;CLK=0;TmpByte=(uchar)IO; //读IO口TmpByte<<=7;R_Byte>>=1 ;R_Byte|=TmpByte;}return R_Byte;}/**************************** DS1302初始化函数**************************/void initialize_DS1302(void){reset();wbyte(0x8e); // 写保护控制寄存器wbyte(0); // 允许写入reset();wbyte(0x90); // 涓流充电控制寄存器wbyte(0xab); // 允许充电, 双二极管, 8K 电阻reset();wbyte(0xbe); // 以多字节突发方式写入时钟数据(8个字节)wbyte(clock[1]); //秒wbyte(clock[2]); //分wbyte(clock[3]); //时wbyte(clock[4]); //日wbyte(clock[5]); //月wbyte(clock[0]); //星期wbyte(clock[6]); //年wbyte(0x00); // 以多字节突发方式写入时钟数据时,必须对写保护控制寄存器写入0值reset();}/**************************** 显示函数 **************************/ void scan(void)//显示函数{uchar k;for (k=0;k<4;k++){if(S>4) P0=~P0_scan[dis[k+S]];else P0=~P0_scan[dis[k+S]];P2=P2_scan[k];delay(5);P0=0x00;P2=0xff;}}/**************************** BCD-非BCD **************************/ void transform(void){uchar k;for(k=0;k<7;++k){clock[k]=(((clock[k] >> 4) * 10) + (clock[k] & 0xf));}}/**************************** 非BCD-BCD **************************/ void transform_1(void){uchar k;for(k=0;k<7;++k){clock[k]=(((clock[k] / 10) << 4) | (clock[k] % 10));}}/**************************** 定时器中断0 **************************/ void timer0(void) interrupt 1{TR0=0 ;if(p==0){reset();wbyte(0xbf); // 以多字节突发方式从DS1302读取时钟数据 clock[1] = rbyte(); // 秒clock[2] = rbyte(); // 分clock[3] = rbyte(); // 小时clock[4] = rbyte(); // 日期clock[5] = rbyte(); // 月份clock[0] = rbyte(); // 星期此程序不用clock[6] = rbyte(); // 年reset();transform();}dis[0]=clock[1]%10;dis[1]=clock[1]/10;dis[2]=clock[2]%10;dis[3]=clock[2]/10;dis[6]=clock[3]%10;dis[7]=clock[3]/10;dis[8]=clock[4]%10;dis[9]=clock[4]/10;dis[10]=clock[5]%10;dis[11]=clock[5]/10;dis[12]=clock[6]%10;dis[13]=clock[6]/10;scan();TH0=0xff ; TL0=0x38 ; TR0=1 ;}/**************************** 主函数 **************************/void main(void){TMOD=0x01 ; TH0=0xff ; TL0=0x38 ; ET0=1 ; EA=1 ; transform_1();initialize_DS1302();TR0=1 ;while(1){if(!P32) //K0键被按下{delay(1); //按键消抖if(!P32){S+=4;if(S == 16) S = 0;while(!P32); //等待按键弹起delay(1);}}}}。
8051单片机DS1302程序思路及详细代码

/****************************************************************************** 程序功能:这个程序仅仅是 51 单片机对 1302 编程的思路 作为参考 ******************************************************************************/ #include <reg52.h> #include <intrins.h> #define uchar unsigned char #define uint unsigned int sbit sck = P1^0; sbit io = P1^1; sbit rst = P3^6; uchar time_data[7] = {10,6,4,17,11,58,30};//年周月日时分秒 uchar write_add[7] = {0x8c,0x8a,0x88,0x86,0x84,0x82,0x80}; uchar read_add[7] = {0x8d,0x8b,0x89,0x87,0x85,0x83,0x81}; uchar disp[8]; void write_ds1302_byte(uchar dat); void write_ds1302(uchar add,uchar dat); uchar read_ds1302(uchar add); void set_rtc(void); void read_rtc(void); void time_pros(void); void display(void); /****************************************************************************** 延时函数 ******************************************************************************/ void delay_50us(uint t) { uchar j; for(;t > 0;t --) for(); }
DS1302原理及程序说明

DS1302原理及程序说明DS1302 是DALLAS 公司推出的涓流充电时钟芯片,内含有一个实时时钟/日历和31字节静态RAM ,通过简单的串行接口与单片机进行通信。
实时时钟/日历电路提供秒、分、时、日、日期、月、年的信息,每月的天数和闰年的天数可自动调整,时钟操作可通过AM/PM 指示决定采用24 或12 小时格式。
DS1302 与单片机之间能简单地采用同步串行的方式进行,DS1302的引脚命名如图1-1所示。
通信仅需用到三根信号线:(1)CE 片选,(2)I/O 数据线,(3)SCLK 串行时钟,DS1302与CPU 的连接如图1-2所示。
时钟/RAM 的读/写数据以一个字节或多字节的字符组方式通信,DS1302工作时功耗很低,保持数据和时钟信息时功率小于1mW 。
DS1302具有双电源管脚,用于主电源和备份电源供应Vcc1,为可编程涓流充电电源附加七个字节存储器,它广泛应用于电话传真便携式仪器以及电池供电的仪器仪表等产品领域。
DS1302主要的性能指标如下:实时时钟具有能计算2100 年之前的秒、分、时、日、日期、星期、月、年的能力,还有闰年调整的能力31× 8 位暂存数据存储RAM 串行I/O 口方式,使得管脚数量最少宽范围工作电压2.0~ 5.5V工作电流2.0V 时,小于300nA读/写时钟或RAM 数据时有两种传送方式:单字节传送和多字节传送字符组方式8 脚DIP 封装或可选的8 脚SOIC 封装根据表面装配简单3 线接口与TTL 兼容Vcc=5V 。
DS1302的读写模式工作时序如图1-3和图1-4所示。
图1-3 单字节读模式图1-4 单字节写模式注:在多字节模式下,SCLK 发出同步脉冲,CS 须持续保持高电平直到多字节操作结束,图1-1 DS1302引脚图1-2 DS1302与CPU 接口DS1302内部寄存器的地址定义如表1-1所示。
表1-1 寄存器的地址及定义实验说明1. DS1302与51单片机的连接IO ——P2.7:串行数据输入/输出引脚SCLK ——P2.6:串行时钟引脚CE ——P2.4:片选CE2. LCD 与单片机连接;************************************************************************* ; LCD Module LMB1602 与单片机连接:;************************************************************************* ; 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 ;Vss Vdd V o RS R/W E D0 D1 D2 D3 D4 D5 D6 D7 BLA BLK ; 0V +5V 0V P32 P33 P34 ---------------- P1[0..7] ---------------- +5V 0V;*************************************************************************3. LCD 显示功能说明LCD1602显示格式如图1-5所示。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
DS1302汇编程序,51单片机汇编程序,仅需修改引脚定义即可。
晶振大小12M,程序测试完全正确。
;端口引脚定义区
SCLK BIT P3.6 ;1302时钟线
IO BIT P3.4 ;1302数据线
RST BIT P3.5 ;1302复位线
;变量声明区
ALL_FLAG EQU 20H ;标志位
SEC EQU 32H ;秒
MIN EQU 33H ;分
HOUR EQU 34H ;时
DAY EQU 35H ;日
MON EQU 36H ;月
WEEK EQU 37H ;星期
YEAR EQU 38H ;年
DS_DAT EQU 39H
DS_ADD EQU 3AH
DS_DATA EQU 3BH
/*****************************************
延时函数,延时时间为DELAYED*0.5毫秒0~100毫秒的延时
*****************************************/
DELAY_MS:
MOV R7,DELAYED
D1: MOV R6,#0F8H
D2: DJNZ R6,D2
DJNZ R7,D1
RET
/*****************************************
延时函数,延时时间为DELAYED*2微秒0~500微秒的延时
*****************************************/
DELAY_US:
MOV R7,A
DU1:
DJNZ R7,DU1
RET
/***************************************** DS1302写字节函数
*****************************************/ DS_W_BYTE:
MOV R0,#08
MOV A,DS_DAT
DS_W1:
RRC A
MOV IO,C
CLR SCLK
NOP
SETB S CLK
DJNZ R0,DS_W1
RET
/***************************************** DS1302读字节函数
*****************************************/ DS_R_BYTE:
SETB I O
MOV A,#00H
MOV R0,#08
CLR SCLK
DS_R1:
MOV C,IO
RRC A
SETB S CLK
NOP
CLR SCLK
DJNZ R0,DS_R1
MOV DS_DAT,A
RET
/***************************************** DS1302读数据函数
入口地址存至DS_ADD;读取到的数据存入DS_DAT *****************************************/ DS_R_DAT:
CLR RST
NOP
CLR SCLK
NOP
SETB R ST
NOP
LCALL DS_W_BYTE
LCALL DS_R_BYTE
SETB S CLK
CLR RST
RET
/***************************************** DS1302写数据函数
入口地址DS_ADD,入口数据DS_DATA
*****************************************/ DS_W_DAT:
CLR RST
NOP
CLR SCLK
NOP
SETB R ST
NOP
MOV DS_DAT,DS_ADD
LCALL DS_W_BYTE
MOV DS_DAT,DS_DATA
LCALL DS_W_BYTE
MOV DS_DAT,A
SETB S CLK
CLR RST
RET
/***************************************** DS1302读时间函数
入口地址DS_ADD,
*****************************************/ DS_R_TIME:
MOV DS_ADD,#81H
LCALL DS_R_DAT
MOV SEC,DS_DAT
MOV DS_ADD,#83H
LCALL DS_R_DAT
MOV MIN,DS_DAT
MOV DS_ADD,#85H
LCALL DS_R_DAT
MOV HOUR,DS_DAT
MOV DS_ADD,#87H
LCALL DS_R_DAT
MOV DAY,DS_DAT
MOV DS_ADD,#89H
LCALL DS_R_DAT
MOV DS_ADD,#8BH
LCALL DS_R_DAT
MOV WEEK,DS_DAT
MOV DS_ADD,#8DH
LCALL DS_R_DAT
MOV YEAR,DS_DAT
RET
/*****************************************
DS1302写时间函数
入口地址DS_ADD,入口数据
*****************************************/
DS_W_TIME:
CLR RST
CLR SCLK
MOV DS_ADD,#8EH ;语序写
MOV DS_DATA,#00H
LCALL DS_W_DAT
MOV DS_ADD,#80H
MOV DS_DATA,SEC
LCALL DS_W_DAT
MOV DS_ADD,#82H
MOV DS_DATA,MIN
LCALL DS_W_DAT
MOV DS_ADD,#84H
MOV DS_DATA,HOUR
LCALL DS_W_DAT
MOV DS_ADD,#86H
MOV DS_DATA,DAY
LCALL DS_W_DAT
MOV DS_ADD,#88H
MOV DS_DATA,MON
LCALL DS_W_DAT
MOV DS_ADD,#8AH
MOV DS_DATA,WEEK
LCALL DS_W_DAT
MOV DS_ADD,#8CH
MOV DS_DATA,YEAR
LCALL DS_W_DAT
MOV DS_ADD,#8EH ;写保护
MOV DS_DATA,#80H
LCALL DS_W_DAT
RET
/*****************************************
DS1302初始化
*****************************************/
DS_INIT:
CLR RST
CLR SCLK
MOV DS_ADD,#8EH ;允许写
MOV DS_DATA,#00H
LCALL DS_W_DAT
MOV DS_ADD,#80H
MOV DS_DATA,#00H
LCALL DS_W_DAT
MOV DS_ADD,#90H
MOV DS_DATA,#0A6H
LCALL DS_W_DAT
MOV DS_ADD,#8EH ;写保护
MOV DS_DATA,#80H
LCALL DS_W_DAT
RET。