当前位置: 代码迷 >> 单片机 >> ds1302实时时钟的
  详细解决方案

ds1302实时时钟的

热度:61   发布时间:2016-04-28 15:57:56.0
ds1302实时时钟的求助
在网上买的那种 做好的DS1302 模块,做了一个S52单片机的时钟,可是在读取时间时总是不对,显示乱七八糟的。
在网上搜了一些代码 修改后调试好事不正常。希望高人能给来一段代码。。。谢谢了。

要求显示在ST7920控制器的12864液晶屏上。

------解决方案--------------------
上代码:
#include <pic.h> 
#include "wash.h" 

#define i_o RA0 //定义DS1302的数据口
#define sclk RA1 //定义DS1302的时钟口
#define rst RA2 //定义DS1302的复位口

// unsigned char time_rx; 定义某个变量到指定的地址
unsigned char time_rx @ 0x30; //定义接收寄存器
static volatile bit time_rx7 @ (unsigned)&time_rx*8+7; //接收寄存器的最高位
//static volatile bit temp0 @ (unsigned)&temp*8+0;

static void port_init(); //申明引脚初始化函数
void ds1302_init(); //申明DS1302初始化函数
void set_time(); //申明设置时间函数
void get_time(); //申明读取时间函数
void display(); //申明显示函数
void time_write_1(unsigned char time_tx); //申明写一个字节函数
unsigned char time_read_1(); //申明读一个字节函数

//定义待设置的时间:秒、分、时、日、月、星期、年、控制字
const char table[]={0x00,0x58,0x12,0x05,0x3,0x03,0x12,0x00};
//定义读取时间和日期存放表格
char table1[7];

//---------------------------
//主函数
void main_trc(void)
{
port_init(); //调用引脚初始化函数
ds1302_init(); //调用DS1302初始化函数
set_time(); //调用设置时间函数
while(1)
{
get_time(); //调用取时间函数
display(); //调用显示函数
}
}

//---------------------------------------------
//DS1302初始化函数
void ds1302_init()
{
sclk=0; //拉低时钟信号
rst =0; //复位DS1302
rst=1; //使能DS1302
time_write_1(0x8e); //发控制命令
time_write_1(0); //允许写DS1302
rst=0; //复位
}

//---------------------------------------------
//设置时间函数
void set_time()
{
int i; //定义循环变量

rst=1; //使能DS1302
time_write_1(0xbe); //时钟多字节写命令
for(i=0;i<8;i++) //连续写8个字节数据
{
time_write_1(table[i]); //调用写一个字节函数
}
rst=0; //复位
}

//---------------------------------------------
//读取时间函数
void get_time()
{
int i; //设置循环变量
 
rst=1; //使能DS1302
time_write_1(0xbf); //发送多字节读取命令
for(i=0;i<7;i++) //连续读取7个字节数据
{
table1[i]=time_read_1(); //调用读取1个字节数据的函数
}
rst=0; //复位DS1302
}

//--------------------------------------------
//写一个字节数据函数
void time_write_1(unsigned char time_tx)
{
int j; //设置循环变量

for(j=0;j<8;j++) //连续写8bit
{
i_o=0; //先设置数据为0
sclk=0; //时钟信号拉低
if(time_tx&0x01) //判断待发送的数据位是0或1
{
i_o=1; //待发送数据位是1
}
time_tx=time_tx>>1; //待发送的数据右移1位
sclk=1; //拉高时钟信号
}
sclk=0; //写完一个字节,拉低时钟信号
}

//---------------------------------------------
//读一个字节函数
unsigned char time_read_1()
{
int j; //设置循环变量
  
for(j=0;j<8;j++) //连续读取8bit
{
sclk=0; //拉低时钟信号