* 函数功能 : 读取一个地址的数据 * 输 入 : addr * 输 出 : dat
*******************************************************************************/
uchar Ds1302Read(uchar addr) {
uchar n,dat,dat1; RST = 0; _nop_();
SCLK = 0;//先将SCLK置低电平。 _nop_();
RST = 1;//然后将RST(CE)置高电平。 _nop_();
for(n=0; n<8; n++)//开始传送八位地址命令 { DSIO = addr & 0x01;//数据从低位开始传送 addr >>= 1; SCLK = 1;//数据在上升沿时,DS1302读取数据 _nop_(); SCLK = 0;//DS1302下降沿时,放置数据 _nop_(); }
_nop_();
for(n=0; n<8; n++)//读取8位数据 { dat1 = DSIO;//从最低位开始接收 dat = (dat>>1) | (dat1<<7); SCLK = 1; _nop_(); SCLK = 0;//DS1302下降沿时,放置数据 _nop_(); }
RST = 0;
_nop_(); //以下为DS1302复位的稳定时间,必须的。 SCLK = 1; _nop_(); DSIO = 0; _nop_(); DSIO = 1;
27
_nop_(); return dat; }
/*******************************************************************************
* 函 数 名 : Ds1302Init * 函数功能 : 初始化DS1302. * 输 入 : 无 * 输 出 : 无
*******************************************************************************/
void Ds1302Init() {
uchar n;
Ds1302Write(0x8E,0X00); //禁止写保护,就是关闭写保护功能 for (n=0; n<7; n++)//写入7个字节的时钟信号:分秒时日月周年 { Ds1302Write(WRITE_RTC_ADDR[n],TIME[n]); }
Ds1302Write(0x8E,0x80); //打开写保护功能 }
/*******************************************************************************
* 函 数 名 : Ds1302ReadTime * 函数功能 : 读取时钟信息 * 输 入 : 无 * 输 出 : 无
*******************************************************************************/
void Ds1302ReadTime() {
uchar n;
for (n=0; n<7; n++)//读取7个字节的时钟信号:分秒时日月周年 { TIME[n] = Ds1302Read(READ_RTC_ADDR[n]); } }
void LcdDisplay()
28
{
LcdWriteCom(0x80+0X40);
LcdWriteData('0'+TIME[2]/16); LcdWriteData('0'+(TIME[2]&0x0f)); LcdWriteData('-');
LcdWriteData('0'+TIME[1]/16); LcdWriteData('0'+(TIME[1]&0x0f)); LcdWriteData('-');
LcdWriteData('0'+TIME[0]/16); LcdWriteData('0'+(TIME[0]&0x0f));
LcdWriteCom(0x80); LcdWriteData('2'); LcdWriteData('0');
LcdWriteData('0'+TIME[6]/16); LcdWriteData('0'+(TIME[6]&0x0f)); LcdWriteData('-');
LcdWriteData('0'+TIME[4]/16); LcdWriteData('0'+(TIME[4]&0x0f)); LcdWriteData('-');
LcdWriteData('0'+TIME[3]/16); LcdWriteData('0'+(TIME[3]&0x0f)); LcdWriteCom(0x8D);
LcdWriteData('0'+(TIME[5]&0x07)); }
void main() {
LcdInit(); Ds1302Init(); while(1) { Ds1302ReadTime(); LcdDisplay(); } }
//时 //分
//秒
//年
//月
//日
//星期
29
附录四 元器件清单及其实物图
元器件名称 洞洞板 电解电容 100uF + 10uF STC89C52RC单片机+底座 瓷片电容 10uF + 30pF 自锁开关 按键 COM口 电阻 10K+1K USB-B 3V电子 MAX232+底座 DS1302 +底座 LED红 排针 排针插 LCD1602液晶
数量 1 1+1 1+1 7+3 1 1 1 2+10 1 1 1+1 1+1 1 2 1 1
附图3采购的元器件清单
30
附图 4 实物图
31