http://www.sshmcu.com http://shop58796262.taobao.com/
本教程为盛世电子科技原创,任何人不得抄袭其
内容
财务内部控制制度的内容财务内部控制制度的内容人员招聘与配置的内容项目成本控制的内容消防安全演练内容
或用于商业用途,违者追究其法律责任。
注:本文档出自《51 单片机C语言快速上手》,欢迎进入我们的
网站下载全套完整教程,请点击:http://www.sshmcu.com/
原创:盛世电子科技
《51 单片机控制 DS1302 时钟芯片》
DS1302 是美国 DALLAS 公司推出的一种带串行通信接口的实时时钟芯片,因为其既可以
提供实时时钟,又可以把重要的数据存放在 RAM 中,再加上它的高性能、低功耗附加 31 字
节静态 RAM,所以在智能化仪
表
关于同志近三年现实表现材料材料类招标技术评分表图表与交易pdf视力表打印pdf用图表说话 pdf
及自动控制领域得到了广泛应用。(图 5-33 为其引脚分配
图,表 5-10 是引脚功能图,图 5-34 为实验板的实用电路)
● 接口方式:采用 SPI 三线接口与 CPU 进行同步通信,并可采用突发方式一次传送多个字
节的时钟数据和 RAM 数据。
● 实时时钟可提供秒、分、时、日、星期、月和年,一个月小于 31 天时可以自动调整,
且具有闰年补偿功能。
● 工作电压在 2.5~5.5V。采用双电源供电(主电源和备用电源),Vcc1:主电源;Vcc2:
备用电源。当 Vcc2>Vcc1+0.2V 时,由 Vcc2 向 DS1302 供电,当 Vcc2< Vcc1 时,由
Vcc1 向 DS1302 供电。DS1302 还提供了对后备电源进行涓细电流充电的能力。(后备
电源也可由大容量电容来替代)
●31×8 个静态 RAM 可供使用。
图 5-33 DS1302 的外部引脚功能
表 5-10
引脚号 引脚名称 说明
1 Vcc2 主电源
2﹑3 X1 X2 振荡源,外接 32.768K 晶振,为芯片提供计时脉冲。
4 GND 地线
5 RST 复位/片选线
6 I/O 串行数据输入/输出
http://www.sshmcu.com http://shop58796262.taobao.com/
本教程为盛世电子科技原创,任何人不得抄袭其内容或用于商业用途,违者追究其法律责任。
7 SCLK 串行时钟引脚
8 Vcc1 后备电源
SCLK :串行时钟输入。
I/O :三线接口的双向数据线。
RST :输入信号,在读、写数据期间,必须为高。该引脚有两个功能:第一﹑RST 开始控
制字访问移位寄存器的控制逻辑;其次,RST 提供结束单字节或多字节数据传输的
方法。
图 5-34(实验板的实用电路 注:后备电源未使用)
一﹑DS1302 的控制字与读写时序
要想利用单片机对 DS1302 进行操作,那么要了解其读写时序与控制字是必要的,图 5-35
就是 DS1302 的控制字。
图 5-35 控制字(即地址及命令字节)
● 位 7:(高位)必须是逻辑 1,如果它为 0,则不能把数据写入到 DS1302 中。
● 位 6: 如果为 0,则表示存取日历时钟数据,为 1 表示存取 RAM 数据;
● 位 5 至位 1(A4~A0):指示操作单元的地址;
● 位 0:(低位)如为 0,表示要进行写操作,为 1 表示进行读操作。
图 5-36﹑图 5-37 分别是单片机对 DS1302 的单字节读时序与单字节写时序 。
http://www.sshmcu.com http://shop58796262.taobao.com/
本教程为盛世电子科技原创,任何人不得抄袭其内容或用于商业用途,违者追究其法律责任。
控制字总是从最低位开始输出。在控制字指令输入后的下一个 SCLK 时钟的上升沿时,
数据被写入 DS1302,数据输入从最低位(0 位)开始。同样,在紧跟 8 位的控制字指
令后的下一个 SCLK 脉冲的下降沿,读出 DS1302 的数据,读出的数据也是从最低位到
最高位。
图 5-36 单字节读时序
图 5-37 单字节写时序
DS1302 是通过 SPI 串行总线驱动方式,它不仅可以向寄存器写入控制字,还可以读取相应
寄存器的数据。
二﹑关于 DS1302 的内部寄存器
(1) DS1302 有关日历、时间的寄存器共有 12 个,其中有 7 个寄存器(读时为 81h~
8Dh,写时为 80h~8Ch),存放的数据格式为 BCD 码形式,如表 5-11 所示。
表 5-11(DS1302 有关日历、时间的寄存器)
读寄存
器
写寄存
器
BIT7 DIT6 DIT5 DIT4 DIT3 DIT2 DIT1 DIT0 范围
0x81 0x80 CH 10 秒 秒 00-59
0x83 0x82 10 分 分 00-59
10 0x85 0x84 12/24 0
AM/PM
时 时 1-12
0-23
0x87 0x86 0 0 10 日 日 1-31
0x89 0x88 0 0 0 10 月 月 1-12
0x8b 0x8a 0 0 0 0 0 周日 1-7
0x8d 0x8c 10 年 年 00-99
0x8f 0x8e WP 0 0 0 0 0 0 0 --
● 秒寄存器(81h、80h)的位 7定义为时钟暂停标志位(CH)。当该位置为“1”时,
时钟振荡器停止, DS1302 处于低功耗状态;当该位置为 “0”时,时钟开始运行。
http://www.sshmcu.com http://shop58796262.taobao.com/
本教程为盛世电子科技原创,任何人不得抄袭其内容或用于商业用途,违者追究其法律责任。
● 小时寄存器(85h、84h)的位 7 用于定义芯片在 12 小时与 24 小时之间的切换,当此
位为“1”时,选择 12 小时模式,当此位为 “0”时选择 24 小时。
在 12 小时模式时,位 5为定义 PM 与 AM 的标志位,当此位为“1”时,表示 PM。当
此位为“0”时表示选择 AM。在 24 小时模式时,位 5 是第二个 10 小时位。
● 控制寄存器(8Fh、8Eh)的位 7 是写保护标志位(WP),其它位 6~0均置为 0。在
任何情况下对时钟和 RAM 的写操作之前,WP 位必须为“0”。当 WP 位为“1”时,写
保护位防止对任一寄存器的写操作。
(2)下面我们来介绍 DS1302 有关 RAM 的地址
DS1302 中附加 31 字节静态 RAM 的地址如表 5-12 所示。
表 5-12
读地址 写地址 数据范围
0xC1 0xC0 0x00-0xFF
0xC3 0xC2 0x00-0xFF
0xC5 0xC4 0x00-0xFF
.
.
.
.
.
.
0xFD 0xFC 0x00-0xFF
(3) 关于 DS1302 的突发工作模式寄存器
我们在前面提及 DS1302 芯片有突发模式操作功能,所谓突发模式是指一次传送多个字
节的时钟数据或 RAM 数据。突发模式寄存器如图表 5-13 所示。
表 5-13
工作模式 读寄存器 写寄存器
时钟突发模式寄存器 0xBF 0xBE
RAM 突发模式寄存器 0xFF 0xFE
下面我们再利用动手实验来对其芯片作进一步的了解。
动手实验(9)
实验目的:学习 DS1302 时钟芯片的使用。
实验内容:利用 STC89C52 单片机每秒读取 DS1302 的时钟数据 1 次,在 LCD 晶液屏中显示出
来。DS1302 的初始化时间为: 4 月﹑13 日﹑9时﹑24 分﹑45 秒。
#include
#include
#include
#include"lcd.h"
#define uchar unsigned char
sbit led=P1^0;//led 灯定义
//位寻址寄存器定义
http://www.sshmcu.com http://shop58796262.taobao.com/
本教程为盛世电子科技原创,任何人不得抄袭其内容或用于商业用途,违者追究其法律责任。
sbit ACC7 = ACC^7;
sbit ACC0 = ACC^0;
//管脚定义
sbit SCLK = P3^6; // DS1302 时钟信号 7 脚
sbit DIO= P3^7; // DS1302 数据信号 6 脚
sbit RST = P2^0; // DS1302 片选 5 脚
//寄存器宏定义
#define WRITE_SECOND 0x80//写秒
#define READ_SECOND 0x81//读秒
#define WRITE_MINUTE 0x82//写分钟
#define READ_MINUTE 0x83//读分钟
#define WRITE_HOUR 0x84//写小时
#define READ_HOUR 0x85//读小钟
#define WRITE_DAY 0x86//写日
#define READ_DAY 0x87//读日
#define WRITE_MONTH 0x88//写月
#define READ_MONTH 0x89//读月
#define WRITE_PROTECT 0x8E//写保护
void DS1302writeByte(uchar _data) //向 DS1302 写入一个字节
{
uchar i;
ACC = _data;
for(i=8; i>0; i--)
{
DIO = ACC0;//写一位数据
SCLK = 1; //时钟信号
SCLK = 0;
ACC = ACC >> 1;//移位,准备好下次要写的数据。
}
}
uchar DS1302OreadByte(void)//向 DS1302 读取一个字节
{
uchar i;
for(i=8; i>0; i--)
{
ACC = ACC >>1;//移位,以便下次存放读出的数据
ACC7 = DIO;//读 1 位数据
SCLK = 1;//时钟信号
SCLK = 0;
}
return(ACC);//返回读到的数据
}
void Write1302(uchar ucAddr, uchar ucDa)//写 DS1302 寄存器
{
RST = 0;
http://www.sshmcu.com http://shop58796262.taobao.com/
本教程为盛世电子科技原创,任何人不得抄袭其内容或用于商业用途,违者追究其法律责任。
SCLK = 0;
RST = 1;
DS1302writeByte(ucAddr); // 地址,命令
DS1302writeByte(ucDa); // 写 1Byte 数据
SCLK = 1;
RST = 0;
}
uchar Read1302(uchar ucAddr) //读 DS1302 的寄存器内容
{
uchar ucData;
RST = 0;
SCLK = 0;
RST = 1;
DS1302writeByte(ucAddr|0x01); // 地址,命令
ucData = DS1302OreadByte(); // 读 1Byte 数据
SCLK = 1;
RST = 0;
return(ucData);
}
void get_time(uchar *time)
{
*(time+4)=Read1302(READ_SECOND);//读取秒钟
*(time+3)=Read1302(READ_MINUTE);//读取分钟
*(time+2)=Read1302(READ_HOUR); //读取小时
*(time+1)=Read1302(READ_DAY); //读取日
*(time+0)=Read1302(READ_MONTH); //读取月
}
void Initial(void) //初始化 DS1302
{
//初始化为 4 月,13 日,9 时,24 分,45 秒
Write1302 (WRITE_PROTECT,0x00); //禁止写保护
Write1302 (WRITE_SECOND,0x45); //秒位初始化
Write1302 (WRITE_MINUTE,0x24); //分钟初始化
Write1302 (WRITE_HOUR,0x09); //小时初始化
Write1302 (WRITE_DAY,0x13); //日初始化
Write1302 (WRITE_MONTH,0x04); //月初始化
Write1302 (WRITE_PROTECT,0x80); //允许写保护
}
void delay_ms( unsigned int time)//延时 1 毫秒程序,n 是形式参数
{
unsigned int i,j;
for(i=time;i>0;i--)//i 不断减 1,一直到 i>0 条件不成立为止
for(j=112;j>0;j--)//j 不断减 1,一直到 j>0 条件不成立为止
{;}
}
http://www.sshmcu.com http://shop58796262.taobao.com/
本教程为盛世电子科技原创,任何人不得抄袭其内容或用于商业用途,违者追究其法律责任。
void adopt_data(uchar n,uchar *show_data)//转换为 LCD 显示的数据
{
*show_data=n>>4;//十位
*(show_data+1)=n&0x0f;//个位
}
void main(void)
{
uchar chinese[4][8]={
0x0f,0x09,0x0f,0x09,0x0f,0x09,0x13,0x00,//月
0x1f,0x11,0x11,0x1f,0x11,0x11,0x1f,0x00,//日
0x01,0x1d,0x17,0x1d,0x17,0x1d,0x03,0x01,//时
0x04,0x0a,0x11,0x0e,0x02,0x0a,0x16,0x00,//分
};
uchar munber[]={0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39};//LCD 字
符数码 0~9
uchar show_dat[2],time[5];//时间的存放为月,日,时,分,秒
uchar i,j;
Initial();//初始化 DS1302
init_lcd();//初始化 LCD
wr_dictate(0x40);//对 CGRAM 进行操作
for(j=0;j<4;j++)
{
for(i=0;i<8;i++)
{
wr_data(chinese[j][i]);//利用循环语句把点阵字符写进 CGRAM 中
}
}
display_lcd(0x82,0x00);//显示字符"月"
display_lcd(0x85,0x01);//显示字符"日"
display_lcd(0x88,0x02);//显示字符"时"
display_lcd(0x8b,0x03);//显示字符"分"
while(1)
{
get_time(time); //获取 DS1302 的时间
for(i=0,j=0;i<5;i++)
{
adopt_data(time[i],show_dat);//转换为 LCD 显示的数据
display_lcd(0x80+j,munber[show_dat[0]]);//显示在液晶屏的相应位置
display_lcd(0x80+j+1,munber[show_dat[1]]);
j=j+3;
}
led=~led;//闪动 LED
delay_ms(1000);//大约 1 秒钟读一次
}
}
http://www.sshmcu.com http://shop58796262.taobao.com/
本教程为盛世电子科技原创,任何人不得抄袭其内容或用于商业用途,违者追究其法律责任。
实验步骤:
1.打开光盘第 5 章/ ds1302 / ds1302.uv2 工程文件,对程序进行编译﹑链接
﹑
调试产生 ds1302.hex 烧写文件。
2. 将实验板的 J4 短接到 LCDP 的一边, J7 短接到 LCDE 的一边。
3.将烧写文件烧写到 STC89C52 单片机中去。
4.此时会见到液晶屏显示:4 月﹑13 日﹑9 时﹑24 分﹑45 秒,而且不断地走时。
实验效果如(实图 10)
(实图 10)