微机实验 实时时钟
时间:2026-01-20
时间: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字,全部文档内容请下载后查看。喜欢就下载吧 ……