OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 5423|回复: 7

求助,帮帮小弟,STM32与DS1302,时间显示在TFTLCD屏上,可是时间不会走。

[复制链接]

4

主题

26

帖子

0

精华

初级会员

Rank: 2

积分
101
金钱
101
注册时间
2021-1-11
在线时间
19 小时
发表于 2023-3-13 23:34:13 | 显示全部楼层 |阅读模式
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

4

主题

26

帖子

0

精华

初级会员

Rank: 2

积分
101
金钱
101
注册时间
2021-1-11
在线时间
19 小时
 楼主| 发表于 2023-3-14 10:32:59 | 显示全部楼层
时间显示是乱码
2031-15-31
00:63:<5
回复

使用道具 举报

4

主题

26

帖子

0

精华

初级会员

Rank: 2

积分
101
金钱
101
注册时间
2021-1-11
在线时间
19 小时
 楼主| 发表于 2023-3-14 10:34:42 | 显示全部楼层
ds1302.c

#include "ds1302.h"
#include "delay.h"

struct TIMEData TimeData;
char read_time[7];
char DS1302_data_1[10];
char DS1302_data_2[8];

void ds1302_gpio_init()//CE,SCLK端口初始化
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1; //PC.1  CE
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;//推挽输出
GPIO_Init(GPIOC, &GPIO_InitStructure);//初始化GPIOC.0
GPIO_ResetBits(GPIOC,GPIO_Pin_1);

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2; //PC.2  SCLK
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;//推挽输出
GPIO_Init(GPIOC, &GPIO_InitStructure);//初始化GPIOC.2
GPIO_ResetBits(GPIOC,GPIO_Pin_2);
}

void ds1302_DATAOUT_init()//配置双向I/O端口为输出态
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; //PC.0  DATC
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(GPIOC, &GPIO_InitStructure);//初始化GPIOC.0
GPIO_ResetBits(GPIOC,GPIO_Pin_0);
}

void ds1302_DATAINPUT_init()//配置双向I/O端口为输入态
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; //PC.10 DATA
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
GPIO_Init(GPIOC, &GPIO_InitStructure);//初始化GPIOC.10
}


void ds1302_write_onebyte(unsigned char data)//向DS1302发送一字节数据
{
        unsigned char count=0;
ds1302_DATAOUT_init();
SCLK_L;
for(count=0;count<8;count++)
        {        SCLK_L;
                if(data&0x01)
                {DATA_H;}
                else{DATA_L;}//先准备好数据再发送
                SCLK_H;//拉高时钟线,发送数据
                data>>=1;
        }
}

void ds1302_wirte_rig(unsigned char address,unsigned char data)//向指定寄存器地址发送数据
{
unsigned char temp1=address;
unsigned char temp2=data;
CE_L;SCLK_L;delay_us(1);
CE_H;delay_us(2);
ds1302_write_onebyte(temp1);
ds1302_write_onebyte(temp2);
CE_L;SCLK_L;delay_us(2);
}

unsigned char ds1302_read_rig(unsigned char address)//从指定地址读取一字节数据
{
unsigned char temp3=address;
unsigned char count=0;
unsigned char return_data=0x00;
CE_L;SCLK_L;delay_us(3);
CE_H;delay_us(3);
ds1302_write_onebyte(temp3);
ds1302_DATAINPUT_init();//配置I/O口为输入
delay_us(2);
for(count=0;count<8;count++)
        {
        delay_us(2);//使电平持续一段时间
        return_data>>=1;
        SCLK_H;delay_us(4);//使高电平持续一段时间
        SCLK_L;delay_us(14);//延时14us后再去读取电压,更加准确
        if(GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_0))
        {return_data=return_data|0x80;}
       
        }
delay_us(2);
CE_L;DATA_L;
return return_data;
}

void ds1302_init()
{
ds1302_wirte_rig(0x8e,0x00);//关闭写保护
ds1302_wirte_rig(0x80,0x00);//seconds 0秒
ds1302_wirte_rig(0x82,0x038);//minutes 03分
ds1302_wirte_rig(0x84,0x11);//hours   时
ds1302_wirte_rig(0x86,0x13);//date    13日
ds1302_wirte_rig(0x88,0x03);//months   3月
ds1302_wirte_rig(0x8a,0x01);//days    星期一
ds1302_wirte_rig(0x8c,0x23);//year    2023年
ds1302_wirte_rig(0x8e,0x80);//关闭写保护
}

void ds1302_read_time()
{
read_time[0]=ds1302_read_rig(0x81);//读秒
read_time[1]=ds1302_read_rig(0x83);//读分
read_time[2]=ds1302_read_rig(0x85);//读时
read_time[3]=ds1302_read_rig(0x87);//读日
read_time[4]=ds1302_read_rig(0x89);//读月
read_time[5]=ds1302_read_rig(0x8B);//读星期
read_time[6]=ds1302_read_rig(0x8D);//读年
}

