日历时钟芯片DS1302与MCS-51单片机接口_第1页
日历时钟芯片DS1302与MCS-51单片机接口_第2页
日历时钟芯片DS1302与MCS-51单片机接口_第3页
日历时钟芯片DS1302与MCS-51单片机接口_第4页
日历时钟芯片DS1302与MCS-51单片机接口_第5页
已阅读5页,还剩7页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

日历时钟芯片DS1302与MCS-51单片机接口DS1302是DALLAS公司推出的高性能低功耗涓流充电时钟芯片,可通过简单的串行接口与单片机进行通信,广泛应用于电话传真、便携式仪器及电池供电的仪器仪表等产品领域中。7.3.1DS1302简介DS1302时钟芯片内含有一个实时时钟/日历和31个字节静态RAM,实时时钟/日历能提供2100年之前的秒、分、时、日、日期、月、年等信息,每月的天数和闰年的天数可自动调整,时钟操作可通过AM/PM指示决定采用24小时或12小时格式。内部含有31个字节静态RAM,可提供用户访问。DS1302与单片机之间能简单地采用同步串行的方式进行通信,使得管脚数量最少,与单片机通信只需RES(复位线)、I/O(数据线)和SCLK(串行时钟)三根信号线;对时钟、RAM的读/写,可以采用单字节方式或多达31个字节的字符组方式;工作电压范围宽:2.0~5.5V;与TTL兼容,VCC=5V;温度范围宽,可在-40C~+85C正常工作;采用主电源和备份电源双电源供电,备份电源可由电池或大容量电容实现;DS13027.3.2DS1302引脚功能DS1302可采用8脚DIP封装或SOIC封装,引脚图如图7.15所示。图7.15DS1302的引脚图引脚功能如下。X1、X2:32.768kHz晶振接入引脚。GND:地。:复位引脚,低电平有效。I/O:数据输入/输出引脚,具有三态功能。SCLK:串行时钟输入引脚。VCC1:电源1引脚。VCC2:电源2引脚。在单电源与电池供电的系统中,VCC1提供低电源并提供低功率的备用电源。双电源系统中,VCC2提供主电源,VCC1提供备用电源,以便在没有主电源时能保存时间信息以及数据,DS1302由VCC1和VCC2两者中较大的供电。7.3.3DS1302的寄存器及片内RAMDS1302有一个控制寄存器、12个日历、时钟寄存器和31个RAM。1) 控制寄存器控制寄存器用于存放DS1302的控制命令字,DS1302的引脚回到高电平后写入的第一个字就为控制命令。它用于对DS1302读写过程进行控制,它的格式如下:D7D6D5D4D3D2D1D01A4A3A2A1A0RD/各项功能说明如下。D7:固定为1D6:位,片内RAM或日历、时钟寄存器选择位,当=1时,对片内RAM进行读写,当时,对日历、时钟寄存器进行读写。D5~D1:地址位,用于选择进行读写的日历、时钟寄存器或片内RAM。对日历、时钟寄存器或片内RAM的选择如表7.3所示。表7.3日历、时钟寄存器的选择寄存器名称D7D6D5D4D3D2D1D01A4A3A2A1A0RD/秒寄存器10000000或1分寄存器10000010或1小时寄存器10000100或1日寄存器10000110或1月寄存器10001000或1星期寄存器10001010或1年寄存器10001100或1写保护寄存器10001110或1涓流充电寄存器10010000或1时钟突发模式10111110或1RAM011000000或1110或1RAM3011111100或1RAM突发模式11111110或1D0:读写位,当=1时,对日历、时钟寄存器或片内RAM进行读操作,当=0时,对日历、时钟寄存器或片内RAM进行写操作。2) 日历、时钟寄存器DS1302共有12个寄存器,其中有7个与日历、时钟相关,存放的数据为BCD码形式。日历、时钟寄存器的格式如表7.4所示。

