51单片机显示年月日时分秒

先看成果:
在这里插入图片描述

DS1302代码如下:

#include <REGX52.H>

sbit DS1302_SCK=P3^6;
sbit DS1302_IO=P3^4;
sbit DS1302_CE=P3^5;

#define DS1302_SECOND 0x80 
#define DS1302_MINUTE 0x82
#define DS1302_HOUR 0x84
#define DS1302_DATE 0x86
#define DS1302_MONTH 0x88
#define DS1302_DAY 0x8A
#define DS1302_YEAR 0x8C
#define DS1302_WP 0x8E

unsigned char DS1302_Time[]={21,3,22,22,48,3,4};

/**
  * @brief  初始化DS1302
  * @param  无
  * @retval 无
  */
void DS1302_Init()
{
	DS1302_CE=0;
	DS1302_SCK=0;
}

/**
  * @brief  将指令与数据写入IO口
  * @param  指令地址与数据
  * @retval 无
  */
void DS1302_WriteByte(unsigned char Command,Data)
{
	unsigned char i;
	DS1302_CE=1;
	
//前八位是写入指令(如0x80或DS1302_SECOND)
//后八位是写入数据(如将0x03写入0x80代表的秒数中)
	for(i=0;i<8;i++)
	{
		DS1302_IO=Command&(0x01<<i); //Command若为0x80,则为1000 0000要放入IO口
	  DS1302_SCK=1;
	  DS1302_SCK=0;
	}
	for(i=0;i<8;i++)
	{
		DS1302_IO=Data&(0x01<<i);
		DS1302_SCK=1;
		DS1302_SCK=0;
	}
	DS1302_CE=0;
}

/**
  * @brief  读取IO口中的指令与数据
  * @param  指令的地址
  * @retval 写入的数据(BCD码)
  */
unsigned char DS1302_ReadByte(unsigned char Command)
{
	unsigned char i,Data=0x00;
	DS1302_CE=1;
	Command|=0x01; //将Command(w)改成Command(r)
	
//第一个for是读取指令的地址
//第二个for是根据IO口的电平状况,将之赋予Data
	for(i=0;i<8;i++)
	{
		DS1302_IO=Command&(0x01<<i);
		DS1302_SCK=0;
		DS1302_SCK=1; //赋值到第8个数时,只会进行到一半
	}
	
	for(i=0;i<8;i++)
	{
		DS1302_SCK=1;
		DS1302_SCK=0;
		if(DS1302_IO){Data|=(0x01<<i);}
	}
	DS1302_IO=0;
	DS1302_CE=0;
	return Data;
}

void DS1302_SetTime()
{
	DS1302_WriteByte(DS1302_WP,0x00);
	DS1302_WriteByte(DS1302_YEAR,DS1302_Time[0]/10*16+DS1302_Time[0]%10);
	DS1302_WriteByte(DS1302_MONTH,DS1302_Time[1]/10*16+DS1302_Time[1]%10);
	DS1302_WriteByte(DS1302_DATE,DS1302_Time[2]/10*16+DS1302_Time[2]%10);
	DS1302_WriteByte(DS1302_HOUR,DS1302_Time[3]/10*16+DS1302_Time[3]%10);
	DS1302_WriteByte(DS1302_MINUTE,DS1302_Time[4]/10*16+DS1302_Time[4]%10);
	DS1302_WriteByte(DS1302_SECOND,DS1302_Time[5]/10*16+DS1302_Time[5]%10);
	DS1302_WriteByte(DS1302_DAY,DS1302_Time[6]/10*16+DS1302_Time[6]%10);
	DS1302_WriteByte(DS1302_WP,0x80);
}

void DS1302_ReadTime()
{
	unsigned char temp;
	temp=DS1302_ReadByte(DS1302_YEAR)/16*10+DS1302_ReadByte(DS1302_YEAR)%16;
	DS1302_Time[0]=temp;
	temp=DS1302_ReadByte(DS1302_MONTH)/16*10+DS1302_ReadByte(DS1302_MONTH)%16;
	DS1302_Time[1]=temp;
	temp=DS1302_ReadByte(DS1302_DATE)/16*10+DS1302_ReadByte(DS1302_DATE)%16;
	DS1302_Time[2]=temp;
	temp=DS1302_ReadByte(DS1302_HOUR)/16*10+DS1302_ReadByte(DS1302_HOUR)%16;
	DS1302_Time[3]=temp;
	temp=DS1302_ReadByte(DS1302_MINUTE)/16*10+DS1302_ReadByte(DS1302_MINUTE)%16;
	DS1302_Time[4]=temp;
	temp=DS1302_ReadByte(DS1302_SECOND)/16*10+DS1302_ReadByte(DS1302_SECOND)%16;
	DS1302_Time[5]=temp;
	temp=DS1302_ReadByte(DS1302_DAY)/16*10+DS1302_ReadByte(DS1302_DAY)%16;
	DS1302_Time[6]=temp;
}

main代码:

#include <REGX52.H>
#include"LCD1602.h"
#include"DS1302.h"

void main()
{
	LCD_Init();
	DS1302_Init();
	DS1302_SetTime();
	
	LCD_ShowString(1,1,"  -  -  ");
	LCD_ShowString(2,1,"  :  :  ");
	
	while(1)
	{
		DS1302_ReadTime();
		LCD_ShowNum(1,1,DS1302_Time[0],2);
		LCD_ShowNum(1,4,DS1302_Time[1],2);
		LCD_ShowNum(1,7,DS1302_Time[2],2);
		LCD_ShowNum(2,1,DS1302_Time[3],2);
		LCD_ShowNum(2,4,DS1302_Time[4],2);
		LCD_ShowNum(2,7,DS1302_Time[5],2);
	}
}
  • 3
    点赞
  • 48
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值