ds1302时序怎么写

1.如何利用ds1302的时序图来编写汇编语言:

给你当参考..;************** DS1302 端口位定义 ************** IO_DATA BIT P1.1 ; 数据传送总线 SCLK BIT P1.0 ; 时钟控制总线 RST BIT P1.2 ; 复位总线;--------------------------------------------;DS1302 初始化子程序; (R0)=数据 (R1)=地址;--------------------------------------------PROSET: CLR RST ;DS1302复位 CLR SCLK NOP NOP SETB RST MOV R1,#90H ;写充电寄存器 MOV R0,#0ABH LCALL WRITE RET;================================================;写 DS1302 子程序;================================================WRITE: CLR SCLK NOP NOP SETB RST NOP MOV A,R1 MOV R2,#08HWRI_01: RRC A ;传输地址到DS1302 NOP NOP CLR SCLK NOP NOP MOV IO_DATA,C NOP NOP SETB SCLK NOP NOP DJNZ R2,WRI_01 CLR SCLK NOP NOP MOV A,R0 MOV R2,#08HWRI_02: RRC A ;传输数据到DS1302 NOP CLR SCLK NOP NOP MOV IO_DATA,C NOP NOP SETB SCLK NOP NOP DJNZ R2,WRI_02 CLR SCLK NOP NOP CLR RST NOP NOP RET;=================================================;读 DS1302 子程序;=================================================READ: CLR SCLK NOP NOP SETB RST NOP NOP MOV A,R1 MOV R2,#08HREAD_01: RRC A NOP ;先传输地址到DS1302 MOV IO_DATA,C NOP NOP SETB SCLK NOP NOP CLR SCLK NOP NOP DJNZ R2,READ_01 NOP NOP SETB IO_DATA CLR A CLR C MOV R2,#08HREAD_02: CLR SCLK NOP NOP MOV C,IO_DATA NOP NOP RRC A ;再从DS1302接收数据 NOP NOP SETB SCLK NOP NOP DJNZ R2,READ_02 MOV R0,A CLR RST RET;===============================================;读时间、日期数据子程序;存放单元 40H - 46H;===============================================GET_TIME: MOV R1,#81H ;读秒 LCALL READ MOV 40H,R0 MOV R1,#83H ;读分 LCALL READ MOV 41H,R0 MOV R1,#85H ;读时 LCALL READ MOV 42H,R0 MOV R1,#87H ;读出日期 LCALL READ MOV 43H,R0 MOV R1,#89H ;读出月份 LCALL READ MOV 44H,R0 MOV R1,#8BH ;读出星期 LCALL READ MOV 46H,R0 MOV R1,#8DH ;读出年 LCALL READ MOV 45H,R0 RET。

2.如何利用ds1302的时序图来编写汇编语言:

给你当参考..;************** DS1302 端口位定义 ************** IO_DATA BIT P1.1 ; 数据传送总线 SCLK BIT P1.0 ; 时钟控制总线 RST BIT P1.2 ; 复位总线;--------------------------------------------;DS1302 初始化子程序; (R0)=数据 (R1)=地址;--------------------------------------------PROSET: CLR RST ;DS1302复位 CLR SCLK NOP NOP SETB RST MOV R1,#90H ;写充电寄存器 MOV R0,#0ABH LCALL WRITE RET;================================================;写 DS1302 子程序;================================================WRITE: CLR SCLK NOP NOP SETB RST NOP MOV A,R1 MOV R2,#08HWRI_01: RRC A ;传输地址到DS1302 NOP NOP CLR SCLK NOP NOP MOV IO_DATA,C NOP NOP SETB SCLK NOP NOP DJNZ R2,WRI_01 CLR SCLK NOP NOP MOV A,R0 MOV R2,#08HWRI_02: RRC A ;传输数据到DS1302 NOP CLR SCLK NOP NOP MOV IO_DATA,C NOP NOP SETB SCLK NOP NOP DJNZ R2,WRI_02 CLR SCLK NOP NOP CLR RST NOP NOP RET;=================================================;读 DS1302 子程序;=================================================READ: CLR SCLK NOP NOP SETB RST NOP NOP MOV A,R1 MOV R2,#08HREAD_01: RRC A NOP ;先传输地址到DS1302 MOV IO_DATA,C NOP NOP SETB SCLK NOP NOP CLR SCLK NOP NOP DJNZ R2,READ_01 NOP NOP SETB IO_DATA CLR A CLR C MOV R2,#08HREAD_02: CLR SCLK NOP NOP MOV C,IO_DATA NOP NOP RRC A ;再从DS1302接收数据 NOP NOP SETB SCLK NOP NOP DJNZ R2,READ_02 MOV R0,A CLR RST RET;===============================================;读时间、日期数据子程序;存放单元 40H - 46H;===============================================GET_TIME: MOV R1,#81H ;读秒 LCALL READ MOV 40H,R0 MOV R1,#83H ;读分 LCALL READ MOV 41H,R0 MOV R1,#85H ;读时 LCALL READ MOV 42H,R0 MOV R1,#87H ;读出日期 LCALL READ MOV 43H,R0 MOV R1,#89H ;读出月份 LCALL READ MOV 44H,R0 MOV R1,#8BH ;读出星期 LCALL READ MOV 46H,R0 MOV R1,#8DH ;读出年 LCALL READ MOV 45H,R0 RET。