表7.4日历、时钟寄存器的格式寄存器名称取值范围D7D6D5D4D3D2D1D0秒寄存器00~59CH秒的十位秒的个位分寄存器00~590分的十位分的个位小时寄存器01~12或00~2312/240A/PHR小时的个位日寄存器01~3100日的十位日的个位月寄存器01~120001或0月的个位星期寄存器01~070000星期几年寄存器01~99年的十位年的个位写保护寄存器WP0000000涓流充电寄存器TCSTCSTCSTCSDSDSRSRS时钟突发寄存器说明:(1) 数据都以BCD码形式表示。(2) 小时寄存器的D7位为12小时制/24小时制的选择位,当为1时选12小时制,当为0时选24小时制。当12小时制时,D5位为1是上午,D5位为0是下午,D4位为小时的十位。当24小时制时,D5、D4位为小时的十位。(3) 秒寄存器中的CH位为时钟暂停位,当为1时,时钟暂停,为0时,时钟开始启动。(4) 写保护寄存器中的WP为写保护位,当WP=1时,写保护,当WP=0时,未写保护,当对日历、时钟寄存器或片内RAM进行写时,WP应清零,当对日历、时钟寄存器或片内RAM进行读时,WP一般置1。(5) 涓流充电寄存器的TCS位控制涓流充电特性,当它为1010时才能使涓流充电器工作。DS为二极管选择位。DS为01选择一个二极管,DS为10选择两个二极管,DS为11或00充电器被禁止,与TCS无关。RS用于选择连接在VCC2与VCC1之间的电阻,RS为00,充电器被禁止,与TCS无关,电阻选择情况如表7.5所示。表7.5RS对电阻的选择情况表RS位电阻器阻值00无无01R12kΩ10R24kΩ11R38kΩ3)片内RAMDS1302片内有31个RAM单元,对片内RAM的操作有单字节方式和多字节方式两种。当控制命令字为C0H~FDH时为单字节读写方式,命令字中的D5~D1用于选择对应的RAM单元,其中奇数为读操作,偶数为写操作。当控制命令字为FEH、FFH时为多字节操作(表9.5中的RAM突发模式),多字节操作可一次把所有的RAM单元内容进行读写。FEH为写操作,FFH为读操作。4) DS1302的输入/输出过程DS1302通过引脚驱动输入/输出过程,当置高电平启动输入/输出过程,在SCLK时钟的控制下,首先把控制命令字写入DS1302的控制寄存器,其次根据写入的控制命令字,依次读写内部寄存器或片内RAM单元的数据,对于日历、时钟寄存器,根据控制命令字,一次可以读写一个日历、时钟寄存器,也可以一次读写8个字节,对所有的日历、时钟寄存器(表9.5中的时钟突发模式),写的控制命令字为0BEH,读的控制命令字为0BFH;对于片内RAM单元,根据控制命令字,一次可读写一个字节,一次也可读写31个字节。当数据读写完后,变为低电平结束输入/输出过程。无论是命令字还是数据,一个字节传送时都是低位在前,高位在后,每一位的读写发生在时钟的上升沿。7.3.4DS1302与单片机的接口图7.16是DS1302与51单片机的一种接口图,DS1302与51单片机通过3条线连接,DS1302复位线与51单片机的P1.2相连,时钟线SCLK与P1.3相连,数据线I/O与P1.4相连。DS1302的X1和X2接32kHz晶体,VCC2接主电源Vcc,VCC1接备用电源(3V的电池)。为了显示时钟、日历,在电路中加了LCD显示器。图7.16DS1302与51单片机的连接图编制程序,先设定DS1302的日历时间为2011-6-2916:25:30,启动,并通过LCD实时显示日历时间。汇编语言编程:T_RSTBitP1.2 ;DS1302复位线引脚T_CLKBitP1.3 ;DS1302时钟线引脚T_IOBitP1.4 ;DS1302数据线引脚RSBITP1.7 ;LCD1602控制线定义RWBITP1.6EBITP1.5;40h~46h存放"秒、分、时、日、月、星期、年"的初值;格式按寄存器中的格式;30h~3fh存放1302读出的秒、分、时、日、月、星期、年;格式按寄存器中的格式;********************************************* ORG 0000H AJMP MAIN ORG 0030HMAIN:MOVSP,#50H ACALLINIT MOVA,#80H ;写入显示缓冲区起始地址为第1行第1列开始显示DATE: ACALLWC51R MOVA,#'D' ACALLWC51DDR MOVA,#'A' ACALLWC51DDR MOVA,#'T' ACALLWC51DDR MOVA,#'E' ACALLWC51DDR MOVA,#':' ACALLWC51DDR MOVA,#0C0H ;写入显示缓冲区起始地址为第2行第1列开始显示TIME: ACALLWC51R MOVA,#'T' ACALLWC51DDR MOVA,#'I' ACALLWC51DDR MOVA,#'M' ACALLWC51DDR MOVA,#'E' ACALLWC51DDR MOVA,#':' ACALLWC51DDR MOV 40H,#30h ;40h~46h向初值 MOV 41H,#25h MOV 42H,#16h MOV 43H,#29h MOV 44H,#06h MOV 45H,#03 MOV 46H,#11h LCALL SET1302 ;向DS1302写入日期11-06-29,时间16:25:30星期三 REP:LCALL GET1302 MOVA,#86H ;写入显示缓冲区起始地址为第1行第7列开始显示当前日期 ACALLWC51R MOVA,#'2' ACALLWC51DDR MOVA,#'0' ACALLWC51DDR MOV A,36H ;年拆分成十位与个位,转换字符显示 MOV B,#10H DIV AB ADD A,#30H ACALLWC51DDR MOV A,B ADD A,#30H ACALLWC51DDR MOVA,#'-' ACALLWC51DDR MOV A,34H ;月拆分成十位与个位,转换字符显示 MOV B,#10H DIV AB ADD A,#30H ACALLWC51DDR MOV A,B ADD A,#30H ACALLWC51DDR MOVA,#'-' ACALLWC51DDR MOV A,33H ;日拆分成十位与个位,转换字符显示 MOV B,#10H DIV AB ADD A,#30H ACALLWC51DDR MOV A,B ADD A,#30H ACALLWC51DDR MOVA,#0c6H ;写入显示缓冲区起始地址为第2行第7列开始显示当前时间 ACALLWC51R MOV A,32H ;小时拆分成十位与个位,转换字符显示 MOV B,#10H DIV AB ADD A,#30H ACALLWC51DDR MOV A,B ADD A,#30H ACALLWC51DDR MOVA,#':' ACALLWC51DDR MOV A,31H ;分拆分成十位与个位,转换字符显示 MOV B,#10H DIV AB ADD A,#30H ACALLWC51DDR MOV A,B ADD A,#30H ACALLWC51DDR MOVA,#':' ACALLWC51DDR MOV A,30H ;秒拆分成十位与个位,转换字符显示 MOV B,#10H DIV AB ADD A,#30H ACALLWC51DDR MOV A,B ADD A,#30H ACALLWC51DDR MOVA,#'' ACALLWC51DDR MOV A,35H ;显示星期 ADD A,#30H ACALLWC51DDR LJMPREP ;WRITE子程序 ;功能:写DS1302一字节,写入的内容在B寄存器中 ;*********************************************WRITE:MOV50h,#8 ;一个字节有8个位,移8次INBIT1: MOVA,B RRCA ;通过A移入CY中 MOVB,A MOVT_IO,C ;移入芯片内 SETBT_CLK CLRT_CLK DJNZ50h,INBIT1 RET ;********************************************* ;READ子程序 ;功能:读DS1302一个字节,读出的内容在累加器A中 ;*********************************************READ:MOV50h,#8 ;一个字节有8个位,移8次OUTBIT1:MOVC,T_IO ;从芯片内移到CY中 RRCA ;通过CY移入A中 SETBT_CLK CLRT_CLK DJNZ50h,OUTBIT1 RET ;************************************************************ ;SET1302子程序名 ;功能:设置DS1302初始时间,并启动计时 ;调用:WRITE子程序 ;入口参数:初始时间秒、分、时、日、月、星期、年在40h~46h单元 ;出口参数:无 ;影响资源:ABR0R1R4R7 ;************************************************************SET1302:CLRT_RST CLRT_CLK SETBT_RST MOVB,#8EH ;控制命令字 LCALLWRITE MOVB,#00H ;写操作前清写保护位W LCALLWRITE SETBT_CLK CLRT_RST MOVR0,#40H ;秒、分、时、日、月、星期、年数据在40h~46h单元 MOVR7,#7 ;共7个字节 MOVR1,#80H ;写秒寄存器命令S13021: CLRT_RST CLRT_CLK SETBT_RST MOVB,R1 ;写入写秒命令 LCALLWRITE MOVA,@R0 ;写秒数据 MOVB,A LCALLWRITE INCR0 ;指向下一个写入的日历、时钟数据 INCR1 ;指向下一个日历、时钟寄存器 INCR1 SETBT_CLK CLRT_RST DJNZR7,S13021 ;未写完,继续写下一个 CLRT_RST CLRT_CLK SETBT_RST MOVB,#8EH ;控制寄存器 LCALLWRITE MOVB,#80H ;写完后打开写保护控制,WP置1 LCALLWRITE SETBT_CLK CLRT_RST ;结束写入过程 RET ;************************************************************ ;GET1302子程序名 ;功能:从DS1302读时间 ;调用:WRITE写子程序,READ子程序 ;入口参数:无 ;出口参数:秒、分、时、日、月、星期、年保存在30h~36h单元 ;影响资源:ABR0R1R4R7 ;************************************************************GET1302:MOVR0,#30H; MOVR7,#7 MOVR1,#81H ;读秒寄存器命令G13021: CLRT_RST CLRT_CLK SETBT_RST MOVB,R1 ;写入读秒寄存器命令 LCALLWRITE LCALLREAD MOV@R0,A ;存入读出数据 INCR0 ;指向下一个存放日历、时钟的存储单元 INCR1 ;指向下一个日历、时钟寄存器 INCR1 SETBT_CLK CLRT_RST DJNZR7,G13021 ;未读完,读下一个 RET ;LCD初始化子程序INIT: MOVA,#00000001H ;清屏 ACALLWC51R MOVA,#00111000B ;使用8位数据,显示两行,使用5×7的字型 LCALLWC51R MOVA,#00001100B ;显示器开,光标关,字符不闪烁 LCALLWC51R MOVA,#00000110B ;字符不动,光标自动右移一格 LCALLWC51R RET ;检查忙子程序 F_BUSY:PUSHACC ;保护现场 MOVP2,#0FFH CLRRS SETBRWWAIT: CLRE SETBE JBP2.7,WAIT ;忙,等待 POPACC;不忙,恢复现场 RET ;写入命令子程序WC51R: ACALLF_BUSY CLRE CLRRS CLRRW SETBE MOVP2,ACC CLRE RET ;写入数据子程序WC51DDR:ACALLF_BUSY CLRE SETBRS CLRRW SETBE MOVP2,ACC CLRE RET ENDC语言编程:#include<reg51.h>#include<absacc.h>//定义绝对地址访问#include<intrins.h>#defineucharunsignedchar#defineuintunsignedintsbitT_CLK=P1^3;//DS1302时钟线引脚sbitT_IO=P1^4;//DS1302数据线引脚sbitT_RST=P1^2;//DS1302复位线引脚sbitRS=P1^7; //定义LCD的控制线sbitRW=P1^6;sbitEN=P1^5;sbitACC7=ACC^7;sbitACC0=ACC^0;uchardatechar[]={"DATE:"};uchartimechar[]={"TIME:"};uchardatebuffer[10]={0x32,0x30,0,0,0x2d,0,0,0x2d,0,0};//定义日历显示缓冲区uchartimebuffer[8]={0,0,0x3a,0,0,0x3a,0,0};//定义时间显示缓冲区ucharweekbuffer={0x30}; //定义星期显示缓冲区/*********************************************************************名称:WriteB*功能:往DS1302写入1Byte数据*输入:ucDa写入的数据*返回值:无***********************************************************************/voidWriteB(ucharucDa){uchari;ACC=ucDa;for(i=8;i>0;i--){T_IO=ACC0;//相当于汇编中的RRCT_CLK=1;T_CLK=0;ACC=ACC>>1;}}/*********************************************************************名称:ReadB*功能:从DS1302读取1Byte数据*返回值:ACC***********************************************************************/ucharReadB(void){uchari;for(i=8;i>0;i--){ACC=ACC>>1;ACC7=T_IO;T_CLK=1;T_CLK=0;//相当于汇编中的RRC}return(ACC);}/*********************************************************************名称:v_W1302*功能:单字节写,向DS1302某地址写入命令/数据,先写地址,后写命令/数据*调用:WriteB()*输入:ucAddr:DS1302地址,ucDa:要写的数据*返回值:无***********************************************************************/voidv_W1302(ucharucAddr,ucharucDa){T_RST=0;T_CLK=0;_nop_();_nop_();T_RST=1;_nop_();_nop_();WriteB(ucAddr);/*地址,命令*/WriteB(ucDa);/*写1Byte数据*/T_CLK=1;T_RST=0;}/*********************************************************************名称:uc_R1302*功能:单字节读,读取DS1302某地址的数据,先写地址,后读命令/数据*调用:WriteB(),ReadB()*输入:ucAddrDS1302地址*返回值:ucDa:读取的数据***********************************************************************/ucharuc_R1302(ucharucAddr){ucharucDa=0;T_RST=0;T_CLK=0;T_RST=1;WriteB(ucAddr);/*写地址*/ucDa=ReadB();/*读1Byte命令/数据*/T_CLK=1;T_RST=0;return(ucDa);}//检查忙函数voidfbusy(){ P2=0xff; RS=0; RW=1; EN=1; EN=0; while((P2&0x80)) { EN=0; EN=1; }}//写命令函数voidwc51r(ucharj){fbusy(); //读状态; EN=0; RS=0; RW=0; EN=1; P2=j; EN=0;}//写数据函数voidwc51ddr(ucharj){ fbusy(); //读状态; EN=0; RS=1; RW=0; EN=1; P2=j; EN=0;}voidinit() //LCD1602初始化{wc51r(0x01);//清屏wc51r(0x38);//使用8位数据,显示两行,使用5*7的字型wc51r(0x0c);//显示器开,光标开,字符不闪烁wc51r(0x06);//字符不动,光标自动右移一格}//************延时函数************voiddelay(uinti)//延时函数{uinty,j;for(j=0;j<i;j++){for(y=0;y<0xff;y++){;}}}voidmain(void){uchari;uchardatatemp;SP=0X50;delay(10);init();wc51r(0x80);for(i=0;i<5;i++)wc51ddr(datechar[i]);//第一行开始显示DATA:wc51r(0xc0);for(i=0;i<5;i++)wc51ddr(timechar[i]);//第二行开始显示TIME:v_W1302(0x8e,0); //打开写保护v_W

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论