OpenEdv-开源电子网

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

大神们帮我看看这个程序哪里不对啊STM32F103rc8t6与ds1302时钟芯片通信问题

[复制链接]

11

主题

42

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
355
金钱
355
注册时间
2015-11-28
在线时间
71 小时
发表于 2016-4-1 15:33:29 | 显示全部楼层 |阅读模式
5金钱
大神们代码如下
#ifndef _DS_1302_
#define _DS_1302_
#include "sys.h"
#include "delay.h"
#include "usart.h"
/*定义DS1302相关的端口和寄存器*/
#define SCLK PAout(1)//定义DS1302的时钟信号sclk
#define IO  PAout(2)//定义输出的ds1302的数据
#define DS_RST PAout(3)
#define READ_IO PAin(2)
/*定义的端口的输入输出方向*/
#define SDA_IN()  {GPIOA->CRL&=0xFFFFF0FF;GPIOA->CRL|=0xFFFFF8FF;}
#define SDA_OUT() {GPIOA->CRL&=0xFFFFF0FF;GPIOA->CRL|=0xFFFFF3FF;}
/*******定义相关的寄存器*******************/
#define DS_SEC_REG   0x80//秒寄存器
#define DS_MIN_REG   0x82//分寄存器
#define DS_HOR_REG   0x84//小时寄存器
#define DS_DAY_REG   0x86//天寄存器
#define DS_MONTH_REG 0x88//月寄存器
#define DS_WEEK_REG  0x8a//星期寄存器
#define DS_year_REG  0x8c//年寄存器
#define DS_CONTRLO_REG 0x8e//控制寄存器
#define DS_CHARGE_REG 0x90//涡流充电寄存器
#define DS_SCLKBURST_REG 0xbe//时钟多字节寄存器
/******************************************/
//时间结构体定义
typedef struct
{
    vu16 year;
    vu8 month;
    vu8 day;//定义了volatile类型的变量年、月、日
    vu8 hour;
    vu8 min;
    vu8 sec;
    vu8 week;
    vu8 mode;//12/24模式
    vu8 am_pm;//上下午指示
    vu8 charge;//充电指示 1开启、0关闭
    float temperature;//温度显示
   
}_calender_obj;
/*************函数的声明**************/
void DS1302_Init(void);//DS1302的初始化
void DS1302_Write_Byte(u8 Reg,u8 Date);//在固定寄存器写入数据
u8 DS1302_Read_Byte(u8 Reg);//在固定寄存器读取数据
void DS1302_Set(u8 year,u8 month,u8 day,u8 hour,u8 min,u8 sec);//设置初始时间
void DS1302_Mode(u8 mode);
u8 BCDT0Num(u8 BCD);
#endif
上边是定义的端口


#include "calender.h"
_calender_obj calender;//定义一个日历结构体变量
/*************初始化函数****************/
void DS1302_Init(void)
{
    RCC->APB2ENR|=1<<2;//使能端口A时钟
    GPIOA->CRL&=0xffff000f;
    GPIOA->CRL|=0x00003330;//PA1,PA2,A3推挽输出
    DS_RST=0;
    SCLK=0;
    IO=0;
   
}

void DS1302_Write(u8 dat)
{
u8 i;
for(i=0; i<8; i++)
{
  if(dat&(0x01<<i)) IO=1;
  else IO=0;
  
  SCLK=1;
  delay_us(1);
  SCLK=0;
}
}
u8 DS1302_Read(void)
{
u8 i,byte=0;
for(i=0;i<8;i++)
{
  byte >>= 1;
  if(READ_IO==1) byte |= 0x80;
  SCLK=1;
  delay_us(1);
  SCLK=0;
}
return(byte);
}
/*****************写一个字节******************/
void DS1302_Write_Byte(u8 addr,u8 data)
{
    SDA_OUT();
DS_RST=0;
    SCLK=0;
    DS_RST=1;
delay_us(1);
DS1302_Write(addr);
DS1302_Write(data);
delay_us(1);
DS_RST=0;
}
u8 DS1302_Read_Byte(u8 addr)
{
    u8 data=0;
    DS_RST=0;
    SCLK=0;
    DS_RST=1;
    SDA_OUT();
delay_us(1);
DS1302_Write(addr);
SDA_IN();
data = DS1302_Read();
delay_us(1);
DS_RST=0;
return(data);
}


void DS1302_Set(u8 year,u8 month,u8 day,u8 hour,u8 min,u8 sec)
{
    DS1302_Write_Byte(DS_year_REG,year);
    DS1302_Write_Byte(DS_MONTH_REG,month);
    DS1302_Write_Byte(DS_DAY_REG,day);
    DS1302_Write_Byte(DS_HOR_REG,hour);
    DS1302_Write_Byte(DS_MIN_REG,min);
    DS1302_Write_Byte(DS_SEC_REG,sec);
}
void DS1302_Mode(u8 mode)
{
  if(mode)
  DS1302_Write_Byte(DS_MIN_REG,0x00);
  else
  DS1302_Write_Byte(DS_MIN_REG,0x10);   
}



main函数

#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "calender.h"
#include "led.h"
int main()
{
    u8 a;
    Stm32_Clock_Init(9); //系统时钟设置
    uart_init(72,9600);//串口初始化
    delay_init(72);//延时初始化
    DS1302_Init();//ds1302初始化
    LED_Init();
    //DS1302_Mode(0);
    //DS1302_Set(16,3,31,10,50,0);
    DS1302_Write_Byte(DS_year_REG,0x16);
    while(1)
    {
            a=DS1302_Read_Byte(0x85);
            printf("%d\r\n",a);
//////        //printf("%d\r\n",DS1302_Read_Byte(DS_year_REG));
            LED0=1;
            delay_ms(200);
            LED0=0;
            delay_ms(200);












正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2016-4-1 21:48:02 | 显示全部楼层
回复

使用道具 举报

11

主题

42

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
355
金钱
355
注册时间
2015-11-28
在线时间
71 小时
 楼主| 发表于 2016-4-5 13:53:30 | 显示全部楼层

谢谢原子哥
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-19 11:55

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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