单片机复习笔记005 -- DS1302时钟芯片

1、DS1302时钟芯片的讲解

待完成!!!


2、自己写的DS1302芯片的配置文件

//DS1302_SPIdriver.h


//DS1302_SPIdriver.h
#ifndef __SPIDRIVER_H__
#define __SPIDRIVER_H__

#include<reg52.h>     //包含单片机寄存器的头文件
#include<intrins.h>   //包含_nop_()函数定义的头文件
#include "DELAY_FUNCTION_FELL.h"

sbit SCLK=P1^0;   //位定义1302芯片的接口,时钟输出端口定义在P1.0引脚
sbit DATA=P1^1;   //位定义1302芯片的接口,数据输出端定义在P1.1引脚
sbit RST=P1^2;    //位定义1302芯片的接口,复位端口定义在P1.2引脚


 void Write1302(unsigned char dat) ;	//向DS1302写一个字节的数据(或指令)
 unsigned char Read1302(void) ;	//从DS1302中读一个字节的数据
 void WriteSet1302(unsigned char Cmd,unsigned char dat) ;//根据命令字,向1302写一个字节数据
 unsigned char  ReadSet1302(unsigned char Cmd) ; //根据命令字,从1302读取一个字节数据

 void DS1302_Set_Second(int second) ; //设置秒
 void DS1302_Set_Minute(int minute) ;	//设置分
 void DS1302_Set_Hour(int hour) ;	//设置时
 void DS1302_Set_Day(int day) ;	//设置日
 void DS1302_Set_Month(int month) ;	//设置月
 void DS1302_Set_Weekday(int weekday) ;	//设置星期
 void DS1302_Set_Year(int year) ;	//设置年 

 void DS1302_Init(void) ; //对1302进行初始化设置

 int Read_DS1302_Second(void)	;
 int Read_DS1302_Minute(void) ; 
 int Read_DS1302_Hour(void) ; 
 int Read_DS1302_Day(void) ;
 int Read_DS1302_Month(void) ; 
 int Read_DS1302_Weekday(void) ;
 int Read_DS1302_Year(void) ;


#endif



//DS1302_SPIdriver.c
//DS1302_SPIdriver.c

#include "DS1302_SPIdriver.h"


/*****************************************************
函数功能:向1302写一个字节数据
入口参数:x
***************************************************/ 
void Write1302(unsigned char dat)
{
  unsigned char i; 
  SCLK=0;            //拉低SCLK,为脉冲上升沿写入数据做好准备
  delay1us(2);       //稍微等待,使硬件做好准备
  for(i=0;i<8;i++)      //连续写8个二进制位数据
    {
	     DATA=dat&0x01;    //取出dat的第0位数据写入1302  低位在前,高位在后
		 delay1us(2);       //稍微等待,使硬件做好准备
		 SCLK=1;           //上升沿写入数据
		 delay1us(2);      //稍微等待,使硬件做好准备
		 SCLK=0;           //重新拉低SCLK,形成脉冲
		 dat>>=1;          //将dat的各数据位右移1位,准备写入下一个数据位
	  }
	
 }
/*****************************************************
函数功能:根据命令字,向1302写一个字节数据
入口参数:Cmd,储存命令字;dat,储存待写的数据
***************************************************/ 
void WriteSet1302(unsigned char Cmd,unsigned char dat)
 {	  
        RST=0;           //禁止数据传递
        SCLK=0;          //确保写数居前SCLK被拉低
	    RST=1;           //启动数据传输
	    delay1us(2);     //稍微等待,使硬件做好准备
	    Write1302(Cmd);  //写入命令字
	    Write1302(dat);  //写数据
	    SCLK=1;          //将时钟电平置于高电平状态
	    RST=0;           //禁止数据传递
 }
/*****************************************************
函数功能:从1302读一个字节数据
入口参数:x
***************************************************/ 
 unsigned char Read1302(void)
 {
    unsigned char i,dat;
	delay1us(2);       //稍微等待,使硬件做好准备
	for(i=0;i<8;i++)   //连续读8个二进制位数据
	 {	 dat>>=1;
		 if(DATA==1)    //如果读出的数据是1
		 dat|=0x80;    //将1取出,写在dat的最高位
		 SCLK=1;       //将SCLK置于高电平,为下降沿读出
		 delay1us(2);  //稍微等待
		 SCLK=0;       //拉低SCLK,形成脉冲下降沿
		 delay1us(2);  //稍微等待
	  }	 
  return dat;        //将读出的数据返回
}  
/*****************************************************
函数功能:根据命令字,从1302读取一个字节数据
入口参数:Cmd
***************************************************/ 
unsigned char  ReadSet1302(unsigned char Cmd)
 {
  unsigned char dat;
  RST=0;                 //拉低RST
  SCLK=0;                //确保写数居前SCLK被拉低
  RST=1;                 //启动数据传输
  Write1302(Cmd);       //写入命令字
  dat=Read1302();       //读出数据
  SCLK=1;              //将时钟电平置于已知状态
  RST=0;               //禁止数据传递
  return dat;          //将读出的数据返回
}

