待完成!!!
//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 ; }
单片机复习笔记005 -- DS1302时钟芯片,布布扣,bubuko.com
原文:http://blog.csdn.net/dragon12345666/article/details/23003767