单片机复习笔记005 -- DS1302时钟芯片
扫描二维码
随时随地手机看文章
1、DS1302时钟芯片的讲解
待完成!!!
#ifndef__SPIDRIVER_H__
#define__SPIDRIVER_H__
#include
#include
#include"DELAY_FUNCTION_FELL.h"
sbitSCLK=P1^0;//位定义1302芯片的接口,时钟输出端口定义在P1.0引脚
sbitDATA=P1^1;//位定义1302芯片的接口,数据输出端定义在P1.1引脚
sbitRST=P1^2;//位定义1302芯片的接口,复位端口定义在P1.2引脚
voidWrite1302(unsignedchardat);//向DS1302写一个字节的数据(或指令)
unsignedcharRead1302(void);//从DS1302中读一个字节的数据
voidWriteSet1302(unsignedcharCmd,unsignedchardat);//根据命令字,向1302写一个字节数据
unsignedcharReadSet1302(unsignedcharCmd);//根据命令字,从1302读取一个字节数据
voidDS1302_Set_Second(intsecond);//设置秒
voidDS1302_Set_Minute(intminute);//设置分
voidDS1302_Set_Hour(inthour);//设置时
voidDS1302_Set_Day(intday);//设置日
voidDS1302_Set_Month(intmonth);//设置月
voidDS1302_Set_Weekday(intweekday);//设置星期
voidDS1302_Set_Year(intyear);//设置年
voidDS1302_Init(void);//对1302进行初始化设置
intRead_DS1302_Second(void);
intRead_DS1302_Minute(void);
intRead_DS1302_Hour(void);
intRead_DS1302_Day(void);
intRead_DS1302_Month(void);
intRead_DS1302_Weekday(void);
intRead_DS1302_Year(void);
#endif
#include"DS1302_SPIdriver.h"
/*****************************************************
函数功能:向1302写一个字节数据
入口参数:x
***************************************************/
voidWrite1302(unsignedchardat)
{
unsignedchari;
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,储存待写的数据
***************************************************/
voidWriteSet1302(unsignedcharCmd,unsignedchardat)
{
RST=0;//禁止数据传递
SCLK=0;//确保写数居前SCLK被拉低
RST=1;//启动数据传输
delay1us(2);//稍微等待,使硬件做好准备
Write1302(Cmd);//写入命令字
Write1302(dat);//写数据
SCLK=1;//将时钟电平置于高电平状态
RST=0;//禁止数据传递
}
/*****************************************************
函数功能:从1302读一个字节数据
入口参数:x
***************************************************/
unsignedcharRead1302(void)
{
unsignedchari,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);//稍微等待
}
returndat;//将读出的数据返回
}
/*****************************************************
函数功能:根据命令字,从1302读取一个字节数据
入口参数:Cmd
***************************************************/
unsignedcharReadSet1302(unsignedcharCmd)
{
unsignedchardat;
RST=0;//拉低RST
SCLK=0;//确保写数居前SCLK被拉低
RST=1;//启动数据传输
Write1302(Cmd);//写入命令字
dat=Read1302();//读出数据
SCLK=1;//将时钟电平置于已知状态
RST=0; /