ds1302驱动程序+lcd12864串行显示,使用结构体写,可读性更强

2020-01-23来源: 51hei关键字:ds1302  驱动程序  lcd12864  串行显示  结构体  可读性

ds1302.c

#include "ds1302.h"



// 定义RTC初始化结构体,决定了初始化时间

RTC_TIME rtc_time = {

    25,     // 秒

    35,     // 分

    02,     // 时

    25,     // 日

    4,      // 月

    4,      // 星期

    19      // 年

};


/*******************************************************************************

* 函 数 名         : bcd_to_hex

* 函数功能           : 从时钟芯片中读出的时间数据,需转换为十进制数。

* 输    入         : val:需要转换的值

* 输    出         : 无

*******************************************************************************/

static uint8_t bcd_to_hex(uint8_t val)

{

   uint8_t temp;

    

    temp = val & 0x0f;

    val >>= 4;

    val &= 0x0f;

    val *= 10;

    temp += val; 

    

    return temp;

}



/*******************************************************************************

* 函 数 名         : hex_to_bcd

* 函数功能           : 往时钟芯片写入数据时,需将待写的十进制数转换为8421码。

* 输    入         : val:需要转换的值

* 输    出         : 无

*******************************************************************************/

static uint8_t hex_to_bcd(uint8_t val)

{

    uint8_t i,j,k;

    

    i = val / 10;

    j = val % 10;

     k= j + (i << 4);

    

    return k;

}



/*******************************************************************************

* 函 数 名         : DS1302_Write

* 函数功能           : 向DS1302命令(地址+数据)

* 输    入         : addr,dat

* 输    出         : 无

*******************************************************************************/


static void DS1302_Write(uint8_t addr, uint8_t dat)

{

    uint8_t n;

    

    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;

        _nop_();

    }

    

    for (n=0; n<8; n++)//写入8位数据

    {

        DSIO = dat & 0x01;

        dat >>= 1;

        SCLK = 1;//数据在上升沿时,DS1302读取数据

        _nop_();

        SCLK = 0;

        _nop_();    

    }    

         

    RST = 0;//传送数据结束

    _nop_();

}


/*******************************************************************************

* 函 数 名         : DS1302_Read

* 函数功能           : 读取一个地址的数据

* 输    入         : addr

* 输    出         : dat

*******************************************************************************/


static uint8_t DS1302_Read(uint8_t addr)

{

    uint8_t n;

    uint8_t dat;

    uint8_t dat1;

    

    RST = 0;

    _nop_();


    /* 先将SCLK置低电平 */

    SCLK = 0;

    _nop_();

    

    /* 然后将RST(CE)置高电平 */

    RST = 1;

    _nop_();


    /* 开始传送八位地址命令 */

    for(n=0; n<8; n++)

    {

        DSIO = addr & 0x01; /* 数据从低位开始传送 */

        addr >>= 1;

        SCLK = 1;   /* 数据在上升沿时,DS1302读取数据 */

        _nop_();

        SCLK = 0;   /* DS1302下降沿时,放置数据 */

        _nop_();

    }

    _nop_();

    

    /* 读取8位数据 */

    for(n=0; n<8; n++)

    {

        dat1 = DSIO; /* 从最低位开始接收 */

        dat = (dat>>1) | (dat1<<7);

        SCLK = 1;

        _nop_();

        SCLK = 0;   /* DS1302下降沿时,放置数据 */

        _nop_();

    }

    

    /* 以下为DS1302复位的稳定时间,必须的 */

    RST = 0;

    _nop_();    

    SCLK = 1;

    _nop_();    

    DSIO = 0;

    _nop_();    

    DSIO = 1;

    _nop_();

    

    return dat;    

}


/*******************************************************************************

* 函 数 名         : DS1302_ReadTime

* 函数功能           : 读取时钟信息

* 输    入         : RTC_TIME类型的结构体指针,RTC_TIME的成员有:

                        rtc_sec    秒

                        rtc_min    分钟

                        rtc_hour   小时

                        rtc_date   日

                        rtc_month  月

                        rtc_day    星期

                        rtc_year   年

* 输    出         : 无

*******************************************************************************/

void DS1302_ReadTime(RTC_TIME *rtc_time)

{

    unsigned temp;

    

    temp = DS1302_Read(SEC_ADDR | 0x01);

    rtc_time->rtc_sec = bcd_to_hex(temp);

    

    temp = DS1302_Read(MIN_ADDR | 0x01);

    rtc_time->rtc_min = bcd_to_hex(temp);

    

    temp = DS1302_Read(HR_ADDR | 0x01);

    rtc_time->rtc_hour = bcd_to_hex(temp);

    

    temp = DS1302_Read(DATE_ADDR | 0x01);

    rtc_time->rtc_date = bcd_to_hex(temp);

    

    temp = DS1302_Read(MON_ADDR | 0x01);

    rtc_time->rtc_month = bcd_to_hex(temp);

    

    temp = DS1302_Read(DAY_ADDR | 0x01);

    rtc_time->rtc_day = bcd_to_hex(temp);

    

    temp = DS1302_Read(YEAR_ADDR | 0x01);

    rtc_time->rtc_year = bcd_to_hex(temp);

}

/*******************************************************************************

* 函 数 名         : DS1302_SetTime

* 函数功能           : 向DS1302写入时间

* 输    入         : RTC_TIME类型的结构体指针,RTC_TIME的成员有:

                        rtc_sec    秒

                        rtc_min    分钟

                        rtc_hour   小时

                        rtc_date   日

                        rtc_month  月

                        rtc_day    星期

                        rtc_year   年

* 输    出         : 无

*******************************************************************************/

