基于ds1302的51单片机简易实时时钟 1602显示 源程序
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
==================主程序=================
#include
#include "ds1302.h"
#include "LCD1602.h"
void change();
uchar times[9];
uchar date[9];
main()
{LCD_init();//LCD初始化
init_1302(time_1302);
gotoxy(1,1);
LCD_display("Time:");
gotoxy(1,2);
LCD_display("Date:");
times[8]='\0';//
date[8]='\0';
while(1)
{get_1302(time_1302);
change();
gotoxy(7,1);
LCD_display(times);
gotoxy(7,2);
LCD_display(date);
}
}
/*=========================== 转换子程序
===========================*/
void change()
{
// 时间的转换
times[0]=time_1302[2]/10+'0'; times[1]=time_1302[2]%10+'0'; times[2]=':';
times[3]=time_1302[1]/10+'0'; times[4]=time_1302[1]%10+'0'; times[5]=':';
times[6]=time_1302[0]/10+'0'; times[7]=time_1302[0]%10+'0';
// 日期的转换
date[0]=time_1302[6]/10+'0'; date[1]=time_1302[6]%10+'0'; date[2]='-';
date[3]=time_1302[4]/10+'0'; date[4]=time_1302[4]%10+'0';
date[5]='-';
date[6]=time_1302[3]/10+'0';
date[7]=time_1302[3]%10+'0';
}
========================================
==============DS1302驱动程序=============
#define uchar unsigned char
uchar time_1302[7]={0x00,0x00,0x00,0x03,0x07,0x03,0x08};//设置时间初始值数组// 秒分时号月份星期年
sbit T_IO=P1^0; //与硬件相关的连线clk为DS1302的时钟信号线sbit T_CLK=P1^1; //DAT为DS1302的I/O数据线
sbit T_RST=P1^2; //RST为DS1302的RST信号线ucharbdatadatbyte;
sbit datbyte0=datbyte^0;
sbit datbyte7=datbyte^7;
void get_1302(uchar time[]);
void write_ds1302(uchardat);
uchar r_1302(uchar add);
void w_1302(ucharadd,uchardat);
uchar read_ds1302(void);
void init_1302(uchar *time);
/*==========================================
D S 1 3 0 2 初始化
===========================================*/
void init_1302(uchar *time)
{uchar i, add;
//uchartime_bcd[7];
add=0x80;//0写入,1读出
w_1302(0x8e,0x00);
for(i=0;i<7;i++)
{w_1302(add,*time);
add+=2;
time++;
}
w_1302(0x8e,0x80);
}
//===========================
// 读取当前时间
//===========================
void get_1302(uchar time[])
{uchar i;
uchar add=0x81;
w_1302(0x8e,0x00);
for(i=0;i<7;i++)
{
time[i]=r_1302(add);
add+=2;
}
w_1302(0x8e,0x80);
}
/*================================= DS1302写入一个字节(上升沿有效)
=================================*/
void write_ds1302(uchardat)
{uchar i;
datbyte=dat;
for(i=0;i<8;i++)
{T_IO=datbyte0;
T_CLK=1;
T_CLK=0;
datbyte=datbyte>>1;
}
}
/*======================================= DS1302读取一个字节(下降沿有效)
=======================================*/
uchar read_ds1302(void)
{uchar i;
for(i=0;i<8;i++)
{datbyte=datbyte>>1;
datbyte7=T_IO;
T_CLK=1;
T_CLK=0;
}