首页 《51单片机控制DS1302时钟芯片》

《51单片机控制DS1302时钟芯片》

举报
开通vip

《51单片机控制DS1302时钟芯片》 http://www.sshmcu.com http://shop58796262.taobao.com/ 本教程为盛世电子科技原创,任何人不得抄袭其内容或用于商业用途,违者追究其法律责任。 注:本文档出自《51 单片机C语言快速上手》,欢迎进入我们的 网站下载全套完整教程,请点击:http://www.sshmcu.com/ 原创:盛世电子科技 《51 单片机控制 DS1302...

《51单片机控制DS1302时钟芯片》
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)
本文档为【《51单片机控制DS1302时钟芯片》】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
下载需要: 免费 已有0 人下载
最新资料
资料动态
专题动态
is_460634
暂无简介~
格式:pdf
大小:200KB
软件:PDF阅读器
页数:8
分类:工学
上传时间:2011-09-14
浏览量:55