您的位置 首页 模拟

STM32F103V 模仿IO 读取DS1302 程序

引脚定义和设置部分代码://////////////////////DS1302引脚定义///////////////////////////////#defineSCLKGPIO_Pin_7//PE

引脚界说和设置部分代码:
//////////////////////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 *******************************/
/********************************************************************/
void all_data_rst(void) //时刻复位成初始设置的值
{
Delay1ms(50);
send(0x8E,0x00); //翻开写保护
send(0x80,0x00); //写入秒
send(0x82,0x00); //写入分
send(0x84,0x12); //写入小时
send(0x86,0x13); //写入日期
send(0x88,0x12); //写入月
send(0x8c,0x07); //写入年
send(0x8a,0x04); //写入星期
send(0x8E,0x80); //封闭写保护
}
/******************参数初始化**********************/
void main_int(void)
{
/**************初始化设置***********************/
adjust_mode=0; //时刻调理形式,0-6,用来切换调理的规模。
sec_h=0x30; //设置秒高位
sec_l=0x30; //设置秒低位
min_h=0x30; //设置分高位
min_l=0x30; //设置分低位
hour_h=0x31; //设置小时高位
hour_l=0x32; //设置小时低位
date_h=0x31; //设置日期高位
date_l=0x33; //设置日期低位
month_h=0x31; //设置月份高位
month_l=0x32; //设置月份低位
day_h=0x30; //设置星期高位
day_l=0x35; //设置星期低位
year_h=0x30; //设置年份高位
year_l=0x37; //设置年份低位
tem_h=0x30; //设置温度高位
tem_l=0x30; //设置温度低位
/********************************************/
}
///rrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr
void resume_all_data(void)
{
/*****************出厂设置********************/
/*****************DS1302数据的写入***********************/
send(0x8E,0x00); //翻开写保护
send(0x80,0x00); //写入秒
send(0x82,0x08); //写入分
send(0x84,0x10); //写入小时
send(0x86,0x31); //写入日期
send(0x88,0x01); //写入月
send(0x8c,0x13); //写入年
send(0x8a,0x04); //写入星期
send(0xc0,0x01); //写入闹钟小时H
send(0xc2,0x02); //写入闹钟小时L
send(0xc4,0x00); //写入闹钟分钟H
send(0xc6,0x00); //写入闹钟分钟L
send(0x8E,0x80); //封闭写保护
// ram_hour_h=0x01; //闹钟初始值为12:00
// ram_hour_l=0x02;
// ram_min_h=0x00;
// ram_min_l=0x00;
}
///rrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr
/****************************************************/
void trickle_charge_open(void) //涓流充电敞开
{ /////Trickle Charge start/////
send(0x8E,0x00); //翻开写保护
send(0x90,0xa9); //10101001B选2个二极管电阻是2K
send(0x8E,0x80); //封闭写保护
} /////Trickle Charge end //////
/*****************************************************/
/****************************************************/
void trickle_charge_close(void) //涓流充电封闭
{ /////Trickle Charge start/////
send(0x8E,0x00); //翻开写保护
send(0x90,0x80); //10101001B选2个二极管电阻是2K
send(0x8E,0x80); //封闭写保护
} /////Trickle Charge end //////
/*****************************************************/
/***************************1秒延时子程序start***************************/
void Delay1ms(unsigned int count)
{
unsigned int i,j;
for(i=0;ifor(j=0;j<1200;j++);
}
/***************************1秒延时子程序end***************************/
#endif

///////////////////////////////////////////////////////读取时刻部分程序////////////////////////////////////////////////////

//////////////////从DS1302读取时刻/////////////////////////
void Get_DS1302time(void) //从DS1302读取时刻
{
NOW_time[2]=rec(0x8d)/16+0x30;//年
NOW_time[3]=rec(0x8d)%16+0x30;//

NOW_time[5]=rec(0x89)/16+0x30;//月
NOW_time[6]=rec(0x89)%16+0x30;

NOW_time[8]=rec(0x87)/16+0x30;//日
NOW_time[9]=rec(0x87)%16+0x30;

NOW_time[11]=rec(0x85)/16+0x30;//小时
NOW_time[12]=rec(0x85)%16+0x30;

NOW_time[14]=rec(0x83)/16+0x30;//分钟
NOW_time[15]=rec(0x83)%16+0x30;

NOW_time[17]=rec(0x81)/16+0x30;//秒
NOW_time[18]=rec(0x81)%16+0x30;
}
////////////////////////////////////////////////

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/zhishi/moni/267125.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部