單片機(jī)復(fù)習(xí)筆記005 -- DS1302時(shí)鐘芯片
1、DS1302時(shí)鐘芯片的講解
待完成?。?!
#ifndef__SPIDRIVER_H__
#define__SPIDRIVER_H__
#include
#include
#include"DELAY_FUNCTION_FELL.h"
sbitSCLK=P1^0;//位定義1302芯片的接口,時(shí)鐘輸出端口定義在P1.0引腳
sbitDATA=P1^1;//位定義1302芯片的接口,數(shù)據(jù)輸出端定義在P1.1引腳
sbitRST=P1^2;//位定義1302芯片的接口,復(fù)位端口定義在P1.2引腳
voidWrite1302(unsignedchardat);//向DS1302寫一個(gè)字節(jié)的數(shù)據(jù)(或指令)
unsignedcharRead1302(void);//從DS1302中讀一個(gè)字節(jié)的數(shù)據(jù)
voidWriteSet1302(unsignedcharCmd,unsignedchardat);//根據(jù)命令字,向1302寫一個(gè)字節(jié)數(shù)據(jù)
unsignedcharReadSet1302(unsignedcharCmd);//根據(jù)命令字,從1302讀取一個(gè)字節(jié)數(shù)據(jù)
voidDS1302_Set_Second(intsecond);//設(shè)置秒
voidDS1302_Set_Minute(intminute);//設(shè)置分
voidDS1302_Set_Hour(inthour);//設(shè)置時(shí)
voidDS1302_Set_Day(intday);//設(shè)置日
voidDS1302_Set_Month(intmonth);//設(shè)置月
voidDS1302_Set_Weekday(intweekday);//設(shè)置星期
voidDS1302_Set_Year(intyear);//設(shè)置年
voidDS1302_Init(void);//對(duì)1302進(jìn)行初始化設(shè)置
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"
/*****************************************************
函數(shù)功能:向1302寫一個(gè)字節(jié)數(shù)據(jù)
入口參數(shù):x
***************************************************/
voidWrite1302(unsignedchardat)
{
unsignedchari;
SCLK=0;//拉低SCLK,為脈沖上升沿寫入數(shù)據(jù)做好準(zhǔn)備
delay1us(2);//稍微等待,使硬件做好準(zhǔn)備
for(i=0;i<8;i++)//連續(xù)寫8個(gè)二進(jìn)制位數(shù)據(jù)
{
DATA=dat&0x01;//取出dat的第0位數(shù)據(jù)寫入1302低位在前,高位在后
delay1us(2);//稍微等待,使硬件做好準(zhǔn)備
SCLK=1;//上升沿寫入數(shù)據(jù)
delay1us(2);//稍微等待,使硬件做好準(zhǔn)備
SCLK=0;//重新拉低SCLK,形成脈沖
dat>>=1;//將dat的各數(shù)據(jù)位右移1位,準(zhǔn)備寫入下一個(gè)數(shù)據(jù)位
}
}
/*****************************************************
函數(shù)功能:根據(jù)命令字,向1302寫一個(gè)字節(jié)數(shù)據(jù)
入口參數(shù):Cmd,儲(chǔ)存命令字;dat,儲(chǔ)存待寫的數(shù)據(jù)
***************************************************/
voidWriteSet1302(unsignedcharCmd,unsignedchardat)
{
RST=0;//禁止數(shù)據(jù)傳遞
SCLK=0;//確保寫數(shù)居前SCLK被拉低
RST=1;//啟動(dòng)數(shù)據(jù)傳輸
delay1us(2);//稍微等待,使硬件做好準(zhǔn)備
Write1302(Cmd);//寫入命令字
Write1302(dat);//寫數(shù)據(jù)
SCLK=1;//將時(shí)鐘電平置于高電平狀態(tài)
RST=0;//禁止數(shù)據(jù)傳遞
}
/*****************************************************
函數(shù)功能:從1302讀一個(gè)字節(jié)數(shù)據(jù)
入口參數(shù):x
***************************************************/
unsignedcharRead1302(void)
{
unsignedchari,dat;
delay1us(2);//稍微等待,使硬件做好準(zhǔn)備
for(i=0;i<8;i++)//連續(xù)讀8個(gè)二進(jìn)制位數(shù)據(jù)
{dat>>=1;
if(DATA==1)//如果讀出的數(shù)據(jù)是1
dat|=0x80;//將1取出,寫在dat的最高位
SCLK=1;//將SCLK置于高電平,為下降沿讀出
delay1us(2);//稍微等待
SCLK=0;//拉低SCLK,形成脈沖下降沿
delay1us(2);//稍微等待
}
returndat;//將讀出的數(shù)據(jù)返回
}
/*****************************************************
函數(shù)功能:根據(jù)命令字,從1302讀取一個(gè)字節(jié)數(shù)據(jù)
入口參數(shù):Cmd
***************************************************/
unsignedcharReadSet1302(unsignedcharCmd)
{
unsignedchardat;
RST=0;//拉低RST
SCLK=0;//確保寫數(shù)居前SCLK被拉低
RST=1;//啟動(dòng)數(shù)據(jù)傳輸
Write1302(Cmd);//寫入命令字
dat=Read1302();//讀出數(shù)據(jù)
SCLK=1;//將時(shí)鐘電平置于已知狀態(tài)
RST=0; /