這兩天在做51單片機考勤系統需要顯示時間,就用DS1302來做時鐘,本來都已經能正常顯示和改時間了,不知道出了什么問題,上電后年月日時分秒都顯示65:65:65了,換了一個DS1302也是這樣,請問什么情況會導致這樣,謝謝大家!我用的代碼貼在下面,但是之前本來是能顯示的,今天突然出的問題,接線也沒有變過,應該不是代碼的問題。。。
#include <reg52.h
#include <intrins.h>
#include "ds1302.h"
//設置時間,time[0]-time[6]數據存放順序為:秒,分,時,日,月,星期,年
unsigned char times[7]={00,30,23,12,6,6,10};
sbit SCLK=P0^3;
sbit IO=P0^2;
sbit RST=P0^1;
sbit ACC7=ACC^7;
sbit ACC0=ACC^0;
/*================================================================*/
/* 向1302當前地址處寫入1字節數據 */
/*================================================================*/
void write_1302_byte(unsigned char d)
{
unsigned char i;
ACC=d; //將8位數據寫入ACC
for(i=8;i>0;i--) //循環8次將ACC8位數據從低位到高位寫入1302
{
IO=ACC0; //將ACC的最低位轉送到IO口
SCLK=1; //上升沿寫入1位數據
SCLK=0;
ACC=ACC>>1; //將ACC次低位變為最低位
}
}
/*=================================================================*/
/*=================================================================*/
/* 從1302的當前地址處讀出1字節數據 */
/*=================================================================*/
unsigned char read_1302_byte(void)
{
unsigned char i;
for(i=8;i>0;i--)
{
ACC=ACC>>1;
ACC7=IO;
SCLK=1; //時鐘下降沿讀1位數據
SCLK=0;
}
return (ACC);
}
/*=================================================================*/
/*================================================================*/
/* 將數據Data寫入1302寄存器add處 */
/*================================================================*/
void write_1302_reg(unsigned char add,unsigned char d)
{
RST= 0;
SCLK=0;
RST= 1;
write_1302_byte(add); //將1302的指針移到add處
write_1302_byte(d); //往add處寫入數據
SCLK=1;
RST=0; //停止寫數據
}
/*=================================================================*/
/*==================================================================*/
/* 讀寄存器add處的值 */
/*==================================================================*/
unsigned char read_1302_reg(unsigned char add)
{
unsigned char d;
RST=0;
SCLK=0;
RST=1;
write_1302_byte(add);
d=read_1302_byte();
SCLK=1;
RST=0;
return (d);
}
/*=================================================================*/
/*===========================================================================================*/
/* 設置時間,time[0]-time[6]數據存放順序為:秒,分,時,日,月,星期,年 */
/*===========================================================================================*/
void write_1302_time(unsigned char *time)
{
unsigned char add=0x80; //地址add初值(秒),偶數地址為只寫
unsigned char i;
unsigned char timeBCD[7]; //用以存放time數據的BCD碼值
bdata unsigned char l,h; //單位變量,分別存放時間數據(8421BCD碼)的低4位和高4位
for(i=0;i<7;i++) //將時間數據轉為BCD碼放入timeBCD中
{
l=time[i]%10;
h=time[i]/10;
timeBCD[i]=h*16+l;
}
write_1302_reg(0x8e,0x00); //禁止寫
for(i=0;i<7;i++)
{
write_1302_reg(add,timeBCD[i]); //將時間數據寫入1302對應的寄存器
add+=2; //地址移動,確保地址為偶數
}
write_1302_reg(0x8e,0x80); //允許寫
}
/*===========================================================================================*/
/*=================================================================================================*/
/* 讀取當前時間 */
/*=================================================================================================*/
void read_1302_time(unsigned char time[])
{
unsigned char i;
unsigned char add=0x81; //設置地址add初值(秒),奇數為只讀
bdata unsigned char l,h; //單位變量,分別存放時間數據(8421BCD碼)的低4位和高4位,用以進行十進制轉換
write_1302_reg(0x8e,0x00); //禁止寫
for(i=0;i<7;i++)
{
time[i]=read_1302_reg(add); //將時間數據(8421BCD碼)從1302對應的寄存器中讀出
l=time[i]&0x0f; //l存放time的低4位,即個位
h=(time[i]>>4)&0x0f; //h存放time的高4位,即十位
time[i]=h*10+l; //時間數據以十進制形式放進time[i]中
add+=2; //地址移動,確保地址為奇數
}
}
|