/******************************************************************************
 *	名称:DS1302_Set_Second()
 *	功能:设置时钟 秒 位
 *	参数:int second
 *	返回:无
 ******************************************************************************/
 void DS1302_Set_Second(int second)
 {
 	    WriteSet1302(0x8E,0x00);                 //根据写状态寄存器命令字,写入不保护指令 
	   	WriteSet1302(0x80,((second/10)<<4|(second%10)));   //根据写秒寄存器命令字,写入秒的初始值
		WriteSet1302(0x8E,0x80);			   //根据写状态寄存器命令字,写入保护指令
 }

 /******************************************************************************
 *	名称:DS1302_Set_Minute()
 *	功能:设置时钟 分 位
 *	参数:int minute
 *	返回:无
 ******************************************************************************/
 void DS1302_Set_Minute(int minute)
 {
 	    WriteSet1302(0x8E,0x00);                 //根据写状态寄存器命令字,写入不保护指令 
		WriteSet1302(0x82,((minute/10)<<4|(minute%10)));   //根据写分寄存器命令字,写入分的初始值
		WriteSet1302(0x8E,0x80);			   //根据写状态寄存器命令字,写入保护指令
 }

 /******************************************************************************
 *	名称:DS1302_Set_Hour()
 *	功能:设置时钟 时 位
 *	参数:int hour
 *	返回:无
 ******************************************************************************/
 void DS1302_Set_Hour(int hour)
 {
 	    WriteSet1302(0x8E,0x00);                 //根据写状态寄存器命令字,写入不保护指令 
		WriteSet1302(0x84,((hour/10)<<4|(hour%10))); //根据写小时寄存器命令字,写入小时的初始值
		WriteSet1302(0x8E,0x80);			   //根据写状态寄存器命令字,写入保护指令
 }

 /******************************************************************************
 *	名称:DS1302_Set_Day()
 *	功能:设置时钟 日 位
 *	参数:int day
 *	返回:无
 ******************************************************************************/
 void DS1302_Set_Day(int day)
 {
 	    WriteSet1302(0x8E,0x00);                 //根据写状态寄存器命令字,写入不保护指令 
		WriteSet1302(0x86,((day/10)<<4|(day%10))); //根据写日寄存器命令字,写入日的初始值
		WriteSet1302(0x8E,0x80);			   //根据写状态寄存器命令字,写入保护指令
 }

 /******************************************************************************
 *	名称:DS1302_Set_Month()
 *	功能:设置时钟 月 位
 *	参数:int month
 *	返回:无
 ******************************************************************************/
 void DS1302_Set_Month(int month)
 {
 	    WriteSet1302(0x8E,0x00);                 //根据写状态寄存器命令字,写入不保护指令 
		WriteSet1302(0x88,((month/10)<<4|(month%10))); //根据写月寄存器命令字,写入月的初始值
		WriteSet1302(0x8E,0x80);			   //根据写状态寄存器命令字,写入保护指令
 }

 /******************************************************************************
 *	名称:DS1302_Set_Weekday()
 *	功能:设置时钟 星期 位
 *	参数:int weekday
 *	返回:无
 ******************************************************************************/
 void DS1302_Set_Weekday(int weekday)
 {
 	    WriteSet1302(0x8E,0x00);                 //根据写状态寄存器命令字,写入不保护指令 
		WriteSet1302(0x8a,( weekday%7 ));  //根据写星期寄存器命令字,写入星期的初始值
		WriteSet1302(0x8E,0x80);			   //根据写状态寄存器命令字,写入保护指令
 }

 /******************************************************************************
 *	名称:DS1302_Set_Year()
 *	功能:设置时钟 年 位
 *	参数:int year
 *	返回:无
 ******************************************************************************/
 void DS1302_Set_Year(int year)
 {
 	    WriteSet1302(0x8E,0x00);                 //根据写状态寄存器命令字,写入不保护指令 
		WriteSet1302(0x8c,((year/10)<<4|(year%10)));  //根据写年寄存器命令字,写入年的初始值
		WriteSet1302(0x8E,0x80);			   //根据写状态寄存器命令字,写入保护指令
 }






