精华内容
下载资源
问答
  • 绍一种以STC89C52单片机DS1302,1602液晶显示为核心,具备调节时间,设置开启时间与关闭时间的定时开关的实现过程。采用C语言编写,与汇编语言相比具有更好的移植性和可读性,便于修改和增减功能,并通过Protues...
  • PIC单片机DS1302时钟

    2020-07-13 21:24:28
    学会了如何用单片机来控制发光管、继电器、蜂鸣器、按键、数码管、RS232串口、步进电机、温度传感器、I2C 总线、SPI 总线等资源,体会到了学习板的易用性与易学性,这一期我们将介绍市面上常见的时钟芯片DS1302 的...
  • 时钟芯片是时钟一个很重要的部分。时钟芯片大多都是由美国DALAS公司生产的,有着低电流充电的作用,并且低消耗电量。下面我们分享下时钟芯片的接口,时钟芯片DS1302的原理。
  • 使用51单片机作为控制器,DS1302时钟芯片,12864液晶显示。功能全面,详情下载。
  • DS1302是由美国DALLAS公司推出的具有涓细电流充电能力的低功耗实时时钟芯片。它可以对年、月、日、周、时、分、秒进行计时,且具有闰年补偿等多种功能。
  • 单片机实时时钟电路(LCD1602、DS1302) 一、简介 此电路主要有51单片机、LCD1602模块、DS1302芯片组成,通过LCD1062显示当前时间。 二、运行效果 三、源文件 main.c #include <reg52.h> #include <...

    单片机实时时钟电路(LCD1602、DS1302)

    想要更多项目私wo!!!

    一、简介

    此电路主要有51单片机、LCD1602模块、DS1302芯片组成,通过LCD1062显示当前时间。

    二、运行效果

    在这里插入图片描述

    三、源文件

    main.c

    /*想要更多项目私wo!!!*/
    #include <reg52.h>
    #include <intrins.h>
    #include <string.h>
    #define uint unsigned int
    #define uchar unsigned char
    
    sbit IO = P1^0;
    sbit SCLK = P1^1;
    sbit RST = P1^2;
    sbit RS = P2^0;
    sbit RW = P2^1;
    sbit EN = P2^2;
    
    uchar *WEEK[]=
    {
     	"SUN","***","MON","TUS","WEN","THU","FRI","SAT"
    };
    uchar LCD_DSY_BUFFER1[]={"DATE 00-00-00    "};
    uchar LCD_DSY_BUFFER2[]={"TIME 00:00:00    "};
    uchar DateTime[7];
    
    void DelayMS(uint ms)
    {
     	uchar i;
    	while(ms--)
    	{
    	 	for(i=0;i<120;i++);
    	}
    }
    
    void Write_A_Byte_TO_DS1302(uchar x)
    {
     	uchar i;
    	for(i=0;i<8;i++)
    	{
    	 	IO=x&0x01;SCLK=1;SCLK=0;x>>=1;
    	}
    }
    
    uchar Get_A_Byte_FROM_DS1302()
    {
     	uchar i,b=0x00;
    	for(i=0;i<8;i++)
    	{
    	 	b |= _crol_((uchar)IO,i);
    		SCLK=1;SCLK=0;
    	}
    	return b/16*10+b%16;
    }
    
    uchar Read_Data(uchar addr)
    {
     	uchar dat;
    	RST = 0;SCLK=0;RST=1;
       	Write_A_Byte_TO_DS1302(addr);
    	dat = Get_A_Byte_FROM_DS1302();
       	SCLK=1;RST=0;
    	return dat;
    }
    
    void GetTime()
    {
     	uchar i,addr = 0x81;
    	for(i=0;i<7;i++)
    	{
    	 	DateTime[i]=Read_Data(addr);addr+=2;
    	}
    }
    
    uchar Read_LCD_State()
    {
     	uchar state;
    	RS=0;RW=1;EN=1;DelayMS(1);
    	state=P0;
    	EN = 0;DelayMS(1);
    	return state;
    }
    
    
    void LCD_Busy_Wait()
    {
     	while((Read_LCD_State()&0x80)==0x80);
    	DelayMS(5);
    }
    
    void Write_LCD_Data(uchar dat)
    {
     	LCD_Busy_Wait();
    	RS=1;RW=0;EN=0;P0=dat;EN=1;DelayMS(1);EN=0;	
    }
    
    void Write_LCD_Command(uchar cmd)
    {
     	LCD_Busy_Wait();
    	RS=0;RW=0;EN=0;P0=cmd;EN=1;DelayMS(1);EN=0;	
    }
    
    void Init_LCD()
    {
     	Write_LCD_Command(0x38);
    	DelayMS(1);	
    	Write_LCD_Command(0x01);
    	DelayMS(1);	
    	Write_LCD_Command(0x06);
    	DelayMS(1);	
    	Write_LCD_Command(0x0c);
    	DelayMS(1);	
    }
    
    void Set_LCD_POS(uchar p)
    {
     	Write_LCD_Command(p|0x80);	
    }
    
    void Display_LCD_String(uchar p,uchar *s)
    {
     	uchar i;
    	Set_LCD_POS(p);
    	for(i=0;i<16;i++)
    	{
    		Write_LCD_Data(s[i]);
    		DelayMS(1); 	
    	}
    }
    
    void Format_DateTime(uchar d,uchar *a)
    {
     	a[0]=d/10+'0';
    	a[1]=d%10+'0';
    }
    
    void main()
    {
     	Init_LCD();
    	while(1)
    	{
    	 	GetTime();
    		Format_DateTime(DateTime[6],LCD_DSY_BUFFER1+5);
    		Format_DateTime(DateTime[4],LCD_DSY_BUFFER1+8);
    		Format_DateTime(DateTime[3],LCD_DSY_BUFFER1+11);
    
    		strcpy(LCD_DSY_BUFFER1+13,WEEK[DateTime[5]]);
    
    		Format_DateTime(DateTime[2],LCD_DSY_BUFFER2+5);
    		Format_DateTime(DateTime[1],LCD_DSY_BUFFER2+8);
    		Format_DateTime(DateTime[0],LCD_DSY_BUFFER2+11);
    
    		Display_LCD_String(0x00,LCD_DSY_BUFFER1);
    		Display_LCD_String(0x40,LCD_DSY_BUFFER2);
    	}
    }
    
    展开全文
  • 基于51单片机+DS1302时钟模块+LCD1602显示

    千次阅读 热门讨论 2021-10-14 11:42:35
    DS1302时钟模块LCD1602显示DS1302时钟模块相关介绍基本介绍时序图 DS1302时钟模块相关介绍 基本介绍 DS1302 可慢速充电实时时钟芯片包含实时时钟/日历和 31 字节的非易失性静态 RAM。它经过一个简 单的串行接口与微...

    DS1302时钟模块相关介绍

    基本介绍

    概述

    DS1302 可慢速充电实时时钟芯片包含实时时钟/日历和 31 字节的非易失性静态 RAM。它经过一个简
    单的串行接口与微处理器通信。实时时钟/日历可对秒,分,时,日,周,月,和年进行计数,对于小于
    31 天的月,月末的日期自动进行调整,还具有闰年校正的功能。时钟可以采用 24 小时格式或
    带 AM(上
    午)/PM(下午)的 12 小时格式31 字节的== RAM== 可以用来临时保存一些重要数据。使用同步串行通信,
    简化了 DS1302 与微处理器的通信。与时钟/RAM 通信仅需3 根线(1)RST(复位),(2)I/O(数据线)
    和(3)SCLK(串行时钟)
    。数据可以以每次一个字节的单字节形式或多达 31 字节的多字节形式传输。DS1302
    能在非常低的功耗下工作,消耗小于 1µW 的功率便能保存数据和时钟信息。

    特点

    在这里插入图片描述

    各引脚功能

    在这里插入图片描述
    各引脚的功能:
    Vcc1:主电源;Vcc2:备份电源。 当Vcc2>Vcc1+0.2V时,由Vcc2向DS1302供电,当Vcc2<Vcc1时,由Vcc1向DS1302供电。
    SCLK: 串行时钟,输入,控制数据的输入与输出;
    I/O: 三线接口时的双向数据线;
    CE: 输入信号,在读和写的器件必须为高。该引脚有两个功能:1.开始控制字访问移位寄存器的控制逻辑;2.提供结束单字节或多字节数据传输的方法。

    相关寄存器

    有关日历、时间的寄存器共12个,其中有7个寄存器(读时81H——8DH,写时80H——8CH==)存放的数据格式是BCD码形式。如图所示
    在这里插入图片描述
    小时寄存器
    位7用于定义DS1302是采用12小时模式还是24小时模式。高:12小时模式。在12小时模式时,位5 为1时,表示PM。在24小时模式时,为5是第二个10小时位。
    秒寄存器
    的就位7定义为时钟暂停标志(CH)。1:时钟振荡器停止,DS1302进入低功耗状态,当该位置为0时,时钟开始运行。
    控制寄存器
    的位7是写保护位(WP),其他7位均置0,对时钟和RAM进行写操作时,WP必须为0,也就是关闭写保护,当WP为1时,就是只读模式。
    DS1302相关的RAM地址
    DS1302中附加31字节静态RAM的地址如下图
    在这里插入图片描述
    DS1302的工作模式寄存器
    所谓的突发模式(BURST模式)就是一次性传送多个字节的时钟信号和RAM数据。比如我可以一次性把时间和日期写入,也可以一次性的读出时间和日期。
    在这里插入图片描述
    通过对 31(十进制)位地址寻址(地址/命令位于 1 至 5=逻辑 1),可以把时钟/日历或 RAM 寄存器规定为多字节方式。如前所述,位 6 规定时钟或 RAM 而位 0 规定读或写。在时钟\日历寄存器中的地址 9 至 31或 RAM 寄存器中的地址 31 不能存储数据。在多字节方式中读或写从地址 0 的位 0 开始。当以多字节方式写时钟寄存器时必须按数据传送的次序写最先 8 个寄存器。意思就是写我们不是只有7个吗?时分秒、年月日、周一共七个 但是吧它得字节数为8 所有要写够8次。
    但是,当以多字节方式写 RAM 时,为了传送数据不必写所有 31 个字节。不管是否写了全部 31 个字节,所写的每一个字节都将传送至 RAM。
    在这里插入图片描述

    DS1302充电寄存器
    这个我没整过,全部复制手册的。哈哈

    这个寄存器控制 DS1302 的慢速充电特性。图 4 的简化电路表示慢速充电器的基本组成。慢速充电选择(TCS)位(位 4-7)控制慢速充电器的选择。为了防止偶然的因素使之工作,只有 1010 模式才能使慢
    速充电器工作,所有其它的模式将禁止慢速充电器。DS1302 上电时,慢速充电器被禁止。二极管选择(DS)位(位 2-3)选择是一个二极管还是两个二极管连接在 Vcc2 与 Vcc1 之间。如果 DS 为 01,那么选择一个二极管;如果 DS 为 10,则选择两个二极管。如果 DS 为 00 或 11,那么充电器被禁止,与 TCS 无关。RS 位(位0-1)选择连接在 Vcc2 与 Vcc1 之间的电阻。电阻选择(RS)位选择的电阻如下:
    在这里插入图片描述
    如果 RS 为 00,充电器被禁止,与 TCS 无关。
    二极管和电阻的选择用户根据电池和超容量电容充电所需的最大电流决定。最大充电电流可以如下列
    所说明的那样进行计算。假定 5V 系统电源加到 Vcc2 而超容量电容接至 Vcc1。再假设慢速充电器工作时在Vcc2 和 Vcc1 之间接有一个二极管和电阻 R1。因而最大电流可计算如下:
    Imax =(5.0V-二极管压降)/R1
    =(5.0V-0.7V)/2kΩ
    = 2.2mA
    显而易见,当超容量电容充电时,Vcc2 和 Vcc1 之间的电压减少,因而充电电流将会减小。

    时序图

    我们首先得给DS1302时钟模块写入时间和日期,然后呢这个时钟会自己走,我们之后只需要读取时间和日期即可。我们直接看时序图 编写代码
    在这里插入图片描述

    单字节写时序

    数据输入
    跟随在输入写命令字节的 8 个 SCLK 周期之后,在下 8 个 SCLK 周期的上升沿输入数据。如果有额外的SCLK 周期,它们将被忽略。输入从位 0 开始。
    在这里插入图片描述
    在这里插入图片描述

    上面时序图是前8位是地址,后8位是数据。
    我们根据上面的时序图 来编写 单字节写的一个函数
    发现上面的

    /*DS1302写单字节函数*/
    void ds1302_write_byte(unsigned char addrOrData)
    {
    	unsigned char i = 0;
    	for(i=0;i<8;i++)   
    	{
    		DAT = addrOrData & 0x01;	//开始传输低位 
    		addrOrData = addrOrData >> 1;//右移一位
    		CLK = 1;					 //拉高时钟表示已经发送
    		CLK = 0;					 //拉低时钟准备继续放新的数据位
    	}	
    }
    
    /*DS1302写函数*/
    void ds1302_write(unsigned char addr,unsigned char data)
    {
    	RST = 0; //RST拉低
    	SCLK = 0; //时钟SCLK也拉低
    	RST = 1; //准备开始写	
    	ds1302_writeByte(addr);	 //写入要写的地址
    	ds1302_writeByte(dat);	 //写入地址的数据
    	RST = 0; //关闭 表示结束
    }
    
    

    在这里插入图片描述
    看上面的图,比如我想写入时 为18点 的写寄存器是84H 数据就是18点 但是DS1302存储格式为 BCD 码那就是 0x18。
    那写入 时 为18点 的代码则是:

    ds1302_write(0x84,0x18); //写入时  为 18点
    

    单字节读时序

    在这里插入图片描述
    在这里插入图片描述

    /*DS1302读单字节函数*/
    unsigned char ds1302_read_byte(unsigned char data)
    {
    	unsigned char i;
    	for(i=0;i<8;i++)
    	{
    		dat = dat >> 1; //右移一位 数据是先从低位开始
    		if(IO == 1)
    			dat = dat | 0x80;	//1000 0000
    		else
    			dat = dat & 0x7f;	//0111 1111
    		SCLK = 1; //时钟拉高表示这位已经结束
    		SCLK = 0; //时钟拉低开始接收新的数据位
    	}
    	return data;
    }
    
    /*DS1302读取数据函数*/
    unsigned char ds1302_read_data(unsigned char addr)
    {
    	unsigned char data; //用于存放接收的数据
    	RST = 0; //RST拉低
    	SCLK = 0; //时钟SCLK也拉低
    	RST = 1; //准备开始写	
    	ds1302_write_byte(addr); 	//写入要读取的地址
    	data = ds1302_read_byte(data); //读取地址的数据
    	RST = 0;//关闭 表示结束
    	
    	return data;	//返回读取到的数据
    }
    
    

    我们想读取时 里面时间 看看现在是几点 时 读寄存器是85H

    time = ds1302_read_data(0x85);
    

    写保护寄存器
    写保护寄存器的位 7 是写保护位。开始 7 位(位 0-6)置为零,在读操作时总是读出零。在对时钟或
    功能 字节数 脉冲数
    CLOCK 8 72
    RAM 31 256
    DS1302
    RAM 进行写操作之前,位 7 必须为零。当它为高电平时,写保护位禁止对任何其它寄存器进行写操作。

    时钟/日历多字节(Burst)方式

    所谓的突发模式(BURST模式)就是一次性传送多个字节的时钟信号和RAM数据。比如我可以一次性把时间和日期写入,也可以一次性的读出时间和日期。
    在这里插入图片描述

    代码

    部分代码呈现

    main.c

    #include <reg52.h>
    #include "lcd1602.h"
    #include "ds1302.h"
    
    void main()
    {
    	lcd_init();   //初始化LCD1602 
    	ds1302_init();//初始化DS1302
    	while(1)
    	{
    		ds1302_burst_read(DS1302_READ_TIME); //读取日期和时间
    		lcd_display_dateAndTime(); //1602显示日期和时间	
    	}
    }
    
    

    lcd1602.c

    /*初始化LCD1602函数*/
    void lcd_init()
    {
    	unsigned char array1[] = "date:    -  -  ";
    	unsigned char array2[] = "time:  :  :  ";	
    	write_com(CURSOR_RIGHT); //写入数据后光标自动右移 整屏不移动。 0x40(光标左移 整屏不移动)0x05(左移 整屏右移)0x07(右移 整屏右移)
    	write_com(CLOSE_DIS_CUR); //开显示功能 无光标 不闪烁
    	write_com(DIS_5X7); //数据总线8位 16X2显示 5*7点阵
    	write_com(CLEAR_SCREEN); //清屏 0000 0001
    
    	lcd_display_str(0,0,array1);  //第一行显示	date:    -  -  
    	lcd_display_str(0,1,array2);  //第二行显示 	time:  :  :  
    
    }
    
    /*LCD1602 显示DS1302日期和时间 函数*/
    void lcd_display_dateAndTime()	  
    {	
    	lcd_display_byte(5,0,(time[7]>>4)+48); 	//显示年
    	lcd_display_byte(6,0,(time[7]&0x0f)+48);
    
    	lcd_display_byte(7,0,(time[6]>>4)+48); 	//显示年
    	lcd_display_byte(8,0,(time[6]&0x0f)+48);
    
    	lcd_display_byte(10,0,(time[4]>>4)+48);	//显示月
    	lcd_display_byte(11,0,(time[4]&0x0f)+48);
    
    	lcd_display_byte(13,0,(time[3]>>4)+48);	//显示日
    	lcd_display_byte(14,0,(time[3]&0x0f)+48);
    
    	lcd_display_byte(5,1,(time[2]>>4)+48);	//显示时
    	lcd_display_byte(6,1,(time[2]&0x0f)+48);
    
    	lcd_display_byte(8,1,(time[1]>>4)+48);	//显示分
    	lcd_display_byte(9,1,(time[1]&0x0f)+48);
    
    	lcd_display_byte(11,1,(time[0]>>4)+48);	//显示秒
    	lcd_display_byte(12,1,(time[0]&0x0f)+48);
    
    	lcd_display_byte(14,1,(time[5]&0x0f)+48);	//显示周	
    
    }
    
    

    ds1302.c

    #include "ds1302.h"
    
    unsigned char time[8] = {0x00,0x45,0x19,0x18,0x10,0x01,0x21,0x20};//秒分时 日月周 年
    
    /*DS1302单字节读数据函数*/
    unsigned char ds1302_readByte(unsigned char dat)
    {
    	unsigned char i = 0;
    	for(i=0;i<8;i++)  
    	{
    		dat = dat >> 1;	 //左移一次 低位开始 共有效左移7次
    		if(DAT == 1) 		
    			dat = dat | 0x80;	 //高位置1
    		else
    			dat = dat & 0x7F;	 //高位置0	
    		CLK = 1; //时钟拉高表示这位已经结束
    		CLK = 0; //时钟拉低开始接收新的数据位
    	}	
    	return dat;
    
    }
    
    /*DS1302单字节写地址或者数据函数*/
    void ds1302_writeByte(unsigned char addrOrData)
    {
    	unsigned char i = 0;
    	for(i=0;i<8;i++)   
    	{
    		DAT = addrOrData & 0x01;	//开始传输低位 
    		addrOrData = addrOrData >> 1;//右移一位
    		CLK = 1;					 //拉高时钟表示已经发送
    		CLK = 0;					 //拉低时钟准备继续放新的数据位
    	}
    					
    }
    
    /*DS1302时钟模块写命令函数*/
    void ds1302_writeCom(unsigned char addr,unsigned char dat)
    {
     	RST = 0; //拉低RST
    	CLK = 0; //拉低时钟
    	RST = 1; //使能打开
    	ds1302_writeByte(addr);	 //写入要写的地址
    	ds1302_writeByte(dat);	 //写入地址的数据
    	RST = 0; //关闭 表示结束
    }
    
    /*DS1302时钟模块读数据函数*/
    unsigned char ds1302_readData(unsigned char addr)
    {
    	unsigned char dat = 0;
    	RST = 0; //拉低RST
    	CLK = 0; //拉低时钟
    	RST = 1; //打开使能
    	ds1302_writeByte(addr);		//写入要读的地址
    	dat = ds1302_readByte(dat);	//读取地址的数据
    	RST = 0; //关闭 表示结束
    	
    	return dat; //返回读取到的数据
    }
    
    /*DS1302时钟模块读取日期和时间函数*/
    void ds1302_read_DateAndTime()
    {
    	time[0] = ds1302_readData(DS1302_READ_YEAR);  //读取年
    	time[1] = ds1302_readData(DS1302_READ_MONTH); //读取月
    	time[2] = ds1302_readData(DS1302_READ_DAY);   //读取日
    	time[3] = ds1302_readData(DS1302_READ_HOUR);  //读取时
    	time[4] = ds1302_readData(DS1302_READ_MINUTE);//读取分
    	time[5] = ds1302_readData(DS1302_READ_SECOND);//读取秒
    	time[6] = ds1302_readData(DS1302_READ_WEEK);  //读取周		
    }
    
    /*DS1302时钟模块初始化函数*/
    void ds1302_init()
    {
    	RST = 0; //关闭RST
    	CLK = 0; //拉低时钟
    	ds1302_writeCom(DS1302_WRITE_PROTECT,0x00); //关闭写保护 这样才能进行写操作
    	ds1302_burst_write(DS1302_WRITE_TIME);	//初始化全部时间
    	//ds1302_initTime(); //初始时间:2021年10月18日 19点45分00秒 周一	
    	ds1302_writeCom(DS1302_WRITE_PROTECT,0x80); //开启写保护 只读模式
    		
    }
    
    

    项目展示

    请添加图片描述
    如果觉得这篇文章对你有用。欢迎大家点赞、评论哈哈
    需要整个工程代码,欢迎大家打赏,评论区留上你的邮箱 or vx or qq。o( ̄︶ ̄)o
    在这里插入图片描述

    继续加油!!!

    展开全文
  • DS1302 是美国DALLAS公司推出的一种高性能、低功耗、带RAM的实时时钟电路,它可以对年、月、日、周日、时、分、秒进行计时,具有闰年补偿功能,工作电压为2.5V~5.5V。采用三线接口与CPU进行同步通信,并可采用突发...
  • 51单片机DS1302时钟芯片简单程序

    万次阅读 2017-04-18 20:26:23
     void write_ds1302(uchar add,uchar dat);   uchar read_ds1302(uchar add);   void read_rtc();   void set_rtc();   void display();   void delay(int n);   void show();   void ...
     #include<reg51.h>
    
     #include<intrins.h>
     #define uchar unsigned char
     #define uint unsigned int
    data_7seg[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,}; 
    uchar hour,min,sec; 
    sbit shi=P1^0; 
    sbit fen=P1^1; 
    sbit miao=P1^2; 
    sbit rst=P1^4; 
    sbit sck=P1^5; 
    sbit io=P1^6;
    sbit fm=P1^7;
    /*函数声明:*/ 
      void write_ds1302_byte(uchar dat); 
      void write_ds1302(uchar add,uchar dat); 
      uchar read_ds1302(uchar add); 
      void read_rtc(); 
      void set_rtc(); 
      void display(); 
      void delay(int n); 
      void show(); 
      void fmzz();  
       /*DS1302单字节写入:*/  
     void write_ds1302_byte(uchar dat) 
       { uchar i;
      //发送地址
         for(i=0;i<8;i++) //循环8次移位
    {  sck=0;  
    io=dat&0x01;    //每次传输低字节
    dat=dat>>1;   //右移一位
    sck=1; 

    }   
    /*DS1302多字节写入:*/ 
     void write_ds1302(uchar add,uchar dat) 
     {  
     rst=0;//CE引脚为低,数据传送中止
     _nop_(); 
     sck=0;    //清零时钟总线 
     _nop_(); 
     rst=1;   //CE引脚为高,逻辑控制有效
     _nop_();  
     write_ds1302_byte(add); 
     write_ds1302_byte(dat); 
     rst=0;
     _nop_(); 
     io=1; 
     sck=1; 
     } 
     /*DS1302读取:*/  
     uchar read_ds1302(uchar add)                
     {  uchar i,value; 
     rst=0;
     _nop_(); 
     sck=0;
     _nop_(); 
     rst=1;
     _nop_();  
     write_ds1302_byte(add); 
     for (i=0;i<8;i++) 
      {   
    value=value>>1;    
    sck=0;   
    if (io) 
    value=value|0x80; //每次传输低字节
    sck=1; 
    }  
    rst=0;
    _nop_(); 
    sck=0;
    _nop_();        
    sck=1; 
    io=1; 
    return value; 
    }


    /*调整时间:*/ 
    void set_rtc() 
    {     
    if (shi==0) 
    delay(100);    
    if (shi==0)    
    {    
    hour=(hour>>4)*10+(hour&0x0f);   
    hour++;    
    if (hour==24) 
    hour=0;    
    hour=((hour/10)<<4)+(hour%10);   
    write_ds1302(0x84,hour);    
    }      
    if (fen==0) 
    delay(100);    
    if (fen==0)    
    {    
    min=(min>>4)*10+(min&0x0f);   
    min++;    
    if (min==60) 
    min=0;    
    min=((min/10)<<4)+(min%10);   
    write_ds1302(0x82,min);    
    }      
    if (miao==0) 
    delay(100);    
    if (miao==0)    
    {
    sec=(sec>>4)*10+(sec&0x0f);   
    sec++;    
    if (sec==60) 
    sec=0;    
    sec=((sec/10)<<4)+(sec%10);   
    write_ds1302(0x80,sec);    

    }   
    /*读取时间:*/ 
    void read_rtc() 
    {     
    hour=read_ds1302(0x85);    
    min=read_ds1302(0x83);    
    sec=read_ds1302(0x81); 
    }   
    /*显示时间:*/ 
    void display() 
    {      
    unsigned int a=1;  
    P2=0x01;P0=data_7seg[hour/16];
    delay(a); 
    P2=0x02;P0=data_7seg[hour%16];
    delay(a); 
    P2=0x04;P0=data_7seg[min/16];
    delay(a); 
    P2=0x08;P0=data_7seg[min%16];
    delay(a); 
    P2=0x10;P0=data_7seg[sec/16];
    delay(a); 
    P2=0x20;P0=data_7seg[sec%16];
    delay(a);         
    }   
    /*蜂鸣:*/  

    void fmzz()   
    {     
    uint i;      
    for (i=0;i<100;i++)      
    {         
    fm=!fm;        
    delay(2); 
    }
    }
    /*延时程序:*/ 
    void delay(int n) 
    {  unsigned int i,j; 
    for(i=0;i<n;i++) 
    {   
    for(j=0;j<121;j++)  
    {;} 

    }
     /*显示学号:*/ 
     void show() 
     {    
     unsigned int m; 
     for(m=0;m<20;m++) 
     {  uint a=10;  
     P2=0x01;P0=data_7seg[7];delay(a); 
     P2=0x02;P0=data_7seg[2];delay(a); 
     P2=0x04;P0=data_7seg[4];delay(a); 
     P2=0x08;P0=data_7seg[1];delay(a); 
     P2=0x10;P0=data_7seg[1];delay(a); 
     P2=0x20;P0=data_7seg[8];delay(a); 
     }  
     }
      /*主程序:*/ 
      void main() 
      {      
      show();  
      write_ds1302(0x84,0x12); //初始化 
      write_ds1302(0x82,0x00); 
      write_ds1302(0x80,0x00); //秒寄存器(81h、80h)的位7  当该位置为0时,时钟开始运行。
      while (1) 
      {   set_rtc();  
    read_rtc();  
    display();  
    if(min==0)
    { if(sec==0)      
    {
    fmzz();
    }  

    }
     } 
    展开全文
  • 51单片机DS1302时钟LCD1602显示(可以按键设置时钟

    万次阅读 多人点赞 2019-02-08 23:02:07
    DS1302实时时钟具有能计算2100年之前的秒、分、时、日、日期、星期、月、年的能力,还有闰年调整的能力。 图1:DS1302引脚示意图 其中: X1、X2:32.768KHz晶振接入引脚。 GND:地。 :复位引脚,低电平有效,操作时...
    DS1302实时时钟具有能计算2100年之前的秒、分、时、日、日期、星期、月、年的能力,还有闰年调整的能力。
    

    图1:DS1302引脚示意图在这里插入图片描述
    其中:
    X1、X2:32.768KHz晶振接入引脚。
    GND:地。
    :复位引脚,低电平有效,操作时高电平。
    I/O:数据输入/输出引脚,具有三态功能。
    SCLK:串行时钟输入引脚。
    Vcc1:工作电源引脚。
    Vcc2:备用电源引脚。 接入电池断电时提供1302电源

    图2:控制寄存器
    控制寄存器
    图3:日历、时钟寄存器
    在这里插入图片描述
    在这里插入图片描述
    图4:单字节读写时序
    在这里插入图片描述
    LCD时序图(写命令(RS=L):设置显示坐标,写数据(RS=H))
    在这里插入图片描述
    LCD1602关键性的指令设置
    1.清屏指令
    在这里插入图片描述
    功能:<1> 清除液晶显示器,即将 DDRAM 的内容全部填入"空白"的 ASCII
    码 20H;
    <2> 光标归位,即将光标撤回液晶显示屏的左上方;
    <3> 将地址计数器(AC)的值设为 0。

    2.进入模式设置指令

    在这里插入图片描述
    功能 : 设定每次定入 1 位数据后光标的移位方向 , 并且设定每次写入的一个字符是否移动。参数设定的情况如下所示:
    位名 设置
    I/D 0=写入新数据后光标左移 1=写入新数据后光标右移
    S 0=写入新数据后显示屏不移动 1=写入新数据后显示屏整体右
    移 1 个字符

    3:显示开关控制指令
    在这里插入图片描述
    功能:控制显示器开/关、光标显示/关闭以及光标是否闪烁。参数设定的情
    况如下:
    位名 设置
    D 0=显示功能关 1=显示功能开
    C 0=无光标 1=有光标
    B 0=光标闪烁 1=光标不闪烁

    4.功能设定指令
    在这里插入图片描述
    功能:设定数据总线位数、显示的行数及字型。参数设定的情况如下:
    位名 设置
    DL 0=数据总线为 4 位 1=数据总线为 8 位
    N 0=显示 1 行 1=显示 2 行
    F 0=5×7 点阵/每字符 1=5×10 点阵/每字符

    5:显示字符地址

    在这里插入图片描述
    要显示字符时要先输入显示字符地址,也就是告诉模块在哪里显示字符,例如第二行第一个字符的地址是 40H, 那么是否直接写入 40H 就可以将光标定位
    在第二行第一个字符的位置呢?这样不行,因为写入显示地址时要求最高位 D7
    恒定为高电平 1 所以实际写入的数据应该是 01000000B(40H)
    +10000000B(80H)=11000000B(C0H)。在 1602 中我们就用前 16 个就行了。第二行也一样用前 16 个地址。

    /*
     实验效果       :1602显示时钟,按K3进入时钟设置,按K1选择设置的时分秒日月,按K2选择
    选择设置加1。
    */
    #include <reg52.h>
    #include <intrins.h>
    #define lcd1602data P0
    
    typedef unsigned char u8;
    typedef unsigned int u16;
    
    sbit E=P2^7;		 //设置液晶端口	   使能信号
    sbit RW=P2^5;		   //读写选择  读:H/写:L
    sbit RS=P2^6;		   //数据命令选择  数据:H/命令:L
    
    sbit  key1=P3^1;
    sbit  key2=P3^0;
    sbit  key3=P3^2;
    
    
    sbit SCLK=P3^6;			//设置时钟端口
    sbit IO=P3^4;
    sbit RST=P3^5;	 
    
    u16 read[]={0x81,0x83,0x85,0x87,0x89,0x8b,0x8d};		 //设置秒分时日月周年读寄存器
    u16 write[]={0x80,0x82,0x84,0x86,0x88,0x8a,0x8c};			//设置秒分时日月周年写寄存器
    u8 time[]={0x30,0x30,0x22,0x08,0x02,0x05,0x19};			 //存放初始时间
    
    u16 setmark,setplace;					 //setmark检测key3是否按下,setplace选择要调整的时间块。
    
    void delay_ms(u16 n);
    void initConfiguration();
    void lcdDisplay();
    void lcdwrite_com(u8 datas);
    void lcdwrite_datas(u8 datas);
    void lcdinit();
    void writebyte(u8 address,u8 datas);
    u8 readbyte(u8 address);
    void ds1302init();
    void read_time();
    
    void main()
    {
    	 u16 i;
    	 initConfiguration();			//初始化
    	 lcdinit();
    	 ds1302init();
    	 while(1)
    	 {
    		 if(setmark==0)				//时钟正常运作
    		 {
    		 	read_time();	
    		 }
    		 else								//调整时间
    		 {
    		 	 if(key1==0)
    			 {
    			 	delay_ms(1);
    				if(key1==0)
    				{
    				 	 setplace++;					//按下key1要调整的时间块加一
    					 setplace%=7;
    				}
    				while(i<50&&key1==0)				//等待key1松开
    				 {
    					i++;
    					delay_ms(10);
    				 }
    				 i=0;
    			 }
    
    
    			 if(key2==0)
    			 {
    			 	 delay_ms(1);
    				 if(key2==0)								//按下key2对应的初始时间加一
    				 {
    				 	 time[setplace]++;
    					if((time[setplace]&0x0f)>9)					 //换成BCD码。
    					{
    						time[setplace]=time[setplace]+6;
    					}
    					if((time[setplace]>=0x60)&&(setplace<2))		//分秒只能到59
    					{
    						time[setplace]=0;
    					}
    					if((time[setplace]>=0x24)&&(setplace==2))		//小时只能到23
    					{
    						time[setplace]=0;
    					}
    					if((time[setplace]>=0x32)&&(setplace==3))		//日只能到31
    					{
    						time[setplace]=0;	
    					}
    					if((time[setplace]>=0x13)&&(setplace==4))		//月只能到12
    					{
    						time[setplace]=0;
    					}	
    					if((time[setplace]>=0x7)&&(setplace==5))		//周只能到7
    					{
    						time[setplace]=1;
    					}
    																	 
    				 }
    				 while((i<50)&&(0==key2))
    				 {
    				 	i++;
    					delay_ms(10);
    				 }
    				 i=0;
    			 }
    
    		 }
    		 lcdDisplay();
    	 }
    }
    
    void delay_ms(u16 n)			 //准确延时一毫秒,晶振12M
    {
    	u16 a,b;
    	for(;n>0;n--)
    	{
    		for(a=199;a>0;a--)
    		{
    			for(b=1;b>0;b--)
    			{
    			 	;
    			}
    		}
    	}
    }
    
    
    void initConfiguration()	 //初始化外部中断0
    {
    	EA=1;
    	IT0=1;
    	EX0=1;	
    }
    
    void init0() interrupt 0		//按下key3时间保持不变
    {
    	 delay_ms(10);
    	 if(key3==0)
    	 {
    	 	setmark=~setmark;
    		setplace=0;
    		ds1302init();
    	 }
    }
    
    void lcdDisplay()				  //显示函数
    {
    	
    	lcdwrite_com(0x80+0x00);				//确定写数据的位置
    	lcdwrite_datas('2');
    	lcdwrite_datas('0');
    	lcdwrite_datas('0'+time[6]/16);				//写入年份的高位
    	lcdwrite_datas('0'+(time[6]&0x0f));		//低位
    	lcdwrite_datas('-');
    	lcdwrite_datas('0'+time[4]/16);
    	lcdwrite_datas('0'+(time[4]&0x0f));	 //里面的小括号很重要
    	lcdwrite_datas('-');		
    	lcdwrite_datas('0'+time[3]/16);
    	lcdwrite_datas('0'+(time[3]&0x0f));
    	 
    	lcdwrite_com(0x8c);
    	lcdwrite_datas('0'+(time[5]&0x07));
    
    	lcdwrite_com(0xc0);						  //跳线帽Joe接vcc
    	lcdwrite_datas('0'+time[2]/16);
    	lcdwrite_datas('0'+(time[2]&0x0f));
    	lcdwrite_datas('-');
    	lcdwrite_datas('0'+time[1]/16);
    	lcdwrite_datas('0'+(time[1]&0x0f));
    	lcdwrite_datas('-');
    	lcdwrite_datas('0'+time[0]/16);			 
    	lcdwrite_datas('0'+(time[0]&0x0f));
    }
    
    void lcdwrite_com(u8 datas)			 //lcd液晶写入指令操作        模拟时序
    {
    	E=0;
    	RW=0;
    	RS=0;
    
    	lcd1602data=datas;
    	delay_ms(1);
    
    	E=1;
    	//delay_ms(1);
    	E=0;
    	
    }
    
    void lcdwrite_datas(u8 datas)		 //lcd液晶写入数据操作
    {
    	E=0;
    	RW=0;
    	RS=1;
    
    	lcd1602data=datas;
    	delay_ms(1);				   //延时不能太长否则调整不灵敏
    
    	E=1;
    	//delay_ms(1);
    	E=0;
    	
    }
    
    void lcdinit()						 //LCD液晶初始化
    {
    	lcdwrite_com(0x38);			//8位总线,显示两行,5x7点阵
    	lcdwrite_com(0x0c);				//开显示功能,无关标
    	lcdwrite_com(0x06);				//光标右移,即数据依次右移
    	lcdwrite_com(0x01);				//清屏
    	lcdwrite_com(0x80);				//第一个数据位置
    }
    
    
    
    
    void writebyte(u8 address,u8 datas)			  //在寄存器里写时间数据,模拟时序
    {
    	u8 i;
    	RST=0;
    	_nop_();
    
    	SCLK=0;
    	_nop_();
    	RST=1;
    	_nop_();
    	for(i=0;i<8;i++)
    	{
    		IO=address&0x01;
    		address>>=1;
    		SCLK=1;
    		_nop_();
    		SCLK=0;
    		_nop_();	
    	}
    	for(i=0;i<8;i++)
    	{
    		IO=datas&0x01;
    		datas>>=1;
    		SCLK=1;
    		_nop_();
    		SCLK=0;
    		_nop_();	
    	}
    	RST=0;
    }
    
    u8 readbyte(u8 address)			  //读寄存器里的时间数据
    {
    	u8 i,datas,dat;
    	RST=0;
    	//_nop_();
    	SCLK=0;
    	//_nop_();
    	RST=1;
    	//_nop_();
    	for(i=0;i<8;i++)
    	{
    		IO=address&0x01;
    		address>>=1;
    		SCLK=1;
    		_nop_();
    		SCLK=0;
    		_nop_();	
    	}
    	//_nop_();
    	for(i=0;i<8;i++)
    	{
    		dat=IO;
    		datas=(datas>>1)|(dat<<7);
    		SCLK=1;
    		_nop_();
    		SCLK=0;
    		_nop_();
    	}
    	RST=0;
    	//_nop_();
    	SCLK=1;
    	//_nop_();
    	IO=0;
    	//_nop_();
    	IO=1;
    	//_nop_();
    	return datas;
    }
    
    void ds1302init()					 //在寄存器里写入初始时间
    {
    	u8 i;
    	writebyte(0x8e,0x00);			 //关闭写保护寄存器
    	for(i=0;i<7;i++)
    	{
    		writebyte(write[i],time[i]);
    	}
    	writebyte(0x8e,0x80);				 //打开写保护寄存器
    }
    
    void read_time()					  //读取时钟时间    time数组存储
    {
    	u8 i;
    	for(i=0;i<7;i++)
    	{
    		time[i]=readbyte(read[i]);
    	}
    }
    
    

    以上是我在学习过程中的一点总结,用的是普中的51单片机·。

    展开全文
  • 单片机DS1302时钟

    千次阅读 2020-02-14 10:15:35
    DS1302时钟 一.DS1302的主要性能指标 (1)DS1302实时时钟具有能计算2100年之前的秒、分、时、日、日期、星期、月、年的能力,还有闰年调整的能力。 (2)内部含有31个字节静态RAM,可提供用户访问。 (3)采用串行...
  • 基于51单片机DS1302实时时钟程序

    千次阅读 多人点赞 2020-04-15 13:34:35
    DS1302 是美国DALLAS公司推出的一种高性能、低功耗、带RAM的实时时钟电路,它可以对年、月、日、周、时、分、秒进行计时,具有闰年补偿功能,工作电压为2.0V~5.5V。采用三线接口与CPU进行同步通信,并可...
  • 本文主要为基于DS1302时钟芯片的万年历电路图及程序,希望对你的学习有所帮助。
  • 一个采用实时时钟芯片DS1302和AT89C51单片机的LED时钟,使用C语言编写的程序,可以实现以24小时计时,格式为23-59-59,能够显示和调整年月日和星期,并且能够进行整点报时和设定闹钟。
  • 小编今天跟大家分享一下用proteus7.8做的基于DS1302模块的时钟电路 设计的原理图如下:
  • 摘要:VC/C++源码,系统相关,单片机... 在DS1302数码管显示时钟电路中,K5按键 按一下,时钟开始正常显示时间,再按一下,显示日期  K6按键为调整键  K7按键 按一下,开始显示日期,再按一下进入 日期跟时钟的 调节模式
  • 用51单片机连接DS1302时钟芯片,即可在串口输出对应的时间,看到时间一直在走,有年与日时分秒星期和农历,其中星期和农历程序自动计算,下载解压即可用keil打开,编译0错误0警告,代码全部上备注,方便查阅,方便...
  • 摘 要:介绍美国DALLAS公司推出的具有涓细电流充电能力的低功耗实时时钟电路DS1302的结构、工作原理及其在实时显示时间中的应用。它可以对年、月、日、周日、时、分、秒进行计时,且具有闰年补偿等多种功能。给出DS...
  • 基于51系列单片机时钟芯片ds1302以及ds1302外围电路设计 显示器1602与单片机的硬件连接图。
  • DS1302实时时钟 芯片原理图: 引脚图: 需要注意的是,VCC1跟VCC2都外接了电容,只是容量不一样,同常备用电源VCC2的电容值是VCC1电容值的100倍,这也不难理解,如果断电,VCC2将能够提供较长一段时间的电力。 VCC...
  • 一、 DS1302时钟模块简介 DS1302 是DALLAS 公司推出的涓流充电时钟芯片,内含有一个实时时钟/日历和31 字节静态RAM ,通过简单的串行接口与单片机进行通信。实时时钟/日历电路提供秒、分、时、日、周、月、年的信息...
  • 目录硬知识DS1302 简介DS1302 使用控制寄存器日历/时钟寄存器DS1302 的读写时序电路设计示例程序DS1302.cDS1302.h测试程序main.c实验现象 普中51-单核-A2 STC89C52 Keil uVision V5.29.0.0 PK51 Prof.Developers ...
  • 51单片机实验15:DS1302时钟模块应用

    千次阅读 2019-02-08 20:44:47
    目的:单片机查询DS1302时钟模块时间,并将其显示在数码管上。 DS1302的初始化时间为2019年1月1日12:00(星期二) #include&lt;reg52.h&gt; #include&lt;dse1302.h&gt; sbit LSA=P2^2; sbit ...
  • 学会了如何用单片机来控制发光管、继电器、蜂鸣器、按键、数码管、RS232串口、步进电机、温度传感器、I2C 总线、SPI 总线等资源,体会到了学习板的易用性与易学性,这一期我们将介绍市面上常见的时钟芯片DS1302 的...
  • DS1302时钟芯片

    2020-12-20 13:35:51
    用proutes绘制DS1302时钟仿真实验
  • AT24C02时钟模块使用附带完整程序DS1302引脚说明DS1302相关寄存器时序说明代码讲解DS1302初始化读取当前时间参考程序 DS1302引脚说明 引脚 说明 Vcc2 主电源 Vcc1 后备电源(断电后保证时钟正常运行) ...
  • 51单片机+ds1302+lcd1602简易电子时钟(带闹钟功能) AT89C52、LCD1602、DS1302、speaker、 Proteus仿真 实例代码 #include<reg52.H> #include<INTRINS.H> #define TIME (0X10000-50000) #define ...
  • 51单片机 1602液晶显示的DS1302实时时钟+Proteus仿真 Proteus仿真 实例代码 /*************** ******************/ #include <reg52.h> #include <intrins.h> #include <string.h> #define ...
  • 学会了如何用单片机来控制发光管、继电器、蜂鸣器、按键、数码管、RS232串口、步进电机、温度传感器、I2C 总线、SPI 总线等资源,体会到了学习板的易用性与易学性,这一期我们将介绍市面上常见的时钟芯片DS1302 的...
  • ds1302时钟程序详解DS1302 的控制字如图2所示。控制字节的最高有效位(位7)必须是逻辑1,如果它为0,则不能把数据写入DS1302中,位6如果为0,则表示存取日历时钟数据,为1表示存取RAM数据;位5至位1指示操作单元的地址...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 2,264
精华内容 905
关键字:

单片机ds1302时钟电路