3.PNG (58.92 KB, 下載次數: 33)
下載附件
2020-6-20 11:41 上傳
#ifndef _DS1302_H_
#define _DS1302_H_
#define uchar unsigned char
sbit SCLK=P2^3; //ds1302時鐘線定義
sbit IO=P2^4; //數據線
sbit RST=P2^5; //復位線
uchar sec,min,hour,day,mon,year,week;
//uchar n_year,n_mon,n_day;//農歷顯示的函數
/*------------------------------------------------
DS1302編程部分
------------------------------------------------*/
void write_1302(uchar add,uchar dat) //寫操作 (寫地址+寫數據)
{
uchar i;
RST=1; //把復位線拉高
for(i=0;i<8;i++)
{
SCLK=0;//時鐘信號為低,開始寫地址
IO = add & 0x01;
add >>= 1; //把地址右移一位
SCLK=1; //時鐘線拿高
}
for(i=0;i<8;i++)
{
SCLK=0;//時鐘信號為低,開始寫數據
IO = dat & 0x01;
dat >>= 1; //把地址右移一位
SCLK=1; //時鐘線拿高
}
SCLK=0;
RST=0;//寫操作結束
IO =0;
}
uchar read_1302(uchar add) //讀操作(寫地址+讀數據)
{
uchar i,value;
RST=0;
SCLK=0;
RST=1; //把復位線拉高
for(i=0;i<8;i++)
{
SCLK=0;//時鐘信號為低,開始寫地址
IO = add & 0x01; //讓IO保存add的最低位
add >>= 1; //把地址右移一位
SCLK=1; //時鐘線拿高
}
for(i=0;i<8;i++)
{
value >>= 1; //把數據右移一位
if(IO == 1) value |= 0x80; // 將數據放在value的最高位,達到保存數據的結果
SCLK=0;//時鐘信號為低,開始寫數據
SCLK=1; //時鐘線拿高
}
SCLK=0;
RST=0;//讀操作結束
IO =0;
return value; //返回讀出來的數據
}
uchar BCD_Decimal(uchar bcd)
{
uchar Decimal;
Decimal=bcd>>4;
return(Decimal=Decimal*10+(bcd&=0x0F));
}
/*************把要的時間 年月日 都讀出來***************/
void read_time()
{
sec = BCD_Decimal(read_1302(0x81));
min = BCD_Decimal(read_1302(0x83));
hour = BCD_Decimal(read_1302(0x85));
day = BCD_Decimal(read_1302(0x87));
mon = BCD_Decimal(read_1302(0x89));
year=BCD_Decimal(read_1302(0x8d));
week=BCD_Decimal(read_1302(0x8b));
// Conversion(0,year,mon,day); //農歷轉換
// n_year = year_moon ;
// n_mon = month_moon ;
// n_day = day_moon ;
}
//秒 分 時 日 月 年 星期
//uchar code write_add[]={0x80,0x82,0x84,0x86,0x88,0x8c,0x8a}; //寫地址
//uchar code read_add[] ={0x81,0x83,0x85,0x87,0x89,0x8d,0x8b}; //讀地址
//uchar code tab1[]={"2020-06-19 FRI"};
//uchar code tab2[]={"10:32:48"};
/*************把要寫的時間 年月日 都寫入ds1302里***************/
void write_time()
{
uchar temp;
write_1302(0x80,sec|0x00);//允許寫
write_1302(0x8e,0x00); //打開寫保護
sec= (tab2[6]-0x30)*10+(tab2[7]-0x30);
temp=(sec)/10*16+(sec)%10;
write_1302(0x80,0x00|temp);
min= (tab2[3]-0x30)*10+(tab2[4]-0x30);
temp=(min)/10*16+(min)%10;
write_1302(0x82,0x00|temp);
hour= (tab2[0]-0x30)*10+(tab2[1]-0x30);
temp=(hour)/10*16+(hour)%10;
write_1302(0x84,0x00|temp);
day= (tab1[8]-0x30)*10+(tab1[9]-0x30);
temp=(day)/10*16+(day)%10;
write_1302(0x86,0x00|temp);
mon= (tab1[5]-0x30)*10+(tab1[6]-0x30);
temp=(mon)/10*16+(mon)%10;
write_1302(0x88,0x00|temp);
write_1302(0x8e,0x80); //關閉寫保護
}
//*************把數據保存到ds1302 RAM中**0-31*************/
//void write_1302ram(uchar add,uchar dat)
//{
// add <<= 1; //地址是從第二位開始的
// add &= 0xfe; //把最低位清零 是寫的命令
// add |= 0xc0; //地址最高兩位為 1
// write_1302(0x8e,0x00);
// write_1302(add,dat);
// write_1302(0x8e,0x80);
//}
//*************把數據從ds1302 RAM讀出來**0-31*************/
//uchar read_1302ram(uchar add)
//{
// add <<= 1; //地址是從第二位開始的
// add |= 0x01; //把最高位置1 是讀命令
// add |= 0xc0; //地址最高兩位為 1
// return(read_1302(add));
//}
/*************初始化ds1302時間***************/
void init_ds1302()
{
RST = 0; //第一次讀寫數據時要把IO口拿低
SCLK=0;
IO= 0;
write_time();
}
#endif
|