3.怎么读时钟芯片DS1302的时间

说明p1.2是用了非门按制RST脚,所以SETBP1.2;令=0

DS_READSETBP1.2;令=0。

CLRP1.1;令SCLK=0。

CLRP1.2;令=1,启动芯片。

LCALLDS_WSUB;写8位地址。

LCALLDS_RSUB;读出8位数据。

RET

DS_WSUBMOVR7,#08H

WL00PRRCA;A为地址字节。

MOVP1.0,C

SETBP1.1;在时钟上升沿

NOP;输入地址字节。

CLRP1.1

DJNZR7WL00P

RET

DS_RSUBSETBP1.0;为读数据作准备。

MOVR7#08H

RL00P:SETBP1.1

NOP

CLRP1.1;在第9个正脉冲的下

MOVC,P1.0;降沿开始输出数据。

RRCA;A中为读出的数据。

DJNZR7,RL00P

RET

若使用如下程序对DSl302的RAM1其内容为5AH 进行读操作

READ:MOVA#11000101B;RAM1单元的读地址。

LCAllDS_READ;调用读子程序。

则程序执行后A中的数据为2DH,显然读出的数据不正确。若再使用一条RLA指令调整后,则A中为5AH,结果才正确。由此说明:使用上述程序读出的RAM1单元中的第0位数据实为第1位数据,读出的第7位数据实为第0位数据。

经笔者仔细研究时序图和多次试验得知,问题的原因在于:对于读操作时序,在SCLK出现第8个正脉冲时,上升沿输入地址字节的最后一位数据,而在此正脉冲的下降沿就要输出数据字节的第0位数据。然而笔者的程序中是在第9个正脉冲的下降沿才误认为输出了数据字节的第0位数据,此位数据事实上是第二个下降沿输出的,故实为数据字节的第1位数据。经笔者实验:只要RST保持为高电平,如果超过8个下降沿,它们将重新从第0位输出数据位,因程序中输出的最后一位数据位,是9个下降沿输出的数据位,故实为数据字节的第0位数据位。

由此可见,单字节读操作的时序图如改为图2所示时序图,则读者较容易理解可避免发生上述编程错误。

只要将上述的DS_RSUB子程序改为如下的子程序即可解决上述问题:

DS_RSUBl:SETBP1.0;为读数据作准备

MOVR7,#08H

RL00P:CLRP1.1;SCLK第8个正脉冲的

MOVC,P1.0;下降沿开始输出数据。

RAC

SETBP1.1

DJNZR7,RL00P

RET

4.如何读出DS1302里面的时钟数据

