具体ds1302的原理可以查阅相关中文资料:
ds1302使用的流程具体为:

  1. 向ds1302写入命令及初始时间,初始化ds1302。
  2. 向ds1302写入命令并读取ds1302寄存器中的时间。
  3. 将读取的时间保存到数组,或传输到电脑,oled等。

检测ds1302是否正常使用一般使用uart通讯,将结果传输到电脑上,用电脑串口助手检测。

但使用网上的代码经常会出现的问题就是传输值总为1,总结了一下有这么几种情况:

  1. 读取数据时要新建一个都为0的数组保存,或是用结构体指针来保存。
  2. stm8内在读取gpio口电平库函数出现问题。
  3. 接线没有接到对应设定的gpio口上。
  4. 写入命令,数据函数有问题。
  5. 读取函数数组干扰。

数据保存问题:
unsigned char READ_RTC_ADDR[7] = {0x81, 0x83, 0x85, 0x87, 0x89, 0x8b, 0x8d};
unsigned char WRITE_RTC_ADDR[7] = {0x80, 0x82, 0x84, 0x86, 0x88, 0x8a, 0x8c};
unsigned char WTIME[7] = {0X00, 0X30, 0X20, 0X25, 0X07, 0X03, 0X18};
unsigned char RTime[7] = {0,0,0,0,0,0,0};`
第一个数组为读取时间时需要写入的命令;
第二个数组为写入初始值时需要写入的命令;
第三个数组为初始时间;
第四个数组为读取后保存时间的数组。
或是:

typedef struct _DS1302_TIME
{unsigned char year;unsigned char month;unsigned char day;unsigned char week;unsigned char hour;unsigned char minute;unsigned char second;
}DS1302_TIME;

读取端口电平函数问题:
在stm8自带的库函数中,找到stm8s_gpio.c这个文件,找到:

BitStatus GPIO_ReadInputPin(GPIO_TypeDef* GPIOx, GPIO_Pin_TypeDef GPIO_Pin)
{return ((BitStatus)(GPIOx->IDR & (uint8_t)GPIO_Pin));
}

将这段代码改为:

BitStatus GPIO_ReadInputPin(GPIO_TypeDef* GPIOx, GPIO_Pin_TypeDef GPIO_Pin)
{return ((GPIOx->IDR & (uint8_t)GPIO_Pin) ? SET : RESET);
}

就可以正常读取电平。`

写入函数问题:
一般51,32中的读写函数为:

void Ds1302Write( unsigned char addr, unsigned char dat)
{unsigned char n;DS1302_DSIO_OUT();DS1302_DSIO_0();DS1302_RST_0();DS1302_SCLK_0();DS1302_RST_1();for (n=0; n<8; n++){if(addr & 0x01){DS1302_DSIO_1();}else {DS1302_DSIO_0();}     DS1302_SCLK_1();asm("nop");DS1302_SCLK_0();asm("nop");addr >>= 1;}for (n=0; n<8; n++){   if(dat & 0x01){DS1302_DSIO_1();}else {DS1302_DSIO_0();}asm("nop");DS1302_SCLK_0();asm("nop");dat >>= 1;}          DS1302_RST_0();asm("nop");
}

其中DS1302_DSIO_1();是设置连接ds1302的DSIO口的端口为高电平,0为设置低电平。
将其改为:

