“实时时钟”设计说明
1 相关资料下载:
2 程序设计框架说明
本案例程序设计主要分为:DS1302、数码管显示两个模块。
2.1宏定义
//宏定义
#define uchar unsigned char
#define uint unsigned int
//DS1302寄存器的定义
#define DS1302_second_write 0X80
#define DS1302_minutes_write 0X82
#define DS1302_hour_write 0X84
#define DS1302_date_write 0X86
#define DS1302_week_write 0X8A
#define DS1302_month_write 0X88
#define DS1302_year_write 0X8C
#define DS1302_second_read 0X81
#define DS1302_minutes_read 0X83
#define DS1302_hour_read 0X85
#define DS1302_date_read 0X87
#define DS1302_week_read 0X8B
#define DS1302_month_read 0X89
#define DS1302_year_read 0X8D
2.2引脚定义
/********DS1302*******/
sbitRTC_sclk = P1^5; //时钟线引脚,控制数据的输入与输出
sbitRTC_rst = P1^6; //CE线引脚,读、写数据时必须置为高电平
sbitRTC_io = P5^4; //实时时钟的数据线引脚
/********数码管显示******/
sbit led_sel = P2^3; //流水灯和数码管选通引脚
ucharwei[]={0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07};
ucharduan[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};
2.3变量定义
//定义时间结构体
typedef struct _systemtime_
{
uchar second;
uchar minute;
uchar hour;
uchar day;
uchar week;
uchar month;
uchar year;
}systemtime;
systemtime t;
uchar i;
uchar temp;
2.4 程序函数说明
DS1302读写函数
void DS1302WriteByte(uchar dat);
uchar DS1302ReadByte();
uchar DS1302Read(uchar cmd);
void DS1302Write(uchar cmd,uchar dat);
systemtime GetDA1302();
系统初始化
void init();
初始化DS1302
void Initial_DS1302(void);
中断显示程序
void timer0() interrupt 1
3 程序设计框架及关键技巧说明
3.1程序设计框架

3.2 I/O引脚及相关寄存器配置
2.2.1 I/O引脚:
(1)数码管位选引脚
整个设置P2口的值;
(2)数码管使能引脚
sbit led_sel = P2^3 ;
(3)DS1302引脚
sbit RTC_sclk=P1^5; //时钟线引脚
sbitRTC_rst=P1^6; // CE线引脚
sbit RTC_io=P5^4; //实时时钟的数据线引脚
2.2.2寄存器:
(1)DS1302相关寄存器

其中:
①控制字寄存器:写地址0x8E,读地址0x8F
位7:必须是逻辑1,如果它为0,则不能把数据写入到DS1302中。
位6:如果为0,则表示存取日历时钟数据,为1表示存取RAM数据;此程序中没有涉及RAM存取数据,所以位6置为0.
位5~位1(A4~A0) :指示操作单元的地址;
位0 :为0写操作,为1读操作。

②秒寄存器:
位7:时间暂停位,为1时钟振荡器停止工作,为0时,时钟振荡器启动;
初始化时,要启动时钟振荡器,在禁止写保护的情况下通过如下语句实现:
temp=ReadDS1302(DS1302_SECOND_READ)&0x7f;
WriteDS1302(0x80,temp);//晶振开始工作
③小时寄存器:
位7:12或24小时工作模式选择位,为1时12小时工作模式,此时位5为AM/PM位,低电平对应 AM,高电平对应PM;在 24 小时模式下,位5为第二个10小时位表示(20~23 时);
④写保护寄存器:
位7: WP 是写保护位,工作时除WP 外的其他位都置为0, 写操作之前WP必须为0,当WP 为1时不能进行写操作。
WriteDS1302(0x8E,0x00); //禁止写保护位
WriteDS1302(0x8E,0x80); //写保护位置1
(2) 定时器相关寄存器
其中
①TMOD寄存器:

初始化时,设置定时器0,工作模式1即16位不可重装载模式,TMOD= 0x01 ;
②IE寄存器:

初始化时,设置EA=1,打开总的中断,设置ET0=1开启定时器0的中断;
③TH0、TL0寄存器:
同时还要设置TH0、TL0的初始值;
④TCON寄存器:

初始化时,设置TR0=1启动定时器0

