单片机MSP430F149-DS1302读写及串口收发程序
- 格式:doc
- 大小:74.50 KB
- 文档页数:12
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所示。
MSP430F149的串口RS232接口1、概述具有同步串口模式(SPI),异步通信模式(UART)。
作异步通信时,P3.4,P3.5,P3.6,P3.7第二功能分别是UTXD0, URXD0, UTXD1, UTXD2 2、使用方法概述2.1 程序架构配置寄存器设置工作模式{设置IO口为第二功能作为串口收发引脚;使能串口收发功能;选择每帧数据位为7或8;选择波特率发生器时钟源;配置波特率(查表得出值再配置UxBR0, UxBR1,UxMCTL);软件清除串口复位位(SWRST);若采用中断方式则使能接受、发送中断}编写接受/发送程序,可采用查询方式或中断方式。
同51单片机不同的是,UTXIFG,URXIF 在发送下一个数据和读取数据时被自动清零了,无需软件清除。
2.2 细节描述配置波特率时用户手册上有速查表,如下设置波特率时要选择合适的时钟源。
对于较低的波特率(9600b/s及以下),可选ACLK,大于9600要选用SMCLK,因为串口波特率发生器分频系数要求大于3。
UxBR0(低)UxBR1(高)值的计算式为:选择的时钟源/波特率,再取整。
为了精确,MSP430设置了小数分频功能,通过UxMCTL来完成。
3、相关寄存器1.ME1, Module Enable Register 1UTXE0 Bit 7 USART0 transmit enable. This bit enables the transmitter for USART0.0 Module not enabled1 Module enabledURXE0 Bit 6 USART0 receive enable. This bit enables the receiver for USART0.0 Module not enabled1 Module enabled2.UxCTL(UCTLx), USART Control RegisterCHAR Bit 4 Character length. Selects 7-bit or 8-bit character length.0 7-bit data1 8-bit dataSWRST Bit 0 Software reset enable0 Disabled. USART reset released for operation1 Enabled. USART logic held in reset state3.UxTCTL(UTCTLx), USART Transmit Control RegisterSSELx Bits5-4Source select. These bits select the BRCLK source clock.00 UCLKI01 ACLK10 SMCLK11 SMCLK4.UxBR0, USART Baud Rate Control Register 0,低8位UxBR1, USART Baud Rate Control Register 1,高8位5. UxMCTL, USART Modulation Control RegisterUxMCTLx Bits7−0Modulation bits. These bits select the modulation for BRCLK.6.IFG1, Interrupt Flag Register 1UTXIFG0 Bit 7 USART0 transmit interrupt flag. UTXIFG0 is set when U0TXBUF is empty.0 No interrupt pending1 Interrupt pendingURXIFG0 Bit 6 USART0 receive interrupt flag. URXIFG0 is set when U0RXBUF has receiveda complete character.0 No interrupt pending1 Interrupt pending7.IE1, Interrupt Enable Register 1UTXIE0 Bit 7 USART0 transmit interrupt enable. This bit enables the UTXIFG0 interrupt.0 Interrupt not enabled1 Interrupt enabledURXIE0 Bit 6 USART0 receive interrupt enable. This bit enables the URXIFG0 interrupt.0 Interrupt not enabled1 Interrupt enabled4、实例4.1 配置为N.8.1,9600,查询方式收发数据/*******************************************函数名称:InitUART功能:初始化UART端口参数:无返回值:无********************************************/void InitUART(void){P3SEL |= 0x30; // P3.4,5 = USART0 TXD/RXDME1 |= URXE0 + UTXE0; // Enable USART0 T/RXDUCTL0 |= CHAR; // 8-bit characterUTCTL0 |= SSEL0; // UCLK = ACLKUBR00 = 0x03; // 32k/9600 - 3.41UBR10 = 0x00; //UMCTL0 = 0x4A; // ModulationUCTL0 &= ~SWRST; // Initialize USART state machine }收数据if(IFG1 & URXIFG0) Disp1Char(U0RXBUF); //如果收到字符发数据while (!(IFG1 & UTXIFG0)); TXBUF0 =Char;4.2 配置接收数据中断方式P3SEL |= 0x30; // 选择P3.4和P3.5做UART通信端口ME1 |= UTXE0 + URXE0; // 使能USART0的发送和接受UCTL0 |= CHAR; // 选择8位字符UTCTL0 |= SSEL0; // UCLK = ACLKUBR00 = 0x03; // 波特率9600UBR10 = 0x00; //UMCTL0 = 0x4A; // ModulationUCTL0 &= ~SWRST; // 初始化UART状态机IE1 |= URXIE0; // 使能USART0的接收中断_EINT();中断服务函数#pragma vector = UART0RX_VECTOR __interrupt void UART0_RXISR(void) { }。
ds1302 与单片机的连接,51 单片机操作ds1302 流程
展示
在许多单片机系统中常需要一些与时间有关的控制这就有需要使用实时时钟,因为在测控系统中需要做一些特殊数据的记录及其出现时间的记
录。
那幺实时时钟就能够很好的解决这个问题,今天我们就来谈谈ds1302 与单片机之间是如何作用联系的,单片机又是如何对时钟芯片进行操作的,一
起来了解一下。
51 单片机操作ds1302 流程展示
DS1302 通过3 根线与MCU 连接串行数据发送,接收时钟信号由MCU 发送,可外接备用电池以便主电源断电后不丢失数据,并可编程对备用电源充电。
DS1302 的结构如下:。
模拟SPI数据传输的读写程序(时钟芯片DS1302为例)
本文是以时钟芯片DS1302为例子来分析时序图并写出代码。
DS1302是采用SPI三线接口与单片机进行同步通信。
重点分析单字节读时序,单字节写时序,寄存器读时序,寄存器写时序,并完成4个函数。
完整代码以及仿真图下载地址:
上图为寄存器读时序,为什么先贴出这个图呢,因为读寄存器包含了单字节的写以及单字节的读。
从图上可以看出,读DS1302的寄存器是先写入一个地址,然后再去读一个字节。
那么就可以根据这个图来完成单字节的读写时序分析以及代码的编写。
单字节写时序图1可以告诉我们,在时钟的上升沿是写入数据,是从低位开始写入。
还有一个需要注意的地方是写字节和读字节连接处,从图中可以看出,当最后一个位写入后,接下来的一个下降沿就开始读数据了,在代码编写时要注意这一点,不然读数据就会出错。
先看看下面的代码:
void dsWriteByte(u8 dat) //写入字节
{
u8 i;
for(i = 0;i 8;i++)
{
if(dat 0x01) ds1302IOStatu(1);
else ds1302IOStatu(0); //低位先写入,根据要写入的数据确定IO的电平
ds1302CLKStatu(0);
ds1302CLKStatu(1); //产生上升沿写入数据
dat = 1; //移位,准备下一位
}
} //写一个字节后,此时时钟脚是高电平。
DS1302读写程序(IIC总线)#include; //包含单片机寄存器的头文件#include; //包含_nop_()函数定义的头文件#define uchar unsigned char#define uint unsigned intsbit SRT=P3^5;sbit IO=P3^4;sbit SCK=P3^6;uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};uchar miao,fen,shi,tian,yue,zhou,nian;uchar read_DS1302(uchar addr)//读DS1302子程序;{uchar dat,i,temp,j;SRT=0;SCK=0;IO=0;//必须先置低,否则易出错;SRT=1;for(i=0;i;>;1;SCK=1;_nop_();}// IO=1;//释放总线,以便接下来的读操作,//否则读出的数据永远都是0x00,//但因addr最高总是1,在传送最高位时,即IO=dat=1, //所以此句可以不要;for(j=0;j;>;=1;if(IO)temp=temp|0x80;SCK=1;_nop_();}SCK=0;//必须严格按时序拉低,不然出错;SRT=0;IO=1;//必须释放总线;return temp;}void write_DS1302(uchar add,uchar date)//写DS1302子程序;{uchar dat1,i,dat2,j;SRT=0;SCK=0;IO=0;SRT=1;_nop_();for(i=0;i;>;1;IO=dat1;SCK=1;_nop_();}for(j=0;j;>;1;IO=dat2;SCK=1;_nop_();}SCK=0;SRT=0;IO=1;}void delay(uint n) {while(n--);}void display(){uchar miao1,miao2,fen1,fen2,shi1,shi2; P0=0xff;P1=0x00;miao1=miao&0x0f;miao2=miao&0xf0;miao2=miao2>;>;4;fen1=fen&0x0f;fen2=fen&0xf0;fen2=fen2>;>;4;shi1=shi&0x0f;shi2=shi&0xf0;shi2=shi2>;>;4;P1=table[miao1];P0=0x7f;delay(200);P1=table[miao2];P0=0xbf;delay(200);P1=0x40;P0=0xdf;delay(200);P1=table[fen1];P0=0xef;delay(200);P1=table[fen2];P0=0xf7;delay(200);P1=0x40;P0=0xfb;delay(200);P1=table[shi1];P0=0xfd;delay(200);P1=table[shi2];P0=0xfe;delay(200);}void main(){//设置日期时间(2013/09/11,21:03:00,星期3);while(1){miao=read_DS1302(0x81);fen=read_DS1302(0x83);shi=read_DS1302(0x85);tian=read_DS1302(0x87);yue=read_DS1302(0x89);zhou=read_DS1302(0x8b);nian=read_DS1302(0x8d);//读取DS18B20数据; P2=miao;display();}}。
DS1302驱动程序详解DS1302引脚介绍特性介绍驱动程序详解sbit IO=P1^0; //DS1302数据线sbit SCLK=P1^1; //DS1302时钟线sbit RST=P1^2; //DS1302复位线uchar WEEK[][4]={"SUN","***","MON","TUS","WEN","THU","FRI","SAT"}; //亦可定义成指针数组*WEEK[]uchar LCD_DSY_BUFFER1[]={"DA TE 00-00-00 "};uchar LCD_DSY_BUFFER2[]={"TIME 00:00:00 "};uchar DateTime[7];void Initialize_LCD();void Display_LCD_String(uchar p,uchar *s);void DelayMS(uint ms);//------------------------------------------------------------------//向DS1302写入一个字节//------------------------------------------------------------------void Write_A_Byte_TO_DS1302(uchar x){uchar i;SCLK=0; //拉低SCLK,为脉冲上升沿写入数据做好准备for (i=0;i<8;i++){IO=x & 0x01; //取出x的第0位数据写入1302SCLK=1; //上升沿写入数据SCLK=0; //重新拉低SCLK,形成脉冲x >>=1; //将x的各数据位右移1位,准备写入下一个数据位}}//------------------------------------------------------------------//从DS1302读取一个字节,//注意:DS1302中所存放的数据是BCD码,在读写时要注意转换////------------------------------------------------------------------uchar Get_A_Byte_FROM_DS1302(){uchar i,b=0x00;for (i=0;i<8;i++){b |= _crol_((uchar)IO,i);//将uchar类型的IO数据左移i位SCLK=1; //将SCLK置于高电平,为下降沿读出SCLK=0; //时钟下降沿读取}return (b/16)*10+b%16; //将BCD码转换为十进制数}//------------------------------------------------------------------//从DS1302指定位置读取数据//------------------------------------------------------------------ uchar Read_Data(uchar addr){uchar dat;RST=0; //拉低RSTSCLK=0; //确保写数据前SCLK被拉低RST=1; //启动数据传输Write_A_Byte_TO_DS1302(addr); //写入命令字dat=Get_A_Byte_FROM_DS1302();SCLK=1; //将时钟电平置于已知状态RST=0; //禁止数据传递return dat;}//------------------------------------------------------------------//读取当前日期时间//------------------------------------------------------------------ void GetTime(){uchar i,addr =0x81;for (i=0;i<7;i++){DateTime[i] = Read_Data(addr);addr+=2;}}//------------------------------------------------------------------//日期与时间值转换为数字字符//------------------------------------------------------------------ void Format_DataTime(uchar d,uchar *a){a[0]=d/10+'0';a[1]=d%10+'0';}//------------------------------------------------------------------//主程序//------------------------------------------------------------------ void main(){Initialize_LCD();while(1){GetTime();Format_DataTime(DateTime[6],LCD_DSY_BUFFER1+5); //0x8D 年份寄存器Format_DataTime(DateTime[4],LCD_DSY_BUFFER1+8); //0x89 月份寄存器Format_DataTime(DateTime[3],LCD_DSY_BUFFER1+11); //0x87 日期寄存器//星期strcpy (LCD_DSY_BUFFER1+13,WEEK[DateTime[5]]);//将字符串WEEK[DateTime[5]]复制到字符数组LCD_DSY_BUFFER1+13中//0x8B 周日寄存器Format_DataTime(DateTime[2],LCD_DSY_BUFFER2+5); //0x85 小时寄存器Format_DataTime(DateTime[1],LCD_DSY_BUFFER2+8); //0x83 分钟寄存器Format_DataTime(DateTime[0],LCD_DSY_BUFFER2+11); //0x81 秒寄存器Display_LCD_String(0x00,LCD_DSY_BUFFER1); //第一行显示年、月、日、星期几Display_LCD_String(0x40,LCD_DSY_BUFFER2); //第二行显示小时、分钟、秒}}。
#include"ds1302.h"//---DS1302写入和读取时分秒的地址命令---////---秒分时日月周年最低位读写位;-------//uchar code READ_RTC_ADDR[7] = {0x81, 0x83, 0x85, 0x87, 0x89, 0x8b, 0x8d};uchar code WRITE_RTC_ADDR[7] = {0x80, 0x82, 0x84, 0x86, 0x88, 0x8a, 0x8c};//---DS1302时钟初始化2013年1月1日星期二12点00分00秒。
---////---存储顺序是秒分时日月周年,存储格式是用BCD码---//uchar TIME[7] = {0, 0, 0x12, 0x01, 0x01, 0x02, 0x13};/****************************************************************************** ** 函数名: Ds1302Write* 函数功能: 向DS1302命令(地址+数据)* 输入: addr,dat* 输出: 无******************************************************************************* /void Ds1302Write(uchar addr, uchar dat){uchar n;RST = 0;_nop_();SCLK = 0;//先将SCLK置低电平。
_nop_();RST = 1; //然后将RST(CE)置高电平。
_nop_();for (n=0; n<8; n++)//开始传送八位地址命令{DSIO = addr & 0x01;//数据从低位开始传送addr >>= 1;SCLK = 1;//数据在上升沿时,DS1302读取数据_nop_();SCLK = 0;_nop_();}for (n=0; n<8; n++)//写入8位数据{DSIO = dat & 0x01;dat >>= 1;SCLK = 1;//数据在上升沿时,DS1302读取数据_nop_();SCLK = 0;_nop_();}RST = 0;//传送数据结束_nop_();}/****************************************************************************** ** 函数名: Ds1302Read* 函数功能: 读取一个地址的数据* 输入: addr* 输出: dat******************************************************************************* /uchar Ds1302Read(uchar addr){uchar n,dat,dat1;RST = 0;_nop_();SCLK = 0;//先将SCLK置低电平。
/********************************************************* 文件名称:* IIC.c* 文件说明:* 使用口线模拟IIC* 程序使用波特率为2400,程序运行时需要在pc机上使用一个串口* 接收发送程序,任意发送字符,接收的字符为十六进制时间数据* MSP-FET430P149 Demo - Basic Clock, MCLK Sourced from HF XTAL XT2* L.TCH* Feb 2007* Built with IAR Embedded Workbench Version: 3.10A*******************************************************//*********************************************************/#include <MSP430X14X.h>/********************************************************** 定义*********************************************************/#define RST BIT7#define SDA BIT6#define SCLK BIT5char pbuf[7];char clok[7]={0x16,0x15,0x14,0x13,0x12,0x04,0x07};char cbuf;char bbuf;char *pda;char *pck;char *prg;/************************************************说明************************************************/void Port_Init(void);void Init_CLK(void);void Init_UART0(void);void RST_Enable(void);void RST_Disable(void);void SCLK_HI(void);void SCLK_LO(void);void WriteByte(char nVal);char ReadByte(void);void WriteTo1302(char nAddr, char nVal);char ReadFrom1302(char nAddr);void BurstWriteTime(char *pWClock);void BurstReadTime(char *pRClock);void BurstWriteRam(char *pWReg);void BurstReadRam(char *pRReg);void SetTime(char *pClock);void GetTime(char pTime[]);/***********************************************/void Port_Init(void){P1DIR |= RST; //设置CE为输出管脚P1DIR |= RST; //设置SCLK为输出管脚P1DIR |= SCLK;P2DIR |= 0x02; // Set P2.1 to output directionreturn;}void Init_CLK(void){unsigned int i;BCSCTL1 = 0X00; //将寄存器的内容清零//XT2震荡器开启//LFTX1工作在低频模式//ACLK的分频因子为1do{IFG1 &= ~OFIFG; // 清除OSCFault标志for (i = 0xFF; i > 0; i--);}while ((IFG1 & OFIFG) == OFIFG); // 如果OSCFault =1BCSCTL1 &= ~(XT2OFF + XTS); //open XT2, LFTX2 select low frequency //BCSCTL1 |= RSEL0 + RSEL1 + RSEL2; //DCO Rsel=7(Freq=3200k/25摄氏度)//BCSCTL1 |= 0x07;BCSCTL2 += SELM1; //MCLK的时钟源为TX2CLK,分频因子为1BCSCTL2 += SELS; //SMCLK的时钟源为TX2CLK,分频因子为1return;}void Init_UART0(void){U0CTL = 0X00; //将寄存器的内容清零UCTL0|=SWRST;P3SEL |= 0x30; // P3.4,5 = USART0 TXD/RXDME1 |= UTXE0 + URXE0; // Enable USART0 TXD/RXD UCTL0 |= CHAR; // 8-bit characterUTCTL0 |= SSEL1; // UCLK = SMCLKUBR00 = 0xD3; // 3.58Mhz/2400 -1491UBR10 = 0x05; //UMCTL0 = 0x00; // no modulationUCTL0 &= ~SWRST; // Initialize USART state machine IE1 |= URXIE0; // Enable USART0 RX interruptIE1 &= ~UTXIE0; // Disable USART TX interrupt return;}void RST_Enable(void){P1OUT |= RST;return;}void RST_Disable(void){P1OUT &= ~(RST);return;}void SCLK_HI(void){P1OUT |= SCLK;return;}void SCLK_LO(void){P1OUT &= ~(SCLK);return;}/*-------------------------------* 功能: 写入1Byte数据* 调用:* 输入: nVal 写入的数据* 返回值: 无*------------------------------*/void WriteByte(char nVal){char i,j;char nTemp = nV al;char nSend;P1DIR |= SDA; //设置DATA为输出管脚_NOP();_NOP();_NOP();_NOP();for(i = 0; i < 8; i++) //发8位,从0位开始{nSend = (nTemp & 0x01);if(nSend == 1){P1OUT |= SDA;}else{P1OUT &= ~(SDA);}SCLK_HI();for(j = 10;j > 0;j--) ;SCLK_LO();for(j = 10;j > 0;j--) ;nTemp >>= 1; //从0位开始,发8位}return;}/*--------------------------------------* 功能: 读取1Byte数据* 调用:* 输入:* 返回值: nTemp*------------------------------------*/char ReadByte(void){char nTemp = 0;int i;int j;P1DIR &=~SDA; //设置DATA为输入管脚_NOP();_NOP();_NOP();_NOP();for(i = 0; i < 8; i++) //接受8位{SCLK_HI();for(j = 10;j > 0;j--);SCLK_LO();_NOP();_NOP();if(P1IN & SDA) //如果第i位是高电平置1{nTemp |= (0x01 << i);}for(j = 10;j > 0;j--);}return nTemp;}/*-----------------------------------------* 功能: 往DS1302写入1Byte数据* 调用:* 输入: nVal 写入的数据* 返回值: 无*------------------------------------------*/void WriteTo1302(char nAddr, char nVal){RST_Disable();SCLK_LO();RST_Enable();_NOP();_NOP();_NOP();_NOP();WriteByte(nAddr); //地址,命令WriteByte(nVal); //写1Byte数据SCLK_HI();RST_Disable();return;}/*-----------------------------------------* 功能: 从DS1302读取1Byte数据* 调用:* 输入:* 返回值: nDta*-----------------------------------------*/char ReadFrom1302(char nAddr){char nData;RST_Disable();SCLK_LO();RST_Enable();_NOP();_NOP();_NOP();_NOP();WriteByte(nAddr); //地址,命令nData = ReadByte(); //读1Byte数据SCLK_HI();RST_Disable();cbuf = nData; //return(nData);}/*-------------------------------------* 功能: 往DS1302写入时钟数据(多字节方式)* 调用:* 输入: pClock[]: 时钟数据地址格式为: 秒分时日月星期年控制* 8Byte (BCD码)* 返回值: 无*----------------------------------*/void BurstWriteTime(char *pClock){char i;WriteTo1302(0x8e,0x00); //控制命令,写操作.。
WP=0开写保护RST_Disable();SCLK_LO();RST_Enable();WriteByte(0xbe); //0xbe:时钟多字节写命令for (i = 8; i > 0; i--) //8Byte = 7Byte 时钟数据+ 1Byte 控制(即写保护){WriteByte(*pClock); //写1Byte数据pClock++;}SCLK_HI();RST_Disable();return;}/*-----------------------------------------* 功能: 读取DS1302时钟数据(多字节方式)* 调用:* 输入: pClock[]: 时钟数据地址格式为: 秒分时日月星期年控制* 8Byte (BCD码)* 返回值: ucDa :读取的数据*---------------------------------------*/void BurstReadTime(char *pClock){char i;RST_Disable();SCLK_LO();RST_Enable();WriteByte(0xbf); //0xbf:时钟多字节读命令for (i = 8; i > 0; i--){*pClock = ReadByte(); //读1Byte数据pClock++;}SCLK_HI();RST_Disable();return ;}/*-----------------------------------------* 功能: 往DS1302寄存器数写入数据(多字节方式)* 调用:* 输入: pReg: 寄存器数据地址* 返回值: 无*----------------------------------------*/void BurstWriteRam(char *pReg){char i;WriteTo1302(0x8e,0x00); //控制命令,WP=0,写操作RST_Disable();SCLK_LO();RST_Enable();WriteByte(0xfe); //0xfe:寄存器数据多字节写命令for (i = 31; i > 0; i--) //31Byte 寄存器数据{WriteByte(*pReg); //写1Byte数据pReg++;}SCLK_HI();RST_Disable();return;}/*------------------------------------------* 功能: 读取DS1302寄存器数据* 调用:* 输入: pReg: 寄存器数据地址* 返回值: 无*----------------------------------------*/void BurstReadRam(char *pReg){char i;RST_Disable();SCLK_LO();RST_Enable();WriteByte(0xff); //0xff:寄存器数据多字节读命令for (i = 31; i > 0; i--) //31Byte 寄存器数据{*pReg = ReadByte(); //读1Byte数据pReg++;}SCLK_HI();RST_Disable();return;}/*------------------------------------------* 功能: 设置初始时间(以单字节读写进行)* 调用:* 输入: pClock[]: 初始时间地址。