找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3607|回复: 3
打印 上一主题 下一主题
收起左侧

STM32+DS1302数码管显示时钟一直为F?

[复制链接]
跳转到指定楼层
楼主
各位大神,如题:本人使用STM32F103c8t6进行DS1302时钟程序的编写,用数码管进行时钟显示;但是无论怎样修改时序、程序,时间在数码管显示均为F,
说明:硬件电路接线正常。
具体结果如下图所示。

请各位大神帮忙看看,十分感谢!下面为DS1302程序

程序源码:
  1. #include "DS1302.h"
  2. u8 READ_RTC_ADDR[7] = {0x81, 0x83, 0x85, 0x87, 0x89, 0x8b, 0x8d};
  3. u8 WRITE_RTC_ADDR[7] = {0x80, 0x82, 0x84, 0x86, 0x88, 0x8a, 0x8c};
  4. u8 TIME[7] = {0x00, 0x15, 0x23, 0x01, 0x01, 0x02, 0x13};
  5. //使用PA引脚作为DS1302的控制引脚,控制引脚的初始化
  6. //PA12-DATA   PA13-RST   PA14-CLK
  7. void DS1302_Init(void)
  8. {
  9.          GPIO_InitTypeDef GPIO_InitStructure;
  10.                
  11.          RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA , ENABLE);         //使能PA端口时钟
  12.                
  13.          //配置PA12-13-14端口为推挽输出 ,用于驱动DS1302
  14.          GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_14;                                 
  15.          GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;                  //推挽输出
  16.          GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;                 //IO口速度为50MHz
  17.         
  18.          GPIO_Init(GPIOA, &GPIO_InitStructure);                                
  19.         
  20.          GPIO_ResetBits(GPIOA,GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_14);                        //输出低

  21. }
  22. void DS1302_WriteCommand(u8 Add,u8 dat)
  23. {
  24.         u8 i=0;
  25.         
  26.         DS1302_RST=0;
  27.         delay_us(4); //延时
  28.         DS1302_CLK=0;
  29.         delay_us(2); //延时1us
  30.         
  31.         DS1302_RST=1; //设置为高电平,开启写数据
  32.         delay_us(4); //延时               
  33. //STM32向DS1302 写入地址
  34.         for(i=0;i<8;i++)
  35.         {
  36.                
  37.                 DS1302_IO_OUT();
  38.                
  39.                 DS1302_DATA_OUT = Add & 0x01;
  40.                
  41.                 Add = Add >> 1;    //右移才对,由低位往高位移动
  42.                
  43.                 DS1302_CLK=1; //因为上升沿数据写入,所以需要设置为高电平
  44.                 delay_us(2); //延时
  45.                         
  46.                 DS1302_CLK=0; //因为上升沿数据写入,所以需要设置为低电平,为下一次上升沿写入数据做准备
  47.                 delay_us(2); //延时
  48.                
  49.         }        
  50. //STM32向DS1302 写入数据
  51.                 for(i=0;i<8;i++)
  52.         {
  53.                 DS1302_IO_OUT();
  54.                 DS1302_DATA_OUT = dat & 0x01;
  55.                 dat = dat >> 1;  
  56.                 DS1302_CLK=1;
  57.                 delay_us(2); //延时
  58.                         
  59.                 DS1302_CLK=0;
  60.                 delay_us(2); //延时
  61.                
  62.         }
  63.         DS1302_RST=0; //设置为低电平,结束数据的写入
  64.         delay_us(4); //延时
  65.                
  66. }

  67. //MCU从DS1302 对应 地址 中读取相应的 数据* **********************************************************************
  68. u8 DS1302_ReadByte(u8 Add)
  69. {
  70.         u8 dat=0,i=0,dat1=0;
  71.         DS1302_RST=0;
  72.         delay_us(4); //延时
  73.         DS1302_CLK=0;
  74.         delay_us(2); //延时
  75.         DS1302_RST=1; //设置为高电平,开启写数据
  76.         delay_us(4); //延时
  77.                
  78. //STM32向DS1302 写入地址
  79.         for(i=0;i<8;i++)
  80.         {
  81.                 DS1302_IO_OUT();
  82.                
  83.                 DS1302_DATA_OUT = Add & 0x01;
  84.                
  85.                 Add = Add >> 1;  
  86.                
  87.                 DS1302_CLK=1;
  88.                 delay_us(2); //延时
  89.                         
  90.                 DS1302_CLK=0;
  91.                 delay_us(2); //延时
  92.         
  93.         }
  94.                
  95. //STM从DS1302读取数据,下降沿有效
  96.         for(i=0;i<8;i++)
  97.         {
  98.                 DS1302_IO_IN();
  99.                
  100.                 dat = dat >> 1;
  101.                 dat1 = DS1302_DATA_IN ;  
  102.                 dat1 = dat1 << 7;
  103.                 dat = dat | dat1;
  104.                 DS1302_CLK=1; //
  105.                 delay_us(2); //延时
  106.                 DS1302_CLK=0; //
  107.                 delay_us(2); //延时
  108.         }
  109.         DS1302_RST=0; //设置为低电平,结束数据的写入
  110.         delay_us(4);
  111.         DS1302_CLK=1;/
  112.         delay_us(2); //延时
  113.         DS1302_IO_OUT();
  114.         DS1302_DATA_OUT=0;
  115.         delay_us(1);
  116.         DS1302_DATA_OUT=1;
  117.         delay_us(1);
  118.         return dat;
  119. }
  120. void RTC_DS1302_Init(void)
  121. {
  122.         u8 n=0;
  123.         DS1302_WriteCommand(0x8e,0x00); // 取消写保护
  124.         for(n=0;n<7;n++)
  125.         {
  126.                 DS1302_WriteCommand(WRITE_RTC_ADDR[n],TIME[n]);
  127.         }
  128.         DS1302_WriteCommand(0x8e,0x80);//写保护生效
  129. }
  130. //实时更新DS1302时钟***********************************************************************
  131. //秒分时日月周年
  132. void RTC_DS1302_Time(void)
  133. {
  134.         u8 i=0;
  135.         for(i=0;i<7;i++)
  136.         {
  137.                 TIME[i] = DS1302_ReadByte(READ_RTC_ADDR[i]);
  138.         }
  139. }
复制代码


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:123289 发表于 2019-1-16 08:28 | 只看该作者
1、先搞清楚LED显示的原理。
2、再单步运行调试,验证显示是不是按照显示原理执行的。
回复

使用道具 举报

板凳
ID:158375 发表于 2019-1-16 08:45 | 只看该作者
数码管先直接显示数字(别管DS1302),显示正确吗?
回复

使用道具 举报

地板
ID:342197 发表于 2019-1-16 15:30 | 只看该作者
笨笨兔 发表于 2019-1-16 08:45
数码管先直接显示数字(别管DS1302),显示正确吗?

数码管显示没有问题
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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