STM32F103V 模拟IO 读取DS1302 程序
引脚定义和设置部分代码:
//////////////////////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 *******************************/
STM32F103V模拟IO读取DS130 相关文章:
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)
- Linux嵌入式系统开发平台选型探讨(11-09)
- Windows CE 进程、线程和内存管理(二)(11-09)