蓝桥杯单片机竞赛--DS1302时钟显示

目录

一、竞赛板DS1302相关资料解析

1、DS1302硬件接口

2、DS1302模块程序

3、DS1302芯片资料解读

二、程序设计

1、完善单总线模块程序

(1)新建DS1302.C模块同名的头文件

(2)在DS1302.C文件添加设置RTC函数

2、主函数中调用读温度函数

3、数码管函数修改

程序包链接


一、竞赛板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;  //秒信息拆分送显示

程序包链接

https://download.csdn.net/download/weikangcekong/89560013

  • 7
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值