微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > STM32F103V 模拟IO 读取DS1302 程序

STM32F103V 模拟IO 读取DS1302 程序

时间:11-18 来源:互联网 点击:

引脚定义和设置部分代码:

//////////////////////DS1302引脚定义///////////////////////////////
#define SCLK GPIO_Pin_7 //PE7 DS1302 SCLK引脚定义
#define I_O GPIO_Pin_8 //PE8 DS1302 I/O引脚定义
#define RST GPIO_Pin_9 //PE9 DS1302 RST引脚定义

#define SCLK_1 GPIO_SetBits(GPIOE, SCLK)
#define SCLK_0 GPIO_ResetBits(GPIOE, SCLK)

#define RST_1 GPIO_SetBits(GPIOE, RST)
#define RST_0 GPIO_ResetBits(GPIOE, RST)

#define I_O_1 GPIO_SetBits(GPIOE, I_O)
#define I_O_0 GPIO_ResetBits(GPIOE, I_O)
#define GetIO GPIO_ReadInputDataBit(GPIOE,I_O)

////////////////////时钟芯片设置/////////////////////////////
GPIO_InitStructure.GPIO_Pin =SCLK|I_O|RST;//DS1302
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOE, &GPIO_InitStructure);
////////////////////DS1302引脚定义///////////////////////////////////
void DS1302_DATA_IO_SET(unsigned char io_set) //DS1302 I_O引脚输入输出设置
{
if(io_set==0)
{
GPIO_InitStructure.GPIO_Pin = I_O; //DS1302 I_O 作为输出
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOE, &GPIO_InitStructure);
}
else if(io_set==1)
{
GPIO_InitStructure.GPIO_Pin = I_O; //DS1302 I_O 作为输入
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //上拉输入
GPIO_Init(GPIOE, &GPIO_InitStructure);
}
else
{;}
}

////////////////////////////////////////////////DS1302.H////////////////////////////////////////////////

#ifndef __DS1302_H__
#define __DS1302_H__

#include"STM32_Config.h"
#include"STM_Delay.h"
#define uchar unsigned char
#define uint unsigned int

uchar sec_h,sec_l,min_h,min_l,hour_h,hour_l,date_h,date_l;
uchar month_h,month_l,day_h,day_l,year_h,year_l,tem_h,tem_l,tem_f,tem_f1,tem_f2;

uchar temp_min ,temp_hour,temp_day,temp_month,temp_year,temp_date;//调节时间用
uchar adjust_mode ; //时钟调节模式切换数据参数
uchar xq;
uchar DS1302_data[8]; //时钟日期年月存取寄存器定义
uchar DS1302_ram[8];
uchar ram_hour_h,ram_hour_l,ram_min_h,ram_min_l,ram_clock; //定义闹钟在RAM中存的小时和分钟寄存器

/******************定义子程序 start**********************************/
void send(unsigned char cmd,unsigned char date); //写DS1302
char rec(unsigned char cmd); //读DS1302

void all_data_rst(void); //时间复位成初始设置的值
void Delay1ms(unsigned int count); //延时1ms
void main_int(void);//参数初始化

void resume_all_data(void); //出厂设置
void trickle_charge_open(void); //打开充电功能
void trickle_charge_close(void); //关闭充电功能
/******************定义子程序 end************************************/

/**********************向DS1302写数据start***************************/
void send(unsigned char cmd,unsigned char date)
{ unsigned char i;

DS1302_DATA_IO_SET(0);delayms(1);delay_nop();delay_nop();

RST_1; delay_nop();delay_nop();delay_nop();
SCLK_0;delay_nop();delay_nop();delay_nop();
for (i=0;i<8;i++)
{
if(cmd&0x01)I_O_1;
else I_O_0;
cmd>>=1;

SCLK_1;delay_nop();delay_nop();delay_nop();
SCLK_0;delay_nop();delay_nop();delay_nop();
}
for (i=0;i<8;i++)
{
if(date&0x01)I_O_1;
else I_O_0;
date>>=1;
SCLK_1;delay_nop();delay_nop();delay_nop();
SCLK_0;delay_nop();delay_nop();delay_nop();
}
RST_0;delay_nop();delay_nop();delay_nop();
}
/**********************向DS1302写数据end ***************************/

/**********************读DS1302数据start*******************************/
char rec(unsigned char cmd)
{
unsigned char i,d=1;
DS1302_DATA_IO_SET(0);delay_nop();delay_nop();
RST_1;delay_nop();delay_nop();delay_nop();
for (i=0;i<8;i++)
{
SCLK_0;delay_nop();delay_nop();
if(cmd&0x01)I_O_1;
else I_O_0;
cmd>>=1;

SCLK_1;delay_nop();delay_nop();delay_nop();
}
for (i=0;i<8;i++)
{
d>>=1;

SCLK_0;delay_nop();delay_nop();delay_nop();
DS1302_DATA_IO_SET(1);
if(GetIO) d=d|0x80;
SCLK_1;delay_nop();delay_nop();delay_nop();
}
SCLK_0;delay_nop();delay_nop();delay_nop();
RST_0;delay_nop();delay_nop();delay_nop();
DS1302_DATA_IO_SET(0);
return d;
}
/**********************读DS1302数据end *******************************/

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top