首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 嵌入开发 > 单片机 >

ds1302实时时钟的

2012-05-20 
ds1302实时时钟的求助在网上买的那种 做好的DS1302 模块,做了一个S52单片机的时钟,可是在读取时间时总是不

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; //拉低时钟信号


time_rx=time_rx>>1; //接收寄存器右移1位
time_rx7=i_o; //把接收到的数据放到接收寄存器的最高位
sclk=1; //拉高时钟信号
}
sclk=0; //拉低时钟信号
return(time_rx); //返回读取到的数据
}

//--------------------------------------------
//引脚定义函数
static void port_init()
{
TRISA &= ~0XD0; //RA0-RA2方向输出
}
//-------------------------------------------
//显示函数
//-------------------------------------------
void display()
{
char location = 0;
int i; //定义查表变量
//if(RB1==0) //判断RB1是否按下,如果按下的话显示日期,不按下显示时间
{
// table1[0]=table1[3]; //年月日
// table1[1]=table1[4];
// table1[2]=table1[6];
}
i=table1[0]&0x0f; //求秒的个位
location = 5;
Disp_Num(i,2,location * 8 ,PAGE_LEFT);
 
i=table1[0]&0xf0; //求秒的十位
location = 4;
Disp_Num(i/16 ,2,location * 8 ,PAGE_LEFT);
 

i=table1[1]&0x0f; //求分的个位
location = 3;
Disp_Num(i,2,location * 8 ,PAGE_LEFT);

i=table1[1]&0xf0; //求分的十位
location = 2;
Disp_Num(i/16,2,location * 8 ,PAGE_LEFT); // i=i>>4;

i=table1[2]&0x0f; //求时的个位
location = 1;
Disp_Num(i,2,location * 8 ,PAGE_LEFT);

i=table1[2]&0xf0; //求时的十位
location = 0;
Disp_Num(i/16,2,location * 8 ,PAGE_LEFT);
}

好用,验证过的

热点排行