一个例子 重点看DS1302_Read() #include #include #define uchar unsigned char #define uint unsigned int #define SECOND 0x81 #define MINUTE 0x83 #define HOUR 0x85 sbit rs=P2^0; sbit rw=P2^1; sbit ep=P2^2; sbit DS1302_SCLK = P1^0; sbit DS1302_IO= P1^1; sbit DS1302_RST = P1^2; sbit M=P3^2; sbit U=P3^3; sbit D=P3^4; unsigned char sel=0; uchar code DIS1[]={“abcdef"}; uchar code DIS2[]={"abcdef"}; /////////////////////////延时//////////////////////////////// void delay(uint ms) { unsigned int a,b; for(a=0;a>1; } } //////////////////////////////////////////////////////////// uchar DS1302_Read() { uchar TempDat=0,i; for(i=0;i<8;i++) { TempDat>>=1; if(DS1302_IO) TempDat=TempDat|0x80; DS1302_SCLK=1; DS1302_SCLK=0; } return TempDat; } //////////////////////////////////////////////////////////// void WDS1302(uchar ucAddr, uchar ucDat) { DS1302_RST = 0; DS1302_SCLK = 0; DS1302_RST = 1; DS1302_Write(ucAddr); DS1302_Write(ucDat); DS1302_SCLK = 1; DS1302_RST = 0; } //////////////////////////////////////////////////////////// uchar RDS1302(uchar ucAddr) { uchar ucDat; DS1302_RST = 0; DS1302_SCLK = 0; DS1302_RST = 1; DS1302_Write(ucAddr); ucDat=DS1302_Read(); DS1302_SCLK = 1; DS1302_RST = 0; return ucDat; } ////////////////////////////////////////////////////////// void init_1302() { WDS1302(0x8e,0x00);//开保护寄存器 WDS1302(0x80,0x55);//秒 WDS1302(0x82,0x59);//分 WDS1302(0x84,0x23);//时 WDS1302(0x8A,0x07);//星期 WDS1302(0x86,0x02);//日 WDS1302(0x88,0x08);//月 WDS1302(0x8C,0x09);//年 WDS1302(0x90,0xab);//卷电流充电 WDS1302(0x8e,0x80);//关保护寄存器 } ////////////////////////////////////////////////////////// /************************1602驱动************************/ ////////////////////////////////////////////////////////// bit lcd_bz() { bit result; rs = 0; rw = 1; ep = 1; _nop_(); _nop_(); _nop_(); _nop_(); result = (bit)(P0 & 0x80); ep = 0; return result; } //////////////////////////////////////////////////////// void lcd_wcmd(unsigned char cmd) { while(lcd_bz()); rs = 0; rw = 0; ep = 0; _nop_(); _nop_(); P0 = cmd; _nop_(); _nop_(); _nop_(); _nop_(); ep = 1; _nop_(); _nop_(); _nop_(); _nop_(); ep= 0; } ///////////////////////////////////////////////////////// void lcd_pos(unsigned char pos) { lcd_wcmd(pos | 0x80); } ///////////////////////////////////////////////////////// void lcd_wdat(unsigned char dat) { while(lcd_bz()); rs = 1; rw = 0; ep = 0; P0 = dat; _nop_(); _nop_(); _nop_(); _nop_(); ep = 1; _nop_(); _nop_(); _nop_(); _nop_(); ep = 0; } ////////////////////////////////////////////////////////// void lcd_init() { lcd_wcmd(0x38); delay(1); lcd_wcmd(0x0c); delay(1); lcd_wcmd(0x06); delay(1); lcd_wcmd(0x01); delay(1); } ///////////////////////////////////////////////////////// /*********************调时函数*************************/ ///////////////////////////////////////////////////////// void set_time() { signed char address,item; signed char max,mini; if(M==0) { sel++; delay(300); if(sel==6) sel=0; if(sel==2) {address=0x82; max=59;mini=0; } if(sel==1) {address=0x84; max=23;mini=0; } if(sel==3) {address=0x8c; max=99;mini=9;} if(sel==4) {address=0x88; max=12;mini=1; } if(sel==5) {address=0x86; max=31;mini=1; } M=1; } item=((RDS1302(address+1))/16)*10 + (RDS1302(address+1))%16; if(U == 0) { delay(200); U=1; item++; } if(D == 0) { delay(200); D=1; item--; } if(item>max) item=mini; if(item>4; lcdshow_u(6,0x30+x); y=y&0x0f; lcdshow_u(7,0x30+y); lcdshow_u(8,':'); x=RDS1302(MINUTE); y=x; x=x>>4; lcdshow_u(9,0x30+x); y=y&0x0f; lcdshow_u(0x0a,0x30+y); lcdshow_u(0x0b,':'); x=RDS1302(SECOND); y=x; x=x>>4; lcdshow_u(0x0c,0x30+x); y=y&0x0f; lcdshow_u(0x0d,0x30+y); x=RDS1302(0x8d); y=x; x=x>>4; lcdshow_d(8,0x30+x); y=y&0x0f; lcdshow_d(9,0x30+y); lcdshow_d(0x0a,'-'); x=RDS1302(0x89); y=x; x=x>>4; lcdshow_d(0x0b,0x30+x); y=y&0x0f; lcdshow_d(0。

