程序如下:
#include //包含单片机寄存器的头文件
#include //包含_nop_()函数定义的头文件
#define uchar unsigned char
#define uint unsigned int
/* 变量定义 -----------------------------------------------*/
***it SCK=P1^5; //时钟
***it SDA=P1^7; //数据
***it RST=P1^6;// DS1302复位
//________________常数宏_______________//
#define DS1302_SECOND_WRITE 0X80 //写时钟芯片的寄存器位置
#define DS1302_MINUTE_WRITE 0X82
#define DS1302_HOUR_WRITE 0X84
#define DS1302_WEEK_WRITE 0X8A
#define DS1302_DAY_WRITE 0X86
#define DS1302_MONTH_WRITE 0X88
#define DS1302_YEAR_WRITE 0X8D
#define DS1302_SECOND_READ 0X81 //读时钟芯片的寄存器位置
#define DS1302_MINUTE_READ 0X83
#define DS1302_HOUR_READ 0X85
#define DS1302_WEEK_READ 0X8B
#define DS1302_DAY_READ 0X87
#define DS1302_MONTH_READ 0X89
#define DS1302_YEAR_READ 0x8D
unsigned char code dm[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,
0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E,0xbf};
unsigned char const positon[]= {0xfe,0xfd,0xfb,0xf7};// 0xfe,0xfd,0xfb,0xf7
unsigned char clock_2[4]={0};
extern struct
{
unsigned char second;
unsigned char minute;
unsigned char hour;
unsigned char day;
unsigned char week;
unsigned char month;
unsigned char year;
}currenttime;
/*
********************************************************************************
** 函数名称 : Write_Ds1302_Byte(unsigned char temp)
** 函数功能 : 写一个字节
********************************************************************************
*/
extern void smgSaoMiao (void) //数码管扫描函数
{
static unsigned char i=0;
P2=0XFF;
P0=dm[clock_2[i]];
P2=positon[i];
if(++i>=4) i=0;
}
void Write_Ds1302_Byte(unsigned char temp)
{
uchar i;
for (i=0;i<8;i++) //循环8次 写入数据
{
SCK=0;
SDA=temp&0x01; //每次传输低字节
temp>>=1; //右移一位
SCK=1;
}
}
/*
********************************************************************************
** 函数名称 : Write_Ds1302( uchar address,uchar dat )
** 函数功能 : 写入DS1302
********************************************************************************
*/
void Write_Ds1302( uchar address,uchar dat )
{
RST=0;
_nop_();
SCK=0;
_nop_();
RST=1;
_nop_(); //启动
Write_Ds1302_Byte(address); //发送地址
Write_Ds1302_Byte(dat); //发送数据
RST=0; //恢复
}
/*
********************************************************************************
** 函数名称 : Read_Ds1302 ( uchar address )
** 函数功能 : 读出DS1302数据
********************************************************************************
*/
uchar Read_Ds1302 ( uchar address )
{
uchar i,temp=0x00;
RST=0;
_nop_();
_nop_();
SCK=0;
_nop_();
_nop_();
RST=1;
_nop_();
_nop_();
Write_Ds1302_Byte(address);
for (i=0;i<8;i++) //循环8次 读取数据
{
if(SDA)
temp|=0x80; //每次传输低字节
SCK=0;
temp>>=1; //右移一位
_nop_();
_nop_();
_nop_();
SCK=1;
}
RST=0;
_nop_(); //以下为DS1302复位的稳定时间
_nop_();
RST=0;
SCK=0;
_nop_();
_nop_();
_nop_();
_nop_();
SCK=1;
_nop_();
_nop_();
SDA=0;
_nop_();
_nop_();
SDA=1;
_nop_();
_nop_();
return (temp); //返回
}
/*
********************************************************************************
** 函数名称 :delay(uint z)
** 函数功能 : 延时函数 延时0.1ms个单位
********************************************************************************
*/
void delay(uint z)
{{ while(z--);
}
}
/**********************************************************/
// 初始化DS1302
/**********************************************************/
void v_clocklnit_f(void)
{
Write_Ds1302(0x8e,0x00);
Write_Ds1302(DS1302_YEAR_WRITE, 0x01 ); //年
Write_Ds1302(DS1302_WEEK_WRITE, 0x01 ); //星期
Write_Ds1302(DS1302_MONTH_WRITE, 0x01 ); //月
Write_Ds1302(DS1302_DAY_WRITE, 0x01 ) ; //日
Write_Ds1302(DS1302_HOUR_WRITE, 0x13 ) ; //小时
Write_Ds1302(DS1302_MINUTE_WRITE, 0x56 ) ; //分钟
Write_Ds1302(DS1302_SECOND_WRITE, 0x50 ) ; //秒
Write_Ds1302(0x90, 0xa5 ) ; //充电
Write_Ds1302(0xc0, 0xf0 ) ; //判断是否初始化一次标识写入
// v_ds1302writebyte_f(0x8e, 0x80 ) ; //禁止写操作
}
void v_ClockUpdata_f( )
{
currenttime.second=Read_Ds1302(DS1302_SECOND_READ);
currenttime.minute=Read_Ds1302( DS1302_MINUTE_READ ) ;
currenttime.hour=Read_Ds1302( DS1302_HOUR_READ ) ;
currenttime.day=Read_Ds1302( DS1302_DAY_READ);
currenttime.month=Read_Ds1302(DS1302_MONTH_READ);
currenttime.week=Read_Ds1302(DS1302_WEEK_READ);
currenttime.year=Read_Ds1302(DS1302_YEAR_READ);
}
/*
********************************************************************************
** 函数名称 : main(void)
** 函数功能 : 主函数
********************************************************************************
*/
void main(void)
{
v_clocklnit_f();
P1=0xfe;
TMOD=0x11;
TH0=0xec;
TL0=0x78;
EA=1;
ET0=1;
TR0=1;
while(1)
{
smgSaoMiao();
}
}
void ZhongDuan1 (void) interrupt 1 using 3
{
static unsigned int jishu=1;
// unsigned int ADshuju;
TH0=(65535-2000)/256;
TL0=(65535-2000)%256;
if(++jishu>=500)
{
jishu=0;
v_ClockUpdata_f( );
clock_2[3]=currenttime.hour/16;
clock_2[2]=currenttime.hour%16;
clock_2[1]=currenttime.minute/16;
clock_2[0]=currenttime.minute%16;
}
}
|