最近用了款DS1302 RTC實時時鐘,自己動手做個萬年歷時鐘,加上鬧鐘,再也不用擔心午睡超時了。
按鍵說明:S1 時間設置;S2 鬧鈴設置;S3 移動模式;S4 時間減;S5 時間加;S6 確認; S7 取消。
制作出來的實物圖如下:
51hei圖片_20190926092319.jpg (78.97 KB, 下載次數: 56)
下載附件
萬年歷點亮啦
2019-9-26 09:27 上傳
51hei圖片_20190926092325.jpg (102.45 KB, 下載次數: 63)
下載附件
萬年歷組裝好啦
2019-9-26 09:27 上傳
電路原理圖如下:
0.png (66.18 KB, 下載次數: 68)
下載附件
2019-9-27 02:59 上傳
單片機源程序如下:
先來一段1302驅動程序:
/*
*******************************************************************************
*
* 文 件 名:DS1302.c
* 描 述:實時時鐘芯片DS1302驅動模塊
* 功 能:
*******************************************************************************
*/
#include "Config.h"
#include "DS1302.h"
/********LCD1302的讀/寫函數編輯寫程序********/
/**********************************************
函 數 名: RTInputByte()
功 能: 實時時鐘寫入一字節
說 明: 往DS1302寫入1Byte數據(內部函數)
入口參數: d 寫放的數據
返 回 值: 無
**********************************************/
void RTInputByte(uchar d)
{
uchar i;
T_IO = 0; //把此雙向口清零,不用在此腳加上拉電阻
for(i=8; i>0; i--)
{
T_IO=d&0x01; //取最低位
T_CLK=0;
T_CLK=1;
d=d>>1;
}
}
/******************************************************************************/
/* 函數名稱 : DS1302_OutputByte */
/* 函數描述 : 從DS1302讀取1Byte數據函數 */
/* 輸入參數 : 無 */
/* 參數描述 : 無 */
/* 返回值 : 無 */
/******************************************************************************/
uchar RTOutputByte(void) //換此函數正確
{
uchar i;
uchar temp;
temp = 0;
for(i = 0; i < 8; i++)
{
T_CLK = 0;
if(T_IO != 0)
temp |= (1 << i);
T_CLK = 1;
}
return(temp);
}
void reset_ds1302()
{
T_RST = 0;
T_CLK = 0;
T_RST = 1;
}
void clear_ds1302_WP()
{
reset_ds1302();
T_RST = 1;
RTInputByte(0x8E);
RTInputByte(0);
T_IO = 0;
T_RST = 0;
}
/*設置寫保護*/
void set_ds1302_WP()
{
reset_ds1302();
T_RST = 1;
RTInputByte(0x8E);
RTInputByte(0x80);
T_IO = 0;
T_RST = 0;
}
/**********************************************
函 數 名: Write1302()
功 能: 往DS1302寫入數據
說 明: 先寫地址,后寫命令/數據(內部函數)
調 用: RTInputByte(), RTOutputByte()
入口參數: ucAddr:DS1302地址,ucData:要寫的數據
返 回 值: 無
**********************************************/
void Write1302(uchar ucAddr,uchar ucDa)
{
clear_ds1302_WP();
T_RST = 0;
T_CLK = 0;
T_RST = 1;
RTInputByte(ucAddr); //地址,寫地址
RTInputByte(ucDa); //寫1Byte數據
T_CLK = 1;
T_RST = 0;
set_ds1302_WP();
}
/**********************************************
函 數 名: Read1302()
功 能: 讀取DS1302某地址的數據
說 明: 先寫地址,后讀命令/數據(內部函數)
調 用: RTInputByte(), RTOutputByte()
入口參數: ucAddr:DS1302地址
返 回 值: ucData:讀取的數據
**********************************************/
uchar Read1302(uchar ucAddr)
{
uchar ucData;
T_RST = 0;
T_CLK = 0;
T_RST = 1;
RTInputByte(ucAddr); //地址,命令
ucData = RTOutputByte(); //讀1Byte數據
T_CLK = 1;
T_RST = 0;
return(ucData);
}
/**********************************************
函 數 名: Set1302()
功 能: 設置初始時間
說 明: 先寫地址,后讀命令/數據(寄存器多字節方式)
調 用: Write1302()
入口參數: pClock:設置時鐘數據地址 格式為: 秒 分 時 日 月 星期 年
7Byte(BCD碼) 1B 1B 1B 1B 1B 1B 1B
返 回 值: 無
**********************************************/
void Set1302(uchar *pClock)
{
uchar i;
uchar ucAddr = 0x80;
Write1302(0x8e,0x00); //控制命令,WP=0, 寫操作
for(i=7; i>0; i--)
{
Write1302(ucAddr, *pClock); //秒 分 時 日 月 星期 年
pClock++;
ucAddr += 2;
}
Write1302(0x8e,0x80); //控制命令,WP=1,寫保護
}
/**********************************************
函 數 名: get_time()
功 能: 獲取DS1302時間數據
說 明: 先寫地址,后讀命令/數據
調 用: Read1302()
入口參數: 無
返 回 值: *p: 把讀取到的數據保存到 p 指向的數組里
**********************************************/
void get_time(uchar *p)
{
uchar i,n;
n = 0x81;
for(i=7; i>0; i--)
{
*p = Read1302(n);
p++;
n+=2;
}
}
詳見附件哦~~
全部資料51hei下載地址:
DS1302.rar
(297.68 KB, 下載次數: 187)
2019-9-26 09:32 上傳
點擊文件名下載附件
原理圖源代碼 下載積分: 黑幣 -5
|