5.时钟芯片DS1302功能及具体介绍

摘 要:介绍美国DALLAS公司推出的具有涓细电流充电能力的低功耗实时时钟电路DS1302的结构、工作原理及其在实时显示时间中的应用。

它可以对年、月、日、周日、时、分、秒进行计时,且具有闰年补偿等多种功能。给出DS1302在读写中的C51程序及流程图,以及在调试过程中的注意事项。

关键词:时钟电路;实时时钟;单片机;应用 1 引言 现在流行的串行时钟电路很多,如DS1302、DS1307、PCF8485等。这些电路的接口简单、价格低廉、使用方便,被广泛地采用。

本文介绍的实时时钟电路DS1302是DALLAS公司的一种具有涓细电流充电能力的电路,主要特点是采用串行数据传输,可为掉电保护电源提供可编程的充电功能,并且可以关闭充电功能。采用普通32.768kHz晶振。

2 DS1302的结构及工作原理 DS1302 是美国DALLAS公司推出的一种高性能、低功耗、带RAM的实时时钟电路,它可以对年、月、日、周日、时、分、秒进行计时,具有闰年补偿功能,工作电压为2.5V~5.5V。采用三线接口与CPU进行同步通信,并可采用突发方式一次传送多个字节的时钟信号或RAM数据。

DS1302内部有一个31*8的用于临时性存放数据的RAM寄存器。DS1302是DS1202的升级产品,与DS1202兼容,但增加了主电源/后背电源双电源引脚,同时提供了对后背电源进行涓细电流充电的能力。

2.1 引脚功能及结构 图1示出DS1302的引脚排列,其中Vcc1为后备电源,VCC2为主电源。在主电源关闭的情况下,也能保持时钟的连续运行。

DS1302由Vcc1或Vcc2两者中的较大者供电。当Vcc2大于Vcc1+0.2V时,Vcc2给DS1302供电。

当Vcc2小于Vcc1时,DS1302由Vcc1供电。X1和X2是振荡源,外接32.768kHz晶振。

RST是复位/片选线,通过把RST输入驱动置高电平来启动所有的数据传送。RST输入有两种功能:首先,RST接通控制逻辑,允许地址/命令序列送入移位寄存器;其次,RST提供终止单字节或多字节数据的传送手段。

当RST为高电平时,所有的数据传送被初始化,允许对DS1302进行操作。如果在传送过程中RST置为低电平,则会终止此次数据传送,I/O引脚变为高阻态。

上电运行时,在Vcc≥2.5V之前,RST必须保持低电平。只有在SCLK为低电平时,才能将RST置为高电平。

I/O为串行数据输入输出端(双向),后面有详细说明。SCLK始终是输入端。

2.2 DS1302的控制字节 DS1302 的控制字如图2所示。控制字节的最高有效位(位7)必须是逻辑1,如果它为0,则不能把数据写入DS1302中,位6如果为0,则表示存取日历时钟数据,为1表示存取RAM数据;位5至位1指示操作单元的地址;最低有效位(位0)如为0表示要进行写操作,为1表示进行读操作,控制字节总是从最低位开始输出。

2.3 数据输入输出(I/O) 在控制指令字输入后的下一个SCLK时钟的上升沿时,数据被写入DS1302,数据输入从低位即位0开始。同样,在紧跟8位的控制指令字后的下一个SCLK脉冲的下降沿读出DS1302的数据,读出数据时从低位0位到高位7。

2.4 DS1302的寄存器 DS1302有12个寄存器,其中有7个寄存器与日历、时钟相关,存放的数据位为BCD码形式,其日历、时间寄存器及其控制字见表1。 此外,DS1302 还有年份寄存器、控制寄存器、充电寄存器、时钟突发寄存器及与RAM相关的寄存器等。

