/*DS1302測試程序程序功能:寫入
一個時間09年12月12日星期六21:21:00*/
#include "reg51.h"
#include <intrins.h>
#define uchar unsigned char
sbit we=P2^7;
sbit du=P2^6;
sbit DS1302_CLK = P1^0;
sbit DS1302_IO = P1^1;
sbit DS1302_RST = P1^2;
sbit ACC0=ACC^0;
sbit ACC7=ACC^7;
code unsigned char disptab[]={0x3f,0x6,0x5b,0x4f,0x66,
0x6d,0x7d,0x27,0x7f,0x6f,0x77,0x7c,0x39,0x5e,
0x79,0x71,0x0};
code unsigned char dispbit[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf};
uchar dispbuf[6];
unsigned char second,minute,hour,week,day,month,year; //秒、分、時、星期、日、月、年
unsigned char time[]={0x09,0x12,0x12,0x06,0x11,0x11,0x00}; //初始時間數(shù)組09年12月12日21點21分00秒
/****************************************************************************
函數(shù)功能:數(shù)碼管顯示子程序
入口參數(shù):
出口參數(shù):
****************************************************************************/
void display()
{
static uchar count=0;
unsigned char tmp;
P0=0x80;
we=1;
tmp=dispbit[count];
P0=P0|tmp;
we=0;
P0=disptab[16];
du=1;
tmp=dispbuf[count];
tmp=disptab[tmp];
P0=tmp;
du=0;
count++;
if(count==6)
{
count=0;
}
}
/*****************************************************************************
函數(shù)功能:向DS1302送一字節(jié)數(shù)據(jù)子程序
入口參數(shù):
出口參數(shù):
*****************************************************************************/
void InputByte(unsigned char byte1)
{ unsigned char i;
ACC=byte1;
for(i=8;i>0;i--)
{
DS1302_IO=ACC0;
DS1302_CLK=1;
DS1302_CLK=0;
ACC=ACC>>1;
}
return;
}
/*****************************************************************************
函數(shù)功能:讀DS1302一個字節(jié)子程序
入口參數(shù):
出口參數(shù):
*****************************************************************************/
unsigned char OutputByte()
{
unsigned char i;
for(i=8;i>0;i--)
{ ACC=ACC>>1;
ACC7=DS1302_IO;
DS1302_CLK=1;
DS1302_CLK=0;
}
return(ACC);
}
/*****************************************************************************
函數(shù)功能:向DS1302某地址寫一字節(jié)數(shù)據(jù)子程序
入口參數(shù):addr,TDat
出口參數(shù):
*****************************************************************************/
void write_ds1302(unsigned char addr,unsigned char TDat)
{
DS1302_RST=0;
_nop_();
DS1302_CLK=0;
_nop_();
DS1302_RST=1;
InputByte(addr);
_nop_();
InputByte(TDat);
DS1302_CLK=1;
_nop_();
DS1302_RST=0;
}
/*****************************************************************************
函數(shù)功能:讀DS1302地址子程序
入口參數(shù):add
出口參數(shù):timedata
*****************************************************************************/
unsigned char read_ds1302(unsigned char addr)
{
unsigned char timedata;
DS1302_RST=0;
_nop_();
DS1302_CLK=0;
_nop_();
DS1302_RST=1;
InputByte(addr);
timedata=OutputByte();
DS1302_CLK=1;
_nop_();
DS1302_RST=0;
return(timedata);
}
/*****************************************************************************
函數(shù)功能:初始化DS1302子程序
入口參數(shù):time[](全局變量)
出口參數(shù):
*****************************************************************************/
void initial_ds1302()
{
write_ds1302(0x8e,0x00); //寫保護寄存器,在對時鐘或RAM寫前WP一定要為0
write_ds1302(0x8c,time[0]); //年
write_ds1302(0x88,time[1]); //月
write_ds1302(0x86,time[2]); //日
write_ds1302(0x8A,time[3]); //星期
write_ds1302(0x84,time[4]); //時
write_ds1302(0x82,time[5]); //分
write_ds1302(0x80,time[6]); //秒
write_ds1302(0x8e,0x80); //寫保護寄存器
}
/*****************************************************************************
函數(shù)功能:讀DS1302時間子程序
入口參數(shù):
出口參數(shù):全局變量(second,minute,hour,week,day,month,year)
*****************************************************************************/
void read_time()
{
second=read_ds1302(0x81); //秒寄存器
minute=read_ds1302(0x83); //分
hour=read_ds1302(0x85); //時
week=read_ds1302(0x8B); //星期
day=read_ds1302(0x87); //日
month=read_ds1302(0x89); //月
year=read_ds1302(0x8d); //年
}
/*****************************************************************************
函數(shù)功能:主程序
入口參數(shù):
出口參數(shù):
*****************************************************************************/
void main()
{
initial_ds1302(); //初始化DS1302
while(1)
{
read_time();//讀取時間
dispbuf[5]=second%16;
dispbuf[4]=second/16;
dispbuf[3]=minute%16;
dispbuf[2]=minute/16;
dispbuf[1]=hour%16;
dispbuf[0]=hour/16;
display(); //顯示時間
}
}
|