void DS1302_SetTime(RTC_TIME *rtc_time)

{

    uint8_t temp;

    

    DS1302_Write(0x8E,0X00);         //禁止写保护,就是关闭写保护功能

    

    temp = hex_to_bcd(rtc_time->rtc_sec);

    DS1302_Write(SEC_ADDR, temp);

    

    temp = hex_to_bcd(rtc_time->rtc_min);

    DS1302_Write(MIN_ADDR, temp);

    

    temp = hex_to_bcd(rtc_time->rtc_hour);

    DS1302_Write(HR_ADDR, temp);

    

    temp = hex_to_bcd(rtc_time->rtc_date);

    DS1302_Write(DATE_ADDR, temp);

    

    temp = hex_to_bcd(rtc_time->rtc_month);

    DS1302_Write(MON_ADDR, temp);

    

temp = hex_

[1] [2] [3]
关键字:ds1302  驱动程序  lcd12864  串行显示  结构体  可读性 编辑:什么鱼 引用地址:http://news.eeworld.com.cn/mcu/ic486537.html 本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。

上一篇:51单片机串口通信Bad Apple视频播放源程序(LCD12864显示)
下一篇:STC89C52+LCD12864+DS1302+DS18B20时钟原理图+源程序

关注eeworld公众号 快捷获取更多信息
关注eeworld公众号
快捷获取更多信息
关注eeworld服务号 享受更多官方福利
关注eeworld服务号
享受更多官方福利

推荐阅读

STM8S105K4使用硬件SPI来读取LSM9DS1
STM8S105K4使用硬件spi读LSM9DS1的注意SPI配置的几个要素:MSB、主从、PHASE_EDGE、POLARITY、NSS ;主机时钟和SPI的速度的匹配,需要测试。STM8的spi初始化函数中的CRC是个什么鬼?SPI读取LSM9DS1时,需要先指定读取地址,然后再发一个直接的时序,读取该地址的数据。此时一定把第一次读地址的数据(虽然没有用)也读出来。代码SPI_Cmd(ENABLE);    CS_M_L;    while(SPI_GetFlagStatus(SPI_FLAG_TXE) == RESET);    SPI->DR
发表于 2020-02-20
基于单片机的火灾报警器设计
随着现代家庭用火、用电量的增加,家庭火灾发生的频率越来越高。火灾报警器也随之被广泛应用于各种场合。本课题所研究的无线多功能火灾报警器采用STC89C51为核心控制器,利用气体传感器MQ-2、ADC0832模数转换器、DS18B20温度传感器等实现基本功能。通过这些传感器和芯片,当环境中可燃气体浓度或温度等发生变化时系统会发出相应的灯光报警信号和声音报警信号,以此来实现火灾报警,智能化提示。 #include <reg52.h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义#include "intrins.h"       
发表于 2020-02-18
基于单片机的火灾报警器设计
基于PIC单片机的测温网络的开发
简介:介绍一种利用PIC单片机和DS18B20构造单总线测温网络的方法,文章给出了系统硬件结构和软件流程图。本测温网络应用在磁致伸缩液位传感器上,利用附在不锈钢管内壁的不同位置上的三个DS18B20,测量不同液位层的温度 。1硬件设计整个系统由上位机和下位机组成。上位机用PC机,下位机用PIC16C63(原理框图见图1)。系统硬件部分主要有PIC16C63、AT24C01、DS18B20、显示电路、电源电路、时钟电路和通信电路。用户需要时可通过上位机下达测量命令,下位机进行测量并把结果送给上位机或显示在液晶显示模块上。三个温度点任何一路发生故障,都会传给上位机一个默认值,用户可以据此在线更换新的温度传感器,系统能够自动找到并启用
发表于 2020-02-18
基于PIC单片机的测温网络的开发
AVR多功能实验箱DS1302时钟实验源码资源
/******************************************************************************************************************程序功能:DS1302时钟实验开发环境:WINAVR/GCC20100110硬件环境:eeskill多功能开发学习板/实验箱(2017版):ATMEGA16,12M晶振接线说明:使用杜邦线连接核心板PA0~PA2口与底板JP26具体接法,PA2-STCP,PA1-SHCP,PA0-DS使用杜邦线连接核心板PA3~PA5口与底板JP45具体接法,PA3-SCLK,PA4-IO,PA5-RST。跳线说明
发表于 2020-02-16
AVR多功能实验箱DS1302时钟实验源码资源
用51单片同时测温度(DS18B20)和频率(外部中断测)
=0; //因DS18B20对时序要求高且受中断影响,故先关闭总中断     read_temp();//读取温度     ds1820disp();//显示     CT_init();//定时计数器初始化          EA=1;//开总中断          EX0=1;//允许外部中断         IT0
发表于 2020-02-10
DS18B20多点测温源程序+proteus仿真工程
;"};/*uchar temp3[9]={"T3:      "};uchar temp4[9]={"T4:      "};uchar temp5[9]={"T5:      "};uchar temp6[9]={"Ta:      "};*/ uchar code ds_rom1[]={0x28,0x22,0x22,0x22,0x00,0x00,0x00,0xca};//U2ROMuchar code
发表于 2020-02-10
DS18B20多点测温源程序+proteus仿真工程
小广播
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号 电信业务审批[2006]字第258号函 京公海网安备110108001534 Copyright © 2005-2020 EEWORLD.com.cn, Inc. All rights reserved