时钟突发寄存器可一次性顺序读写除充电寄存器外的所有寄存器内容。 DS1302与RAM相关的寄存器分为两类:一类是单个RAM单元,共31个,每个单元组态为一个8位的字节,其命令控制字为C0H~FDH,其中奇数为读操作,偶数为写操作;另一类为突发方式下的RAM寄存器,此方式下可一次性读写所有的RAM的31个字节,命令控制字为FEH(写)、FFH(读)。

3 DS1302实时显示时间的软硬件 DS1302与CPU的连接需要三条线,即SCLK(7)、I/O(6)、RST(5)。图3示出DS1302与89C2051的连接图,其中,时钟的显示用LCD。

3.1 DS1302与CPU的连接 实际上,在调试程序时可以不加电容器,只加一个32.768kHz 的晶振即可。只是选择晶振时,不同的晶振,误差也较大。

另外,还可以在上面的电路中加入DS18B20,同时显示实时温度。只要占用CPU一个口线即可。

LCD还可以换成LED,还可以使用北京卫信杰科技发展有限公司生产的10位多功能8段液晶显示模块LCM101,内含看门狗(WDT)/时钟发生器及两种频率的蜂鸣器驱动电路,并有内置显示RAM,可显示任意字段笔划,具有3-4线串行接口,可与任何单片机、IC接口。功耗低,显示状态时电流为2μA (典型值),省电模式时小于1μA,工作电压为2.4V~3.3V,显示清晰。

3.2 DS1302实时时间流程 图4示出DS1302的实时时间流程。根据此流程框图,不难采集实时时间。

下面结合流程图对DS1302的基本操作进行编程: 根据本人在调试中遇到的问题,特作如下说明: DS1302 与微处理器进行数据交换时,首先由微处理器向电路发送命令字节,命令字节最高位MSB(D7)必须为逻辑1,如果D7=0,则禁止写DS1302,即写保护;D6=0,指定时钟数据,D6=1,指定RAM数据;D5~D1指定输入或输出的特定寄存器;最低位。

ds1302时序怎么写

转载请注明出处育才学习网 » ds1302时序怎么写

知识

三菱plc比较指令怎么写

阅读(209)

本文主要为您介绍三菱plc比较指令怎么写,内容包括三菱plc中比较指令的具体用法,PLC的比较指令是什么,三菱plc中比较指令的具体用法。三菱plc中比较指令分为CMP和ZCP。CMP的指令代码为FNC10,ZCP的指令代码为FNC11,两者待比较的源操作数[S·]

知识

聚会收费通知怎么写

阅读(399)

本文主要为您介绍聚会收费通知怎么写,内容包括聚会收费通知怎么写,同学聚会通知交费该怎样写,聚会通知怎么写。公司各部门:为了丰富公司员工的娱乐生活,加强公司的文化建设,提高公司凝聚力;公司决定借假期来临之际,组织全体员工集体聚餐活动,现将

知识

css中注释怎么写

阅读(202)

本文主要为您介绍css中注释怎么写,内容包括css的注释怎么写,css中怎样注释,DIV+CSS里有一个注释代码怎么写。HTML注释的格式如下:左尖括号开始,一个感叹号跟两个减号。然后写入注释内容。后面跟两个减号,以右尖括号结束;例如:

知识

丰南电大的全称怎么写

阅读(215)

本文主要为您介绍丰南电大的全称怎么写,内容包括丰南电大校长是谁,丰南电大好不好,电大的全称是什么。中央广播电视大学以及地方各级广播电视大学,简称“电大”原中央广播电视大学现国家开放大学创立于2012年6月21日,中华人民共和国教育部直

知识

长袖衣服英文怎么写

阅读(267)

本文主要为您介绍长袖衣服英文怎么写,内容包括长袖衣服的英文怎么说,长袖衣服的英文怎么说,长袖衣服和短袖衣服用英语怎么说。“长袖衣服”服的英文:caftancaftan读法 英 [kæftən] 美 [kæf,tæn; kæf,tən; kæftæn]n.

知识

box的音标怎么写

阅读(245)

