硬件原理圖部分:?
?
?VCC2:是主電源
VCC1:是備用電源,此處沒有使用VCC1
?查芯片數據手冊的網站:
ALLDATASHEETCN.COM - 電子元件和半導體及其他半導體的數據表搜索網站。https://www.alldatasheetcn.com/
?
?1.由原理圖可知對應引腳,所以先在軟件里定義其對應引腳:
sbit DS1302_SCLK=P3^6; //串行時鐘
sbit DS1302_IO=P3^4;//數據輸入/輸出
sbit DS1302_CE=P3^5;//芯片使能
?2.由時序圖可知在開始階段無論發送還是接收CE和SCLK都是低電平
void DS1302_Init()
{DS1302_CE=0;DS1302_SCLK=0;
}
?命令字地址:
3.由時序圖寫DS1302發送一個字節 :
??寫入時的時序圖的分析:
?
?這里時鐘線這里拉高直接拉低,沒有加延時,是因為DS1302是納秒級,而單片機是微秒,不然需要加延時函數
void DS1302_WriteByte(unsigned char Command,Data)
{unsigned char i;DS1302_CE=1;
// DS1302_IO=(Command&0x01);//0000 0001 取cmd的最低位
// DS1302_SCLK=1;//單片機需要加延時看數據手冊
// DS1302_SCLK=0;
// DS1302_IO=(Command&0x02);//0000 0010 取cmd的次低位,
// DS1302_SCLK=1;
// DS1302_SCLK=0;//找到規律,for循環左移8次就可以存入所有位for(i=0;i<8;i++)//根據數據手冊的時序圖來寫{DS1302_IO=(Command&(0x01<<i));DS1302_SCLK=1;
//這里,沒有加延時是因為DS1302是納秒級,而單片機是微秒,不然需要加延時函數DS1302_SCLK=0;}for(i=0;i<8;i++){DS1302_IO=(Data&(0x01<<i));DS1302_SCLK=1;DS1302_SCLK=0;}DS1302_CE=0;
}
4.由時序圖寫DS1302讀取一個字節 :
unsigned char DS1302_ReadByte(unsigned char Command)
{unsigned char i,Data=0x00;DS1302_CE=1;for(i=0;i<8;i++)//根據數據手冊的時序圖來寫{DS1302_IO=(Command&(0x01<<i));DS1302_SCLK=0;DS1302_SCLK=1;}for(i=0;i<8;i++){DS1302_SCLK=1;DS1302_SCLK=0;if(DS1302_IO){Data|=(0x01<<i);}}DS1302_CE=0;DS1302_IO=0;return Data;
// DS1302_SCLK=0;
// DS1302_SCLK=1;
// if(DS1302_IO){Data|=0x02;}
// DS1302_SCLK=0;
// DS1302_SCLK=1;
// if(DS1302_IO){Data|=0x04;}}