/*****************************************************
函数功能: 1302进行初始化设置
***************************************************/ 
void DS1302_Init(void)
{	
  unsigned char flag;
   
    flag= ReadSet1302(0x81);
	if(flag&0x80)	
	{      //判断时钟芯片是否关闭
	    WriteSet1302(0x8E,0x00);                 //根据写状态寄存器命令字,写入不保护指令 
	   	WriteSet1302(0x80,((55/10)<<4|(55%10)));   //根据写秒寄存器命令字,写入秒的初始值
		WriteSet1302(0x82,((59/10)<<4|(59%10)));   //根据写分寄存器命令字,写入分的初始值
		WriteSet1302(0x84,((23/10)<<4|(23%10))); //根据写小时寄存器命令字,写入小时的初始值
		WriteSet1302(0x86,((5/10)<<4|(5%10))); //根据写日寄存器命令字,写入日的初始值
		WriteSet1302(0x88,((4/10)<<4|(4%10))); //根据写月寄存器命令字,写入月的初始值
		WriteSet1302(0x8a,( 6%7 ));  //根据写星期寄存器命令字,写入星期的初始值
		WriteSet1302(0x8c,((14/10)<<4|(14%10)));  //根据写年寄存器命令字,写入年的初始值
		WriteSet1302(0x90,0xa5);                //打开充电功能 选择2K电阻充电方式
		WriteSet1302(0x8E,0x80);			   //根据写状态寄存器命令字,写入保护指令
	}

  }

/******************************************************************************
 *	名称:Read_DS1302_Second()
 *	功能:读DS1302的 秒 位
 *	参数:无
 *	返回:second
 ******************************************************************************/
 int Read_DS1302_Second(void)
 {
 	  int second ;
	  unsigned char ReadValue ; 

 	  ReadValue = ReadSet1302(0x81);   //从秒寄存器读数据
     second=((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);//将读出数据转化十进制数
	 return second ;

 }

 /******************************************************************************
 *	名称:Read_DS1302_Minute()
 *	功能:读DS1302的 分 位
 *	参数:无
 *	返回:minute
 ******************************************************************************/
 int Read_DS1302_Minute(void)
 {
 	  int minute ;
	  unsigned char ReadValue ;

	  ReadValue = ReadSet1302(0x83);  //从分寄存器读
      minute = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F); //将读出数据转化
	  return minute ;
 
 }

 /******************************************************************************
 *	名称:Read_DS1302_Hour()
 *	功能:读DS1302的 时 位
 *	参数:无
 *	返回:hour
 ******************************************************************************/
 int Read_DS1302_Hour(void)
 {
 	  int hour ;
	  unsigned char ReadValue ;

     ReadValue = ReadSet1302(0x85);  //从分寄存器读
     hour = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F); //将读出数据转化
	 return hour ;
 
 }

 /******************************************************************************
 *	名称:Read_DS1302_Day()
 *	功能:读DS1302的 日 位
 *	参数:无
 *	返回:day
 ******************************************************************************/
 int Read_DS1302_Day(void)
 {
 	  int day ;
	  unsigned char ReadValue ;

     ReadValue = ReadSet1302(0x87);  //从分寄存器读
     day = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F); //将读出数据转化
	 return day ; 
 
 }

 /******************************************************************************
 *	名称:Read_DS1302_Month()
 *	功能:读DS1302的 月 位
 *	参数:无
 *	返回:month
 ******************************************************************************/
 int Read_DS1302_Month(void)
 {
 	  int month ;
	  unsigned char ReadValue ;

	  ReadValue = ReadSet1302(0x89);  //从月寄存器读
      month = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F); //将读出数据转化
	  return month ;

 }

 /******************************************************************************
 *	名称:Read_DS1302_Weekday()
 *	功能:读DS1302的 星期 位
 *	参数:无
 *	返回:weekday
 ******************************************************************************/
 int Read_DS1302_Weekday(void)
 {
 	  int weekday ;
	  unsigned char ReadValue ;

 	  ReadValue = ReadSet1302(0x81);   //从星期寄存器读数据
      weekday = ReadValue&0x0F ;//将读出数据转化
	  return weekday ;
 
 }

 /******************************************************************************
 *	名称:Read_DS1302_Year()
 *	功能:读DS1302的 年 位
 *	参数:无
 *	返回:year
 ******************************************************************************/
 int Read_DS1302_Year(void)
 {
 	  int year ;
	  unsigned char ReadValue ;

	  ReadValue = ReadSet1302(0x8d);  //从年寄存器读
      year = ((ReadValue&0xf0)>>4)*10 + (ReadValue&0x0F); //将读出数据转化
	  return year ;
 
 }

















评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值