先看成果:
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);
}
}