DS1302时钟与可调时钟

 

 

 main()

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

void main(){
	LCD_Init();
	LCD_ShowString(1,1,"20  -  -");//静态字符初始化显示
	LCD_ShowString(2,1,"  :  :  ");
	
	DS1302_Init();
	DS1302_SetTime();
	
	while(1){
		DS1302_ReadTime();
		LCD_ShowNum(1,3,DS1302_Time[0],2);//显示年
		LCD_ShowNum(1,6,DS1302_Time[1],2);//显示月
		LCD_ShowNum(1,9,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);//显示秒
		//LCD_ShowNum(2,10,DS1302_Time[6],2);
	}
	
}

 DS1302_H__

#ifndef __DS1302_H__
#define __DS1302_H__

  extern unsigned char DS1302_Time[];
	void DS1302_Init();
	void DS1302_WriteByte(unsigned char Command,Data);
	unsigned char DS1302_ReadByte(unsigned char Command);
	void DS1302_SetTime();
	void DS1302_ReadTime();
	
#endif
#include <REGX52.H>

/**
  * @brief  定义时钟的寄存器
  * @param  
  * @retval  
  */

#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

//引脚定义
sbit DS1302_SCLK=P3^6;
sbit DS1302_IO=P3^4;
sbit DS1302_CE=P3^5;

unsigned char DS1302_Time[]={21,10,21,21,52,50,4};
/**
  * @brief  时钟时序初始化
  * @param  
  * @retval  
  */

void DS1302_Init(){
	DS1302_SCLK=0;
	DS1302_CE=0;
}
/**
  * @brief  向DS1302时钟的寄存器中写入一个字节
  * @param  unsigned char Command写入的命令;
						unsigned char Data 具体数据
  * @retval  
  */

void DS1302_WriteByte(unsigned char Command,unsigned char Data){
	unsigned char i;
	DS1302_CE=1;
	for(i=0;i<8;i++){
		DS1302_IO=Command&(0x01<<i);
		DS1302_SCLK=1;
		DS1302_SCLK=0;
	}
	for(i=0;i<8;i++){
		DS1302_IO=Data&(0x01<<i);
		DS1302_SCLK=1;
		DS1302_SCLK=0;
	}
  DS1302_CE=0;
}
/**
  * @brief  DS1302读一个字节
  * @param  Command 命令字/地址
  * @retval 读出的数据
  */
unsigned char DS1302_ReadByte(unsigned char Command){
	unsigned char i,Data=0x00;
	Command|=0x01;	//将指令转换为读指令
	DS1302_CE=1;
	for(i=0;i<8;i++){
		DS1302_IO=Command&(0x01<<i);
		DS1302_SCLK=0;
		DS1302_SCLK=1;
	}
	for(i=0;i<8;i++){
		DS1302_SCLK=1;
		DS1302_SCLK=0;
		if(DS1302_IO){Data|=(0x01<<i);}
	}
	DS1302_CE=0;
	DS1302_IO=0;  //读取后将IO设置为0,否则读出的数据会出错
	return Data;
}
/**
  * @brief  设置时钟的初始时间
  * @param  
  * @retval 
		当lcd读出的时间大于59且不动的数,则芯片处于写保护状态,
		加上DS1302_WriteByte(DS1302_WP,0x00);可解除保护
  */

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_DAY,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_DATE,DS1302_Time[6]/10*16+DS1302_Time[6]%10);
	DS1302_WriteByte(DS1302_WP,0x80);//打开写保护
}
/**
  * @brief  读取时钟的时间,存储在DS1302_Time[]
  * @param  
  * @retval  
  */

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

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值