void ds1302_read_realTime()
{
ds1302_read_time();  //BCD码转换为10进制
TimeData.second=(read_time[0]>>4)*10+(read_time[0]&0x0f);
TimeData.minute=((read_time[1]>>4)&(0x07))*10+(read_time[1]&0x0f);
TimeData.hour=(read_time[2]>>4)*10+(read_time[2]&0x0f);
TimeData.day=(read_time[3]>>4)*10+(read_time[3]&0x0f);
TimeData.month=(read_time[4]>>4)*10+(read_time[4]&0x0f);
TimeData.week=read_time[5];
TimeData.year=(read_time[6]>>4)*10+(read_time[6]&0x0f)+2000;
        DS1302_data_1[0]='2';
        DS1302_data_1[1]='0';
        DS1302_data_1[2]='0'+(TimeData.year-2000)/10;
        DS1302_data_1[3]='0'+(TimeData.year-2000)%10;
        DS1302_data_1[4]='-';
        DS1302_data_1[5]='0'+TimeData.month/10;
        DS1302_data_1[6]='0'+TimeData.month%10;
        DS1302_data_1[7]='-';
        DS1302_data_1[8]='0'+TimeData.day/10;
        DS1302_data_1[9]='0'+TimeData.day%10;
       
        DS1302_data_2[0]='0'+TimeData.hour/10;
        DS1302_data_2[1]='0'+TimeData.hour%10;
        DS1302_data_2[2]=':';
        DS1302_data_2[3]='0'+TimeData.minute/10;
        DS1302_data_2[4]='0'+TimeData.minute%10;
        DS1302_data_2[5]=':';
        DS1302_data_2[6]='0'+TimeData.second/10;
        DS1302_data_2[7]='0'+TimeData.second%10;
}

回复

使用道具 举报

4

主题

26

帖子

0

精华

初级会员

Rank: 2

积分
101
金钱
101
注册时间
2021-1-11
在线时间
19 小时
 楼主| 发表于 2023-3-14 10:35:03 | 显示全部楼层
ds1302.h

#ifndef __ds1302_H
#define __ds1302_H  


#define CE_L GPIO_ResetBits(GPIOC,GPIO_Pin_1)//拉低使能位
#define CE_H GPIO_SetBits(GPIOC,GPIO_Pin_1)//拉高使能位
#define SCLK_L GPIO_ResetBits(GPIOC,GPIO_Pin_2)//拉低时钟线
#define SCLK_H  GPIO_SetBits(GPIOC,GPIO_Pin_2)//拉高时钟线
#define DATA_L  GPIO_ResetBits(GPIOC,GPIO_Pin_0)//拉低数据线
#define DATA_H  GPIO_SetBits(GPIOC,GPIO_Pin_0)//拉高数据线

struct TIMEData
{
        unsigned int year;
        unsigned char month;
        unsigned char  day;
        unsigned char  hour;
        unsigned char  minute;
        unsigned char  second;
        unsigned char  week;
};//创建TIMEData结构体方便存储时间日期数据
extern struct TIMEData TimeData;//全局变量
void ds1302_gpio_init(void);//ds1302端口初始化
void ds1302_write_onebyte(unsigned char data);//向ds1302发送一字节数据
void ds1302_wirte_rig(unsigned char address,unsigned char data);//向指定寄存器写一字节数据
unsigned char ds1302_read_rig(unsigned char address);//从指定寄存器读一字节数据
void ds1302_init(void);//ds1302初始化函数
void ds1302_DATAOUT_init(void);//IO端口配置为输出
void ds1302_DATAINPUT_init(void);//IO端口配置为输入
void ds1302_read_time(void);//从ds1302读取实时时间(BCD码)
void ds1302_read_realTime(void);//将BCD码转化为十进制数据

#endif

回复

使用道具 举报

7

主题

480

帖子

0

精华

高级会员

Rank: 4

积分
771
金钱
771
注册时间
2021-4-15
在线时间
304 小时
发表于 2023-3-14 15:31:38 | 显示全部楼层
你明明是数值 怎么看你使用的是字符显示函数?
日常敲键--头秃一片
回复

使用道具 举报

10

主题

214

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
5653
金钱
5653
注册时间
2016-12-19
在线时间
729 小时
发表于 2023-3-14 19:34:00 | 显示全部楼层
肯定是Ds1302没有初始化好
回复

使用道具 举报

4

主题

26

帖子

0

精华

初级会员

Rank: 2

积分
101
金钱
101
注册时间
2021-1-11
在线时间
19 小时
 楼主| 发表于 2023-3-14 23:13:07 | 显示全部楼层
你的蓝朋友 发表于 2023-3-14 19:34
肯定是Ds1302没有初始化好

老哥能否指点一下,查找了两天了,还是没有头绪啊
回复

使用道具 举报

11

主题

2118

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4632
金钱
4632
注册时间
2015-1-10
在线时间
580 小时
发表于 2023-3-15 14:19:30 | 显示全部楼层
你先显示固定时间看看对不对,再看DS1302读出来的时间对不对
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-12-18 13:32

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表