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