目录
一、竞赛板DS1302相关资料解析
DS1302是一款SPI总线的数字数字时钟芯片,竞赛现场提供了电路接口(竞赛板的店原理图)、DS1302芯片资料(英文版)、基础程序模块(SPI总线驱动程序)。下面从竞赛的视角地掌握这些,快速地写出应用程序。
1、DS1302硬件接口
从图中可见,DS1302的与CPU芯片接口电路用了3个I/O口线:P1.7时钟线,P2.3数据线,P1.3控制DS1302复位。在编写程序时对它们进行设置。
2、DS1302模块程序
竞赛现场提供了底层驱动程序,以C语言形式编写,具体模块如下:
void Write_Ds1302_Byte(unsigned char temp) ;//DS1302写字节函数
void Write_Ds1302( unsigned char address,unsigned char dat ); //向DS1302内部寄存器地址写数据
unsigned char Read_Ds1302 ( unsigned char address ); //从DS1302内部地址读出数据
在了解DS1302芯片资料后就可以根据上述函数快速地编写应用程序。
3、DS1302芯片资料解读
DS1302的操作时序是标准的SPI时序,软件模块提供的函数就是按照工作时序编写的,竞赛现场只要掌握函数功能即可。上述函数涉及的DS1302地址是RTC信息的地址,地址如下表所示:
其中:第一列是读地址,第二列是写地址。80h、81h是秒信息地址,80h是写入信息地址,81h是读出信息地址。需要注意的是RTC信息在DS1302内部都是BCD码形式。其它分、时、日期等与秒信息类似,不在赘述。
地址8Eh、8Fh中的WP位,WP:WRITE-PROTECT,写保护位。WP为1时,写保护,在设置RTC信息时,先需要清楚写保护,写结束后在恢复为1。
二、程序设计
1、完善单总线模块程序
(1)新建DS1302.C模块同名的头文件
在头文件中对C函数进行声明,程序如下:
#ifndef __DS1302_H
#define __DS1302_H
#include "stc15f2k60s2.h"
#include "intrins.h"
//函数声明
void Write_Ds1302_Byte(unsigned char temp) ;//DS1302写字节函数
//向DS1302内部寄存器地址写数据
void Write_Ds1302( unsigned char address,unsigned char dat );
unsigned char Read_Ds1302 ( unsigned char address ); //从DS1302内部地址读出数据
//新建设置RTC函数,参数时、分、秒
void SetRTC(unsigned char Hour,unsigned char Minute,unsigned char Second);
#endif
(2)在DS1302.C文件添加设置RTC函数
引用寄存器定义头文件,硬件P1.7、P2.3、P1.3口进行定义,新增加设置RTC函数。新增部分程序如下:
#include "ds1302.h"
sbit SCK=P1^7; //时钟线
sbit SDA=P2^3; //数据线
sbit RST = P1^3; // DS1302复位
//新建设置RTC函数,参数时、分、秒
void SetRTC(unsigned char Hour,unsigned char Minute,unsigned char Second)
{
Write_Ds1302(0x8E,0X00); //清除写保护
Write_Ds1302(0x80,Second); //写入秒(BCD码)
Write_Ds1302(0x82,Minute); //写入分(BCD码)
Write_Ds1302(0x84,Hour); //写入时(BCD码)
Write_Ds1302(0x8E,0x80); //恢复写保护
}
2、主函数中调用读温度函数
在主函数调用开头调用设置RTC函数,参数时分秒为BCD码——23时59分50秒。读RTC在主循环中直接调用读DS1302函数,分别读出时分秒信息。修改后的主函数如下:
#include "stc15f2k60s2.h"
#include "dis.h"
#include "key.h"
#include "ds1302.h"
void main()
{
SetRTC(0x23,0x59,0x50);//设置RTC 时分秒--BCD码
while(1)
{
dis();//数码管显示
key();//键盘
R_Second=Read_Ds1302(0x81); //读秒信息
R_Minute=Read_Ds1302(0x83); //读分信息
R_Hour=Read_Ds1302(0x85); //读时信息
}
}
3、数码管函数修改
在数码管函数的开头将主函数读取的时分秒信息BCD码拆分送数码管显示,
新增程序如下:
Led1=R_Hour/16;
Led2=R_Hour%16; //时信息拆分送显示
Led3=11; //分隔符 -
Led4=R_Minute/16;
Led5=R_Minute%16; //分信息拆分送显示
Led6=11; //分隔符 -
Led7=R_Second/16;
Led8=R_Second%16; //秒信息拆分送显示