/*******************************************************************************
*****函数名:DS1302_Write_Byte
*****函数功能:写入动作数据
*****输入:想要写入的数据
*****输出:无
*****说明:无
*******************************************************************************/
void DS1302_Write_Byte(unsigned char temp)
{
    unsigned char i;
    for (i = 0; i < 8; i++) {                Delay_us(50);
        GPIO_LOW(DS1302_PORT, DS1302_CLK_PIN);
        if (temp & 0X01) {               GPIO_HIGH(DS1302_PORT, DS1302_IO_PIN);
        }
        else {            GPIO_LOW(DS1302_PORT, DS1302_IO_PIN);
        }
        temp >>= 1;
                Delay_us(50);
        GPIO_HIGH(DS1302_PORT, DS1302_CLK_PIN);
    }}/*******************************************************************************
*****函数名:DS1302_Read_Byte
*****函数功能:读出动作数据
*****输入:无
*****输出:读出的数据
*****说明:返回一个八位的二进制数
*******************************************************************************/
unsigned char DS1302_Read_Byte(void)
{
    unsigned char i, temp = 0;
    for (i = 0; i < 8; i++) {                Delay_us(50);
        GPIO_LOW(DS1302_PORT, DS1302_CLK_PIN);
        temp >>= 1;
        if (GPIO_ReadInputPin(DS1302_PORT, DS1302_IO_PIN))
        {            temp|=0X80;
        }
                Delay_us(50);
        GPIO_HIGH(DS1302_PORT, DS1302_CLK_PIN);
    }
    return temp;
}/*******************************************************************************
*****函数名:DS1302_Write
*****函数功能:写入数据
*****输入:地址 写入的数据
*****输出:无
*****说明:无
*******************************************************************************/
void DS1302_Write(u8 address, u8 dat)
{
    Write_IO();
    GPIO_LOW(DS1302_PORT,  DS1302_CS_PIN);
    GPIO_LOW(DS1302_PORT, DS1302_CLK_PIN);
    GPIO_HIGH(DS1302_PORT, DS1302_CS_PIN);
    Delay_us(10);
    DS1302_Write_Byte(address);
    DS1302_Write_Byte(dat);
    Delay_us(10);
    GPIO_LOW(DS1302_PORT, DS1302_CS_PIN);
}/*******************************************************************************
*****函数名:DS1302_Read
*****函数功能:读出数据
*****输入:地址
*****输出:读出的数据
*****说明:返回一个八位的二进制数
*******************************************************************************/
unsigned char DS1302_Read(u8 address)
{
    u8 ret;
    Write_IO();
    GPIO_LOW(DS1302_PORT,  DS1302_CS_PIN);
    GPIO_LOW(DS1302_PORT, DS1302_CLK_PIN);
    GPIO_HIGH(DS1302_PORT, DS1302_CS_PIN);
        Delay_us(10);
    DS1302_Write_Byte(address | 0X01);
    Read_IO();
    ret = DS1302_Read_Byte();
        Delay_us(10);
    GPIO_LOW(DS1302_PORT,  DS1302_CS_PIN);
    return ret;
}

GPIO_HIGH等就是stm8库函数的基本使用,DS1302_PORT,DS1302_CS_PIN是端口定义。

数组干扰问题:
有时候会有一种情况就是,在读取的时候,读取完年,保存年的数组是正确的,但读取月时,年的数据也会被改变(这个我也还没搞清楚为什么),这个时候要读取一次输出一次,就可以保存正确的数据。

/*******************************************************************************
*****函数名:DS1302_Read_TIME系列
*****函数功能:读当前的时间
*****输入:结构指针类型time
*****输出:无
*****说明:无
*******************************************************************************/
void DS1302_Read_Year(DS1302_TIME* time)
{
        time->year = DS1302_Read( DS1302_YEAR_REG);
}
void DS1302_Read_Month(DS1302_TIME* time)
{
        time->month = DS1302_Read(DS1302_MONTH_REG);
}
void DS1302_Read_Day(DS1302_TIME* time)
{
        time->day = DS1302_Read(DS1302_DATE_REG);
}
void DS1302_Read_Week(DS1302_TIME* time)
{
        time->week = DS1302_Read(DS1302_DAY_REG);
}
void DS1302_Read_Hour(DS1302_TIME* time)
{
        time->hour = DS1302_Read(DS1302_HR_REG);
}
void DS1302_Read_Minute(DS1302_TIME* time)
{
        time->minute = DS1302_Read(DS1302_MIN_REG);
}
void DS1302_Read_Second(DS1302_TIME* time)
{
        time->second = DS1302_Read(DS1302_SEC_REG);
}

