IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 嵌入式 -> STM32操作DS1302 -> 正文阅读

[嵌入式]STM32操作DS1302

头文件:

#ifndef __DS1302_H
#define __DS1302_H

#include "stm32f10x.h"
#include "stm32f10x_gpio.h"
#include "stm32f10x_rcc.h"
#include "systick.h"

#define CE_L    GPIO_ResetBits(GPIOC,GPIO_Pin_4) // 拉低使能位
#define CE_H    GPIO_SetBits(GPIOC,GPIO_Pin_4) // 拉高使能位

#define SCLK_L  GPIO_ResetBits(GPIOA,GPIO_Pin_6) // 拉低时钟线
#define SCLK_H  GPIO_SetBits(GPIOA,GPIO_Pin_6) // 拉高时钟线

#define DATA_L  GPIO_ResetBits(GPIOA,GPIO_Pin_7) // 拉低数据线
#define DATA_H  GPIO_SetBits(GPIOA,GPIO_Pin_7) // 拉高数据线
#define Read_IO GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_7)

void ds1302_gpio_init(void);//CE,SCLK端口初始化
void ds1032_init(void);
void ds1032_read_time(void);

#endif


源文件:

#include "ds1302.h"

u8 read_time[7];
TIMEData TimeData;

 /*
  * SCLK 和 CE初始化
  */
void ds1302_gpio_init()
{
	GPIO_InitTypeDef GPIO_InitStructure;
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC | RCC_APB2Periph_GPIOA, ENABLE);
	
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4; //PC.4  CE
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;//推挽输出
	GPIO_Init(GPIOC, &GPIO_InitStructure);//初始化GPIOC.11
	GPIO_ResetBits(GPIOC,GPIO_Pin_4); 
	 
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6; //PA.6  SCLK
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;//推挽输出
	GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOC.12
	GPIO_ResetBits(GPIOA,GPIO_Pin_6); 
}

 /*
  * 数据端口输出配置
  */
void ds1032_DATAOUT_init()//配置双向I/O端口为输出态
{
	GPIO_InitTypeDef GPIO_InitStructure;
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
	 
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7; //PA.7  DATA
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
	GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOC.10
	GPIO_ResetBits(GPIOA,GPIO_Pin_7);
}
 
 /*
  * 数据端口输入配置
  */
void ds1032_DATAINPUT_init()//配置双向I/O端口为输入态
{
	GPIO_InitTypeDef GPIO_InitStructure;
	
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7; //PA.7 DATA
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
	GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOC.10
}
 
/*
 * /向DS1302发送一字节数据
 */
void ds1302_write_onebyte(uint8_t data)//向DS1302发送一字节数据
{
	uint8_t count=0;
	ds1032_DATAOUT_init(); // I/O配置为输出 
	SCLK_L; // 拉低时钟
	for(count=0;count<8;count++)
	{	
		SCLK_L; // 拉低时钟
		if(data&0x01)
		{DATA_H;}
		else{DATA_L;}//先准备好数据再发送
		SCLK_H; //拉高时钟线,发送数据
		data>>=1; 
	}
}

/*
 * 向DS1302发送指定数据
 */
void ds1302_wirte_rig(uint8_t address,uint8_t data)//向指定寄存器地址发送数据
{
	uint8_t temp1=address;
	uint8_t temp2=data;
	
	CE_L; // 拉低CE
	SCLK_L; // 拉低SCLK
	CE_H; // 拉高CE

	ds1302_write_onebyte(temp1); // 写命令
	ds1302_write_onebyte(temp2); // 写数据
	
	CE_L; // 拉低CE
	SCLK_L; // 拉低时钟
}

/*
 * 从DS1302读取数据
 */
uint8_t ds1302_read_rig(uint8_t address)//从指定地址读取一字节数据
{
	uint8_t temp3=address;
	uint8_t count=0;
	uint8_t return_data=0x00;
	
	CE_L; // 拉低CE
	SCLK_L; // 拉低SCLK
	CE_H; // 拉高CE
	
	ds1302_write_onebyte(temp3); // 写地址
	
	ds1032_DATAINPUT_init();//配置I/O口为输入

	for(count=0;count<8;count++)
	{
		return_data>>=1;
		SCLK_H;delay_us(4);//使高电平持续一段时间
		SCLK_L;delay_us(14);//延时14us后再去读取电压,更加准确
		if(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_7))
		{return_data=return_data|0x80;}
	}
	
	CE_L; // 拉低CE
	DATA_L; // 拉低SCLK
	
	return return_data; // 返回数据
}

/*
 * 初始化DS1302
 */
void ds1032_init()
{
	ds1302_wirte_rig(0x8e,0x00);//关闭写保护
	ds1302_wirte_rig(0x80,0x37);//seconds37秒
	ds1302_wirte_rig(0x82,0x58);//minutes58分
	ds1302_wirte_rig(0x84,0x23);//hours23时
	ds1302_wirte_rig(0x86,0x30);//date30日
	ds1302_wirte_rig(0x88,0x09);//months9月
	ds1302_wirte_rig(0x8a,0x07);//days星期日
	ds1302_wirte_rig(0x8c,0x20);//year2020年
	
	ds1302_wirte_rig(0x80,0x19);
	
	ds1302_wirte_rig(0x8e,0x80);//关闭写保护
	
}

/*
 * 读取DS1302数据
 */
void ds1032_read_time()
{
	read_time[0]=ds1302_read_rig(0x81);//读秒
	read_time[1]=ds1302_read_rig(0x83);//读分
	read_time[2]=ds1302_read_rig(0x85);//读时
	read_time[3]=ds1302_read_rig(0x87);//读日
	read_time[4]=ds1302_read_rig(0x89);//读月
	read_time[5]=ds1302_read_rig(0x8B);//读星期
	read_time[6]=ds1302_read_rig(0x8D);//读年
}

注:进行I/O输入与输出切换时,可以直接操作寄存器,这样将会减少程序运行时间。

  嵌入式 最新文章
基于高精度单片机开发红外测温仪方案
89C51单片机与DAC0832
基于51单片机宠物自动投料喂食器控制系统仿
《痞子衡嵌入式半月刊》 第 68 期
多思计组实验实验七 简单模型机实验
CSC7720
启明智显分享| ESP32学习笔记参考--PWM(脉冲
STM32初探
STM32 总结
【STM32】CubeMX例程四---定时器中断(附工
上一篇文章      下一篇文章      查看所有文章
加:2021-09-01 12:05:12  更:2021-09-01 12:06:38 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 0:38:45-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码