本文主要为您介绍box的音标怎么写,内容包括box的音标怎么写,box的音标怎么写,box的音标。元音和辅音 英语中音素分为元音音素和辅音音素两大类。其中元音音素20个,辅音音素24个。 元音:发音时声带振动,呼出的气流通过口腔时不受

知识

永不言弃俄文怎么写

阅读(275)

本文主要为您介绍永不言弃俄文怎么写,内容包括永不言弃的各种语言翻译,永不言弃用阿拉伯语怎么说,永不言弃用阿拉伯语怎么说。德语:Nie aufgeben英语:never give up俄语:Никогда не сдаваться法语:Ne jamais a

知识

关于四季的单词怎么写

阅读(187)

本文主要为您介绍关于四季的单词怎么写,内容包括关于四季的英语单词,四季的英语单词怎么写,四季的英文,怎么写。春天,秋天,夏天,冬天的单词分别是:Spring,autumn,summer,winterwinter 读法 英 [wɪntə(r)]

知识

捡到什么英文怎么写

阅读(226)

本文主要为您介绍捡到什么英文怎么写,内容包括捡到一个钱包的英文怎么写,捡到一个钱包的英文怎么写,用英语写一段&#39;捡到东西&#39;怎么写。He picked up a passport last year.1- 一楼的句子也是对的,但是单句中,时间副词一般放句末,这样比

知识

collection韩文怎么写

阅读(279)

本文主要为您介绍collection韩文怎么写,内容包括韩文怎么写,可爱韩文怎么写,fullhouse韩文怎么写。的 [de] 字是多音字,所以韩文也要3种解释 과녁-적 부수: 白 1. 정어(定语) 뒤에 쓰여 문법 관계를 나타내는 구조조사(

知识

hardware法语怎么写

阅读(232)

本文主要为您介绍hardware法语怎么写,内容包括”法国”的法语写法怎么写,HardwareInstrucation翻译成法文谢了,详细地址法语怎么写。UE1 : Consolidation des connaissances en Informatique – CCI (65h, co

知识

更热的英文怎么写

阅读(595)

本文主要为您介绍更热的英文怎么写,内容包括更热英语怎么说,更热的英文,更热的英文。hot英文发音:[hɒt]中文释义:adj.温度高的;热的;觉得闷(或燥、湿)热;使人感到热的例句:Dribble the hot mi

知识

森林防火的作文结尾怎么写

阅读(283)

本文主要为您介绍森林防火的作文结尾怎么写,内容包括森林防火作文的开头结尾,森林防火作文的开头结尾,森林防火的作文怎么结尾。你在骂我这个森防员吧?:)现在的“森林”里还哪看的见“许多许多聪明的小动物”哦~小花鼠倒看到过一两只吧--也不

知识

森林公园的作文怎么写

阅读(215)

本文主要为您介绍森林公园的作文怎么写,内容包括暑假去森林公园作文怎么写,该怎样写五百字的介绍森林公园的作文,四年级上册写一篇森林公园的景物怎么写作文。我和爸爸,妈妈一起到森林公园去玩,那里的景色可美丽了!一进公园,就看见有一块石碑,上

知识

时序逻辑电路是由什么组成

阅读(361)

时序逻辑电路由存储电路即各种触发器和组合逻辑电路两部分组成。和其他电路不同,其在任何一个时刻的输出状态由当时的输入信号和电路原来的状态共同决定,而它的状态主要是由存储电路来记忆和表示的。同时时序逻辑电路在结构以及功能上的特

知识

同步时序逻辑电路和异步时序逻辑电路有何不同

阅读(298)

同步时序逻辑电路和异步时序逻辑电路的不同点:1.同步时序逻辑电路状态的变化与时钟脉冲同步;而异步时序电路中没有统一的时钟脉冲,电路的状态随输入号的改变而相应改变。2.同步时序电路中,任一时刻,几个输入变量可以同时变化;而异步时序电路中

知识

什么是时序电路

阅读(215)

时序电路:实施一连串逻辑操作,在任一给定瞬时的输出值取决于其输入值和在该瞬时的内部状态,且其内部状态又取决于紧邻着的前一个输入值和前一个内部状态的器件。时序逻辑电路状态:时序逻辑电路简称时序电路,时序电路是由最基本的逻辑门电路加

[/e:loop]