資源簡介
采用三線制傳輸機制,通過單片機MCU的I/O實現三線制方式讀取DS1302S時鐘數據并分別將年、月、日、時間信息分別顯示在數碼管上。編寫按鍵程序,實現不同按鍵顯示年、月、日、時間等信息。
代碼片段和文件信息
#include?“reg51.h“
#include?“intrins.h“
#define?uchar?unsigned?char
#define?uint?unsigned?int
uchar?code?discode[]={0x3f0x060x5b0x4f0x660x6d0x7d0x070x7f0x6f};
//數碼管顯示0~9的段碼表
sbit?DS1302_CLK?=?P3^6; //實時時鐘時鐘線引腳
sbit?DS1302_IO?=?P3^4; //實時時鐘數據線引腳
sbit?DS1302_RST?=?P3^5; //實時時鐘復位線引腳
sbit?ACC0?=?ACC^0; //定義ACC的最低位和最高位,在對ACC移位操作后,用于傳輸數據
sbit?ACC7?=?ACC^7;
typedef?struct?SYSTEM_TIME
{
uchar?Second;
uchar?Minute;
uchar?Hour;
uchar?Week;
uchar?Day;
uchar?Month;
uchar?Year;
}?SYSTEMTIME; //定義的時間類型結構體
#define?DS1302_SECOND?0x80 //片內各位數據的地址
#define?DS1302_MINUTE?0x82
#define?DS1302_HOUR?0x84
#define?DS1302_WEEK?0x8A
#define?DS1302_DAY?0x86
#define?DS1302_MONTH?0x88
#define?DS1302_YEAR?0x8C
sbit?K1=P3^1; //將K1位定義為P3.0引腳
sbit?K2=P3^0; //將K2位定義為P3.1引腳
sbit?K3=P3^2; //將K3位定義為P3.2引腳
SYSTEMTIME?T; //聲明一個儲存時間信息的結構體
uchar?k=0; //時間顯示模式轉換
/******內部指令**************/
void?DS1302InputByte(uchar?d) //實時時鐘寫入1B(內部函數)
{
uchar?i;
ACC=d;
for(i=8;i>0;i--)
{
DS1302_IO=ACC0; //相當于匯編中的RRC
DS1302_CLK=1;
DS1302_CLK=0; //寫數據在上升沿,且先寫低位再寫高位
ACC=ACC>>1; //因為在前面已定義ACC0=ACC^0;以便再次利用
}
}
uchar?DS1302OutputByte(void) //函數功能:實時時鐘讀取1B(內部函數)
{
uchar?i;
for(i=8;i>0;i--)
{
ACC=ACC>>1; //相當于匯編中的RRC
ACC7=DS1302_IO; //由低位到高位傳播ACC7中的信息
DS1302_CLK=1; //讀信息是在下降沿
DS1302_CLK=0;
}
DS1302_IO=0;
return?(ACC);
}
void?Write1302(uchar?ucAddruchar?ucData) //ucAddr:DS1302地址
{ //ucData:要寫的數據
DS1302_RST=0;
DS1302_CLK=0;
DS1302_RST=1;
DS1302InputByte(ucAddr); //地址,命令
DS1302InputByte(ucData); //寫1B數據
DS1302_CLK=1;
DS1302_RST=0;
}
uchar?Read1302(uchar?ucAddr) //讀取DS1302某地址的數據
{
uchar?ucData;
DS1302_RST=0;
DS1302_CLK=0;
DS1302_RST=1;
DS1302InputByte(ucAddr|0x01); //上升沿,寫地址,命令
ucData=DS1302OutputByte(); //下降沿,讀1B數據
DS1302_CLK=1;
DS1302_RST=0;
return?(ucData); //在上升沿之后進行寫操作,在下降沿之前進行讀操作
}
void?DS1302_SetProtect(bit?flag) //是否寫保護
{
if(flag)
Write1302(0x8E0x80);
else
Write1302(0x8E0x00);
}
void?DS1302_SetTime(uchar?Addressuchar?Value) //函數功能:設置時間
{
DS1302_SetProtect(0);
Write1302(Address((Value/10)<<4|(Value%10))); //將十進制數轉換為BCD碼
//在DS1302中的與日歷、時鐘相關的寄存器存放的數據必須為BCD碼形式
}
void?DS1302_GetTime(SYSTEMTIME?*Time)
{
uchar?ReadValue;
ReadValue=Read1302(DS1302_SECOND);
//將BCD碼轉換為十進制數,此處為結構體操作
Time->Second=((ReadValue&0x70)>>4)*10+(ReadValue&0x0F);
ReadValue=Read1302(DS1302_MINUTE);
Time->Minute=((ReadValue&0x70)>>4)*10+(R
評論
共有 條評論