微机实验 实时时钟

时间:2026-01-20

微机实验 实时时钟

实验三 串行口实时时钟实验

实验目的

1、了解实时时钟电路工作原理 2、了解串行时钟芯片的控制方法

3、掌握DS1302串行时钟芯片的使用方法

实验仪器

单片机开发板、万利仿真机、稳压电源、计算机

实验原理

1、 DS1302串行时钟芯片工作原理

DS1302是一种高性能、低功耗、带RAM的实时时钟电路,它可以对年、月、日、周日、时、分、秒进行计时,具有闰年补偿功能,工作电压为2.5V~5.5V。采用三线接口与CPU进行同步通信,并可采用突发方式一次传送多个字节的时钟信号或RAM数据。芯片内部有一个31×8的用于临时性存放数据的RAM寄存器。DS1302增加了主电源/后背电源双电源引脚,同时提供了对后背电源进行涓细电流充电的能力。引脚图如图4-77所示。

图4-77 DS1302引脚图

DS1302的控制字最高位必须为1;D6位:1:读写内部通用存储器,0:读写时钟存储器;随后是地址位。最低位是读写控制:1代表读,0:代表写。

DS1302内部日历数据存储器位定义如图4-78所示。

图4-78 DS1302内部日历数据存储器结构图

CH:时钟停止位(CH=0振荡器工作允许,CH=1振荡器停止)

微机实验 实时时钟

寄存器2的第7位:12/24小时标志(bit7=1,12小时模式,bit7=0,24小时模式) 寄存器2的第5位:AM/PM定义(AP=1下午模式,AP=0上午模式)

WP:写保护位(WP=0 寄存器数据能够写入,WP=1寄存器数据不能写入) TCS:涓流充电选择(TCS=1010使能涓流充电,TCS=其它禁止涓流充电)

DS:二极管选择位(DS=01一个二极管,DS=10两个,DS=00或11,充电功能也被禁止)

图4-79 DS1302内部充电电路结构图

从图中可以看出,第1脚电源经过开关、二极管、电阻对接在第8脚的备用电源进行充电。

调整涓流充电控制寄存器的值可以控制涓流充电方式。

2、 DS1302芯片读写时序

DS1302采用三线串行口通迅,占用IO口少。数据在SCLK的上升沿有效。每个SCLK正脉冲锁存一位数据。如图4-80所示。

图4-80 DS芯片读写时序图

DS1302支持单字节读写和多字节读写方式。单字节读写时,单片机先发出读写的地址,然后再读写一字节数据;多字节读写时,单片机先发出读写的地址,然后再连续读写多个字节。如图4-81所示。

微机实验 实时时钟

图4-82 DS1302读数据帧结构

3、 DS1302应用电路

51单片机没有SPI接口,只能用普通IO口来模拟读写时序。将芯片IO口与单片机连接,电容C1用于备份电源,电源断电时为DS1302提供电能。DS1302的复位端与74LS138的Y6连接,当P2=0CH时,复位端有效。电路如图4-83所示。

图4-83 DS1302应用电路

4、 DS1302应用程序设计

DS1302应用程序设计包含:DS1302串口驱动程序、DS1302接口程序等。DS1302串口驱动程序就是串口发送、接收一个字节数据程序。DS1302接口程序包含:时钟启动/停止、时间日期设置、读时间日期、充电方式设计等。根据原理说明,我们可以设计出一部分程序。流程序图如图4-84所示。

微机实验 实时时钟

图4-84 DS1302应用程序流程图

实验内容

1、 DS1302串口驱动 #include<reg52.h> #include<intrins.h>

#define uint unsigned int #define uchar unsigned char #define data 1000

#define second timebuf[0] #define minute timebuf[1] #define hour timebuf[2] #define date timebuf[5] #define month timebuf[4] #define day timebuf[3] #define year timebuf[6]

#defineNOP3() _nop_();_nop_();_nop_() #define DS1302_SECOND 0X80 //秒 #define DS1302_MINUTE 0X82 //分 #define DS1302_HOUR 0X84 //时

#define DS1302_DAY 0X86 //日 #define DS1302_MONTH 0X88 //月 #define DS1302_WEEK 0X8A //星期 #define DS1302_YEAR 0X8C //年 #define DS1302_CONTROL 0X8E //写保护控制位

#define DS1302_RAM(X) (0XC0+(X)*2) //用于计算DS1302静态RAM地址 #define DS1302_WRITEALL 0XBE #define DS1302_READALL 0XBF sbit LEDCLK=P3^4; sbit LEDDIN=P2^3; sbit DS_IO=P2^0; //DS1302数据口 sbit DS_SCLK=P2^7; //DS1302串行时钟

sbit DS_RST=P2^4; bit flag;

微机实验 实时时钟

uchar code ledtable[]={

0x03,0x9F,0x25,0x0D,0x99,0x49,0x41,0x1F,0x01,0x09,0x11,0xC1,0x63,0x85,0x61,0x71,0xFD}; uchar dispbuf[8]; uint msecond=0; uchar wei=0;

uchar timebuf[8]={

0,0x20,01,0x15,5,2,0x12,0};

/***************************** 写入单个字节

*****************************/ Void DS1302WriteByte(uchar Wdate) {

uchar i;

for(i=0;i<8;i++)//写入一个字节 { DS_IO=(bit)(Wdate&0x01); //取Wdate最低位并强制转化为bit型

DS_SCLK=1; //写入数据 NOP3(); DS_SCLK=0; NOP3(); Wdate>>=1; //取次低位 NOP3(); } }

/***************************** 读取一个字节

*****************************/ uchar DS1302ReadByte(void) {

uchar i,temp; for(i=0;i<8;i++) //读取一个字节数据 { temp>>=1; if(DS_IO==1) { temp=temp|0x80;

//读取一个字节数据中的每一位 } NOP3(); DS_SCLK=1; //读数据 NOP3();

DS_SCLK=0; }

return(temp); }

/***************************** 对单个地址写相应的数据 *****************************/ void Write1302(uchar addr,uchar DSdate) {

DS_RST=0; //复位有效 DS_SCLK=0; DS_RST=1; //复位无效

EA=0; //关中断 DS1302WriteByte(addr);//写地址 DS1302WriteByte(DSdate);//写数据 DS_SCLK=1;

DS_RST=0;//复位有效 EA=1;//开中断 }

< …… 此处隐藏:3405字,全部文档内容请下载后查看。喜欢就下载吧 ……
微机实验 实时时钟.doc 将本文的Word文档下载到电脑

    精彩图片

    热门精选

    大家正在看

    × 游客快捷下载通道(下载后可以自由复制和排版)

    限时特价:4.9 元/份 原价:20元

    支付方式:

    开通VIP包月会员 特价:19元/月

    注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
    微信:fanwen365 QQ:370150219