2、自己写的DS1302芯片的配置文件" />
当前位置: 代码迷 >> 单片机 >> 2、自己写的DS1302芯片的配置文件
  详细解决方案

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

热度:316   发布时间:2016-04-28 15:00:34.0
单片机复习笔记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 ;  }

















  相关解决方案