ds1302数码管显示应用
- 格式:doc
- 大小:26.00 KB
- 文档页数:7
ds1302用法时钟ic_ds1302的应用之一……基础知识2021-11-0613:09在网上看了很久,发现初学者最有兴趣的就是ds1302时钟电路,也很自然,它是个做出来就让你觉得最实用的电路了,但实际上制做上并不简单,首先你要让你的显示部分(不管是数码管还是lcd)调试通过。
然后把ds1302接好,调试正确了才能在成功显示时间和日期。
下面我们就来说说ds1302的用法。
ds1302的图如下:ds1302就是美国dallas公司面世的一种高性能、低功耗的实时时钟芯片,额外31字节静态ram,使用spi三线USB与cpu展开同步通信,并可以使用突发性方式一次传输多个字节的时钟信号和ram数据。
实时时钟可以提供更多秒、分后、时、日、星期、月和年,一个月大与31天时可以自动调整,且具备闰年补偿功能。
工作电压长约2.5~5.5v。
使用双电源供电(主电源和水泵电源),可以设置水泵电源电池方式,提供更多了对后背电源展开涓细电流电池的能力。
下面就是标准的接线电路图:各引脚功能如下:插槽号名称功能①vcc2主电源②、③x1,x2接32768hz晶振④gnd地线⑤rst复位⑥i/0数据输入输出⑦sclk串行时钟⑧vccl后备电源ds1302有关日历、时间的寄存器共计12个,其中存有7个寄存器(念时81h~8dh,写下时80h~8ch)就是放置秒、分后,小时、日、月、年、周数据的,放置的数据格式为bcd码形式它的内部时间寄存器如下:这张表呢是ds1302内部的7个与时间、日期有关的寄存器图和一个写保护寄存器,我们要做的就是将初始设置的时间、日期数据写入这几个寄存器,然后再不断地读取这几个寄存器来获取实时时间和日期。
这几个寄存器的说明如下:1、秒寄存器(81h、80h)的位7定义为时钟暂停标志(ch)。
当起始上电时该边线为1,时钟振荡器暂停,ds1302处在低功耗状态;只有将秒寄存器的该边线重写为0时,时钟就可以开始运行。
实时时钟电路DS1302芯片的原理及应用DS1302是一种实时时钟(RTC)电路芯片,由Dallas Semiconductor (现被Maxim Integrated收购)设计和制造。
它提供了一个准确的时间和日期计时功能,适用于许多应用,例如电子设备、仪器仪表、通讯设备和计算机系统等。
DS1302芯片的原理如下:1.时钟发生器:DS1302芯片内部集成了一个时钟发生器电路,它使用外部XTAL晶体和一个频率分频器来产生准确的时钟信号。
晶体的频率通常为32.768kHz,这是由于此频率具有较好的稳定性。
2.电源管理:DS1302芯片可以使用3V到5.5V的电源供电。
它内部具有电源管理电路,可以自动切换到低功耗模式以延长电池寿命。
3.时间计数器:DS1302芯片内部包含一个时间计数器,用于计算并保存当前时间、日期和星期。
它采用24小时制,并提供了BCD编码的小时、分钟、秒、日、月和年信息。
4.控制和数据接口:DS1302芯片使用串行接口与外部器件进行通信,如微控制器或外部检测电路。
控制和数据信息通过三根线SCLK(串行时钟)、I/O(串行数据输入/输出)和CE(片选)进行传输。
5.电源备份:为了确保即使在电源中断的情况下仍能保持时间数据,DS1302芯片通过附带的外部电池来提供电源备份功能。
当主电源中断时,芯片会自动切换到电池供电模式,并将时间数据存储在内部RAM中。
DS1302芯片的应用包括但不限于以下几个方面:1.时钟和日历显示:DS1302芯片可以直接连接到LCD显示屏、LED显示器或数码管等设备,用于显示当前时间和日期。
2.定时控制:DS1302芯片可以用作定时器或闹钟,在特定的时间触发一些事件。
例如,可以使用它作为控制家庭设备的定时开关。
3.数据记录:由于DS1302芯片具有时间计数功能,它可以用于记录事件的时间戳,如数据采集、操作记录或系统状态记录。
4.电源失效保护:DS1302芯片的电源备份功能可确保即使在电源中断的情况下,时间数据也能被保存,以避免系统重新启动后时间重置的问题。
实时时钟电路DS1302芯片的原理及应用DS1302芯片是一种低功耗的实时时钟(RTC)电路。
它包含了一个真正的时钟/日历芯片和31个静态RAM存储单元,用于存储时钟和日期信息。
DS1302芯片的工作电压范围为2.0V至5.5V,并且具有极低的功耗,非常适合于移动电子设备和电池供电的应用。
DS1302芯片的原理如下:1.时钟发生器:DS1302芯片内部具有一个实时时钟发生器,它通过晶振和电容电路生成稳定的振荡信号,用于计时。
2.时钟/计时电路:DS1302芯片内部的时钟/计时电路可以精确地计算并保持当前的时间和日期。
它具有秒、分钟、小时、日期、月份、星期和年份等不同的计时单元。
3.RAM存储单元:DS1302芯片包含31个静态RAM存储单元,用于存储时钟和日期信息。
这些存储单元可以通过SPI接口进行读写操作,并且在断电情况下也能够保持数据。
4.控制接口:DS1302芯片通过3线接口与微控制器通信,包括一个时钟线、一个数据线和一个使能线。
这种接口使得与微控制器的通信非常简单,并且能够高效地读写时钟和日期信息以及控制芯片的其他功能。
DS1302芯片的应用如下:1.实时时钟:DS1302芯片可以用作电子设备中的实时时钟。
例如,它可以用于计算机、嵌入式系统、电子游戏等设备中,以提供准确的时间和日期信息。
2.定时器:DS1302芯片的计时功能可以用于设计各种定时器应用。
例如,它可以用于计时器、倒计时器、定时开关等应用中,以实现定时功能。
3.时钟显示:DS1302芯片可以与显示模块结合使用,用于显示当前的时间和日期。
例如,它可以用于数字钟、计时器、时钟频率计等应用中。
4.能量管理:由于DS1302芯片具有低功耗特性,因此它可以用于电池供电的设备中,以实现节能的能量管理策略。
例如,它可以用于手持设备、无线传感器网络等应用中,以延长电池寿命。
综上所述,DS1302芯片是一种低功耗的实时时钟电路,具有精确计时、可靠存储和简单接口等优点,适用于计时、显示和能量管理等各种应用中。
××大学××学院××系课程设计报告××大学××学院××系××课程设计DS1302数码管显示数字钟的设计学生姓名学号所在系专业名称班级指导教师成绩××大学××学院二〇一二年六月摘要:本课程设计要求基于STC89C52单片机实现用8位数码管进行时钟显示。
采用STC89C52单片机和DS1302实时时钟芯片,使用5V电源供电。
时钟可以通过按键切换,数码管显示时、分、秒以及年、月、日,并且可以实现时钟的校准功能。
包括时钟芯片驱动程序,数码管显示及驱动程序。
关键字:单片机,DS1302,时钟电路,数码管显示Abstract: This course is designed 8 digital tube clock display requirements based STC89C52 microcontroller. Using STC89C52 microcontroller and DS1302 real time clock chip, using a 5V power supply. Design of the clock by means of the key switches, digital tube display hours, minutes, seconds, and the year, month, day, and can achieve clock calibration function. Including the driver of the clock chip, digital display and driver.Key words: single chip macrocomputer;DS1302;clock circuit;digital tube display目录1. 总体设计方案 (1)1.1 电子钟功能介绍1.1.1 基本功能介绍 (1)1.1.2 扩展功能介绍 (1)1.2 总体设计方案 (1)1.2.1 计时方案 (1)1.2.2 按键方案 (1)1.2.3 显示方案 (2)2. 单元模块设计 (2)2.1 硬件总电路设计 (2)2.2 显示模块电路设计 (2)2.3 按键调时电路设计 (3)2.4 时钟芯片通信电路 (3)3. 软件模块设计 (4)3.1 主程序设计 (4)3.2 时钟芯片 (5)3.2.1 DS1302内部结构 (5)3.2.2 DS1302的读时序 (6)3.2.3 DS1302的写时序 (6)3.3 键盘调时 (7)4. 设计总结 (8)5. 参考文献 (8)6. 附录 (9)前言数字钟是采用数字电路实现对时、分、秒及数字显示的计时装置,广泛用于个人家庭、车站、办公室等公共场所,成为人们日常生活中的必需品。
DS1302应用刚学单片机,好多好奇,所以想做个简单的时钟。
下面是PROTEUS仿真电路和电路图,简单易懂。
文笔不好,说了多余。
下面是程序。
#include<reg52.h>#include<intrins.h>#include<ds1302.h>#define uint unsigned int#define uchar unsigned char#define BCDTUAN(str) (str/10*16+str%10) //定义宏,将要写入DS1302的时间转化为BCD码#define Write_Sec 0x80#define Write_Min 0x82#define Write_Hou 0x84#define Write_Dat 0x86#define Write_Mon 0x88#define Write_day 0x8a#define Write_Yea 0x8c#define Write_WP 0x8e //写保护位#define Write_TCR 0x90#define Read_Sec 0x81#define Read_Min 0x83#define Read_Hou 0x85#define Read_Dat0x87#define Read_Mon 0x89#define Read_Day 0x8b#define Read_Yea 0x8d#define CLK_BurstW 0xbf //时钟突发模式写#define CLK_BurstR 0xbf //时钟突发模式读#define Write_RAM_Begin 0xc0 //RAM第一个字节写指令#define Read_RAM_Begin 0xc1 //RAM第一个字节读指令#define RAM_BurstW 0xfe //突发模式写RAM#define RAM_BurstR 0xff //突发模式读RAMsbit _74hc154_A = P1^0;sbit _74hc154_B = P1^1;sbit _74hc154_C = P1^2;sbit _74hc154_D = P1^3;sbit CE =P1^6;sbit SCLK=P1^5;sbit IO =P1^4;uchar code scan[][4]={{0,0,0,0},{0,0,0,1},{0,0,1,0},{0,0,1,1},{0,1,0,0},{0,1,0,1},{0,1,1,0},{0,1,1,1},{1,0,0,0},{1,0,0,1},{1,0,1,0},{1,0,1,1},{1,1,0,0},{1,1,0,1},{1,1,1,0},{1,1,1,1}};uchar scanbuff[]={0,0,0,0,0,0,0,0,0,0,0,0};uchar code dispdate[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};void WriteDS1302(void); //向DS1302写入时间。
void ReadDS1302(void); //读取DS1302中的年,月,日,星期几,小时,分钟和秒.void SendCmd(unsigned char cmd); //传送地址void delayus(unsigned char tt);void delay(uchar z){uchar x,y;for(x=z;x>0;x--)for(y=120;y>0;y--);}void _74hc154(uchar k) //位扫描设定{_74hc154_A=scan[k][0];_74hc154_B=scan[k][1];_74hc154_C=scan[k][2];_74hc154_D=scan[k][3];}void main(){uchar i;while(1){WriteDS1302();ReadDS1302() ;for(i=0;i<12;i++){_74hc154(i); //位扫描P0=~dispdate[scanbuff[i]];//数据送P0口delay(10);}}}void WriteDS1302(void){WriteByte(Write_Yea,BCDTUAN(13)); //写13年}//读取DS1302中的年,月,日,星期几,小时,分钟和秒.void ReadDS1302(void){unsigned char buff;//将读取的数据送入缓存数组,住输出数据为16进制buff=ReadByte(Read_Yea); //年scanbuff[10]=buff/16; //十位scanbuff[11]=buff%16; //个位buff=ReadByte(Read_Mon); //月scanbuff[6]=buff/16; //十位scanbuff[7]=buff%16; //个位buff=ReadByte(Read_Dat); //日scanbuff[8]=buff/16; //十位scanbuff[9]=buff%16; //个位buff=ReadByte(Read_Hou); //时scanbuff[0]=buff/16; //十位scanbuff[1]=buff%16; //个位buff=ReadByte(Read_Min); //分scanbuff[2]=buff/16; //十位scanbuff[3]=buff%16; //个位buff=ReadByte(Read_Sec); //秒scanbuff[4]=buff/16; //十位scanbuff[5]=buff%16; //个位}//读取地址RCmd的时间/数据unsigned char ReadByte(unsigned char RCmd){unsigned char valu=0x00,temp;CE=0; //初使化SCLK=0; //初使化,并为rise edge做准备CE=1; //初使化,传输开始。
The SCLK must be low when CE is driven to high level.SendCmd(RCmd); //传送地址for(temp=0;temp<8;temp++){valu>>=1;SCLK=0;if(IO==1)valu|=0x80;delayus(1);SCLK=1;delayus(1);}CE=0; //结束传输return valu;}//向WCmd地址写入时间/数据若写入时间,则时间用#define BCD(time) (time/10*16+time%10)处理.void WriteByte(unsigned char WCmd,unsigned char valu){unsigned char temp;CE=0;SCLK=0; //初使化,并为rise edge做准备CE=1; //初使化,传输开始。
SendCmd(WCmd);for(temp=0;temp<8;temp++){SCLK=0;IO=valu&0x01;delayus(2);SCLK=1;delayus(2);valu>>=1;}CE=0; //结束传输}//突发模式读RAM num个字节void BurstRead_CLK(unsigned char *ptr){unsigned char temp,temp2,valu;CE=0;SCLK=0;CE=1;SendCmd(RAM_BurstR); //突发模式读取CLK开始for(temp2=0;temp2<8;temp2++){for(temp=0;temp<8;temp++) //读取到的分别是秒,分,时,日,月,星期几,年,写保护位,注意,TCR是不可以突发模式的。
{valu>>=1;SCLK=0;if(IO==1)valu|=0x80;delayus(2);SCLK=1;delayus(2);}*ptr=valu;ptr++;}CE=0; //结束突发模式读}void BurstRead_RAM(unsigned char *ptr,unsigned char num){unsigned char temp1,temp2,valu;CE=0;SCLK=0;CE=1;SendCmd(CLK_BurstR); //突发模式读取CLK开始for(temp2=0;temp2<num;temp2++){for(temp1=0;temp1<8;temp1++) //读取到的分别是秒,分,时,日,月,星期几,年,写保护位,注意,TCR是不可以突发模式的。
{valu>>=1;SCLK=0;if(IO==1)valu|=0x80;delayus(2);SCLK=1;delayus(2);}*ptr=valu;ptr++;}CE=0; //结束突发模式读}//突发模式写RAMvoid BurstWrite_RAM(unsigned char Data[]){unsigned char size=sizeof(Data),temp1,temp2,valu;if(size>31)size=31;CE=0;SCLK=0;CE=1;SendCmd(RAM_BurstW);for(temp2=0;temp2<size;temp2++){valu=Data[temp2];for(temp1=0;temp1<8;temp1++){SCLK=0;IO=valu&0x01;delayus(2);SCLK=1;delayus(2);valu>>=1;}}CE=0;}void BurstWrite_CLK(unsigned char Time[]){unsigned char size=sizeof(Time),temp1,temp2,valu;if(size>8)size=8;CE=0;SCLK=0;CE=1;SendCmd(CLK_BurstW);for(temp2=0;temp2<size;temp2++){valu=Time[temp2];for(temp1=0;temp1<8;temp1++){SCLK=0;IO=valu&0x01;delayus(2);SCLK=1;delayus(2);valu>>=1;}}CE=0;}//传送指令void SendCmd(unsigned char cmd){unsigned char temp;for(temp=0;temp<8;temp++){SCLK=0; //为下一个上升沿做准备IO=cmd&0x01;SCLK=1;delayus(1);cmd>>=1;}}void delayus(unsigned char tt) //tt=2,延时为2us{tt--;}这个是ds1302.h头文件内容,建个txt文档将下面内容复制进去,改后缀为.h即可添加了#ifndef DS1302_H#define DS1302_Hextern unsigned char ReadByte(unsigned char RCmd);extern void WriteByte(unsigned char WCmd,unsigned char valu);extern void BurstRead_CLK(unsigned char *ptr);extern void BurstRead_RAM(unsigned char *ptr,unsigned char num);extern void BurstWrite_CLK(unsigned char Time[]);extern void BurstWrite_RAM(unsigned char Data[]);#endif。