本帖最后由 huhaomcu 于 2012-9-7 11:51 编辑
/*************************************************************************************************
程序功能:DS1302组成的万年历
**************************************************************************************************/
#include
#include<1602.h>
#define uint unsigned int
#define uchar unsigned char
***it sclk=P1^0;
***it IO=P1^1;
***it rst=P2^0;
uchar code table[]={15,25,35}; //初始时间值,秒,分 时
uchar code array[]={'0','1','2','3','4','5','6','7','8','9'};
uchar sheet[3];
/***it ACC0 = ACC^0;
***it ACC7 = ACC^7;
/*************************************************************************************************
* 名称:write_byte
* 说明
* 功能:往DS1302中写入1BYTE的数据
* 调用:
* 输入:写入的数据
* 返回值:无
*************************************************************************************************/
void wriet_byte(uchar temp)
{
uchar i;
ACC=temp;
for(i=8;i>0;i--)
{
IO=ACC0;
sclk=1;
sclk=0;
ACC=ACC>>1;
}
}
/************************************************************************************************
*
* 名称:read_byte
* 说明:
* 功能:从DS1302中读出1BYTE的数据
* 调用:
* 输入:
* 返回值: ACC
*************************************************************************************************/
uchar read_byte()
{
uchar i;
for(i=8;i>0;i--)
{
ACC=ACC>>1;
ACC7=IO;
sclk=1;
sclk=0;
}
return (ACC);
}
/*************************************************************************************************
*
* 名称:w_ds1302
* 功能:先写地址,再写数据
*
*************************************************************************************************/
void w_ds1302(uchar addr,uchar date)
{
rst=0;
sclk=0;
sclk=1;
wriet_byte(addr); //写地址
wriet_byte(date); //写数据
sclk=1;
rst=0;
}
/***********************************************************************************************
* 名称:r_ds1302
* 功能:先写地址,在读数据
***********************************************************************************************/
uchar r_ds1302(uchar addr)
{
uchar sum;
rst=0;
sclk=0;
rst=1;
wriet_byte(addr); //写地址
sum=read_byte(); //读数据
sclk=1;
rst=0;
sum=((sum&0x70)>>4)*10+(sum&0x0f); //BCD码转16进制
return (sum);
}
/***********************************************************************************************
* 名称:w_init
* 功能:将初始值写入到ds1302中
************************************************************************************************/
void w_init() //ds1302初始化操作
{
uchar i;
uchar addr=0x80;
w_ds1302(0x8e,0x00);
for(i=0;i<3;i++)
{
w_ds1302(addr,table);
addr=addr+2;
}
w_ds1302(0x8e,0x80);
}
/************************************************************************************************
* 名称:r_end
* 功能:读ds1302当前的值
*************************************************************************************************/
void r_end()
{
uchar i;
uchar add=0x81;
for(i=0;i<3;i++)
{
sheet= r_ds1302(add);
add=add+2;
}
}
/********************ds1302的操作结束*************************************************************/
void main()
{
init1602();
w_init();
while(1)
{
r_end();
write_com(0x80+0x0a);
write_data(array[(sheet[0]%10)]);
write_data(array[(sheet[0]/10)]);
write_data(':');
write_data(array[(sheet[1]%10)]);
write_data(array[(sheet[1]/10)]);
write_data(':');
write_data(array[(sheet[2]%10)]);
write_data(array[(sheet[2]/10)]);
}
}
2012-9-7 13:36:31
void w_ds1302(uchar addr,uchar date)
{
rst=0;
sclk=0;
sclk=1;
wriet_byte(addr); //写地址
wriet_byte(date); //写数据
sclk=1;
rst=0;
}
里面的slk=1;改为rst=1;
另外在初始化函数里再加个slk=0;试试看
void w_ds1302(uchar addr,uchar date)
{
rst=0;
sclk=0;
sclk=1;
wriet_byte(addr); //写地址
wriet_byte(date); //写数据
sclk=1;
rst=0;
}
里面的slk=1;改为rst=1;
另外在初始化函数里再加个slk=0;试试看
举报
2012-9-7 13:38:55
w_ds1302(addr,table);
这句改成w_ds1302(addr,table[i]);
w_ds1302(addr,table);
这句改成w_ds1302(addr,table[i]);
举报
2012-9-7 13:45:55
引用: Lovedanpianji 发表于 2012-9-7 13:38
w_ds1302(addr,table);
这句改成w_ds1302(addr,table);
还是不行,之前自己写了一个ds1302操作的程序,但也没反应,所以 这个程序关于ds1302的操作是我照书上写的,只有主程序是我自己写的,关于好个table是我复制掉了,原程序是写的table
,我想是不是主程序的逻辑有问题啊!!!!!!
引用: Lovedanpianji 发表于 2012-9-7 13:38
w_ds1302(addr,table);
这句改成w_ds1302(addr,table);
还是不行,之前自己写了一个ds1302操作的程序,但也没反应,所以 这个程序关于ds1302的操作是我照书上写的,只有主程序是我自己写的,关于好个table是我复制掉了,原程序是写的table
,我想是不是主程序的逻辑有问题啊!!!!!!
举报
2012-9-7 14:13:48
我没用过DS1302,但是写芯片驱动,我还是有点小心得的。
1,您的时钟电平宽度是否足够。
2,MCU向DS1302发送数据时,改变数据是在时钟高电平还是低电平期间?
您的代码里既有时钟高电平时改变数据,又有时钟低电平是改变数据。
3,当您启动发送时,您是否考虑到应先让所有信号线无效这一情况?看您的代码,似乎没有处理啊。
4,DS1302的CS变高到时钟变高或变低的延时您是否考虑到了。
5,说一下代码风格的问题,每个函数有注释,很好的习惯,但是没说明白入口参数的意义,合法值;
出口参数的意义哦。
我没用过DS1302,但是写芯片驱动,我还是有点小心得的。
1,您的时钟电平宽度是否足够。
2,MCU向DS1302发送数据时,改变数据是在时钟高电平还是低电平期间?
您的代码里既有时钟高电平时改变数据,又有时钟低电平是改变数据。
3,当您启动发送时,您是否考虑到应先让所有信号线无效这一情况?看您的代码,似乎没有处理啊。
4,DS1302的CS变高到时钟变高或变低的延时您是否考虑到了。
5,说一下代码风格的问题,每个函数有注释,很好的习惯,但是没说明白入口参数的意义,合法值;
出口参数的意义哦。
举报
2012-9-7 14:31:01
引用: 3htech 发表于 2012-9-7 14:13
我没用过DS1302,但是写芯片驱动,我还是有点小心得的。
1,您的时钟电平宽度是否足够。
谢谢您!我一直对写一些有时序问题的程序时总是喜欢出错,看其它写的程序,感觉一个人一个样,有时甚至发现他们写的和时序图上的还对不上,可就能操作,而我自己写时,对着时序图一点一点的写,可就是没反应,您有一些关于看时序图的经验吗?
引用: 3htech 发表于 2012-9-7 14:13
我没用过DS1302,但是写芯片驱动,我还是有点小心得的。
1,您的时钟电平宽度是否足够。
谢谢您!我一直对写一些有时序问题的程序时总是喜欢出错,看其它写的程序,感觉一个人一个样,有时甚至发现他们写的和时序图上的还对不上,可就能操作,而我自己写时,对着时序图一点一点的写,可就是没反应,您有一些关于看时序图的经验吗?
举报