stm8的ds1302时钟传输总为1的问题整合相关推荐

  1. 单片机课程设计——《基于AT89S52单片机和DS1302时钟芯片的电子时钟(可蓝牙校准)》...

    引言 本设计以AT89S52单片机为控制核心,时钟芯片DS1302提供时钟源,配合LCD1602液晶显示模块,组成基本硬件系统,同时利用HC-05嵌入式蓝牙串口通讯模块,可在手机端进行日期.时间的校准 ...

  2. 【蓝桥杯单片机】DS1302时钟芯片+DS18B20单总线温度传感器(官方驱动源码改写)

    实验开发板为CT107D蓝桥官方板,编译环境为MDK5 采用蓝桥官方驱动改写 目录 一.DS1302时钟芯片 二.DS18B20温度传感器 一.DS1302时钟芯片 CE 复位脚 I/O 数据输入/输 ...

  3. 单片机课程设计——《基于AT89S52单片机和DS1302时钟芯片的电子时钟(可蓝牙校准)》... 1

    引言 本设计以AT89S52单片机为控制核心,时钟芯片DS1302提供时钟源,配合LCD1602液晶显示模块,组成基本硬件系统,同时利用HC-05嵌入式蓝牙串口通讯模块,可在手机端进行日期.时间的校准 ...

  4. STC12C5A60S2软件模式SPI读取DS1302时钟实时显示在1602

    文章目录 SPI总线的概念 什么是实时时钟 DS1302介绍 DS1302寄存器 Ds1302附加31字节静态RAM 时序图和控制指令 参考例程 SPI总线的概念 SPI接口全称"seria ...

  5. 【C51单片机学习笔记--DS1302时钟芯片蜂鸣器I2C总线AT24C02存储器】

    C51单片机学习笔记–DS1302时钟芯片&&蜂鸣器&&I2C总线&&AT24C02存储器 文章目录 一.DS1302时钟芯片介绍 二.DS1302时钟 ...

  6. 基于51单片机、DS1302时钟模块的电子闹钟设计

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 一.设计原理 1.DS1302介绍 2.闹钟音乐播放原理 二.程序设计 1.DS1302.h 2.ds1302.c 3.mu ...

  7. DS1302时钟与LCD1602液晶显示

    DS1302时钟 DS1302是一个实时时钟芯片,它在实时显示时间中应用.它可以对年.月.日.周.时.分.秒进行计时. DS1302的引脚及原理图如下: 它与CPU的连接需要SCLK(7).I/O(6 ...

  8. DS1302时钟芯片使用介绍

    DS1302实时时钟芯片简介 DS1302是由美国DALLAS公司推出的具有涓细电流充电能力的低功耗实时时钟芯片.它可以对年.月.日.周.时.分.秒进行计时,并且具有闰年补偿等多种功能.采用串行数据传 ...

  9. 跨时钟传输——多比特

    目录 跨时钟传输中,亚稳态是如何形成的? 多比特的跨时钟传输--数据准确性以及关联性问题 如何解决多比特跨时钟传输中的数据准确性问题? 方法一:多比特信号合成单比特信号 方法二:MUX/DMUX同步器 ...

最新文章

  1. python位运算符
  2. sqlite3 内存持续增加_sqlite3使用简介(内含解决sqlite内存的方法)
  3. Scala apply()方法用于创建伴生类对象
  4. Leetcode 53 最大子串和
  5. Protobuf的优点
  6. CentOS7设置中文字符集
  7. js 递归查询所有的叶子结点_浅谈mysql的查询过程
  8. 如何编写有效的Bug Report
  9. 关联分析中可能的规则数的求法
  10. Total Commander 使用技巧
  11. 【滤波器】基于matlab升余弦滤波器【含Matlab源码 993期】
  12. Java案例实现用户登录
  13. Y580已成功将bios升级至V8.01
  14. EXCEL数组公式(6),注意聚合函数在数组公式中的用法
  15. PHP第一季视频教程.李炎恢.学习笔记(五)(第3章 操作符与控制结构(1)(2))
  16. access数据库代做_矿井三维模型(代做矿山模型)
  17. DM8整合java的jpa框架(附整合源码)
  18. 数学也荒唐:20个脑洞大开的数学趣题
  19. zjnu 1779 KRUŽNICE(线段树成段更新+离散化)
  20. 什么软件测试卡路里,热量表(计算热量的仪表)_百度百科

热门文章

  1. 分类号检索不好用?那是因为你压根没用对分类
  2. vscode 安装 eslint 插件
  3. 程序员都有些什么企业文化?
  4. web3j智能合约错误:java.lang.ArrayIndexOutOfBoundsException
  5. 东北大学材料成型工艺学中挤压拉拔部分复习
  6. 【C语言】TC2.0环境-带图形库
  7. \t\t北京社保卡 问题汇总 参保人 结算问题
  8. 天正对应cad版本_天正CAD提示找不到可用的AutoCAD版本怎么办? - CAD自学网
  9. 图像超分辨率重建学习记录(一)
  10. 教你用JavaScript制作轮播图