本帖最后由 huhaomcu 于 2012-9-7 11:51 编辑
/*************************************************************************************************
程序功能:DS1302组成的万年历
**************************************************************************************************/
#include<reg52.h>
#include<1602.h>
#define uint unsigned int
#define uchar unsigned char
sbit sclk=P1^0;
sbit IO=P1^1;
sbit 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];
/sbit ACC0 = ACC^0;
sbit 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)]);
}
}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
一周热门 更多>