这两天在做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; //地址移动,确保地址为奇数
}
}
|