DS1302教程及proteus仿真(51和stm32)

这篇具有很好参考价值的文章主要介绍了DS1302教程及proteus仿真(51和stm32)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

DS1302是一款时钟芯片,能精确对年月日时分秒进行计算,并且能自动校准闰年和每个月的不同天数,下面从51和stm32两款单片机介绍其用法

DS1302采用三线SPI通信 ,下图详细说明了各引脚的接线方式

DS1302教程及proteus仿真(51和stm32)

 DS1302使用的并不是标准的SPI通信,它的数据输入输出为同一根线。通信时序图如下图所示

DS1302教程及proteus仿真(51和stm32)

空闲状态时SCK为低电平,时钟信号的第一个沿开始传输数据,低位在前高位在后,每次通信前都需要将CE引脚拉高。值得注意的是DS1302输出的数据为BCD码,比如串行通信输出的16进制数据0x21,按照正常其转换为十进制为33,但DS1302输出的0x21就代表十进制数21。其他没有什么需要特别注意的。

下面是代码和proteus仿真部分

先是51的,使用STC89C52RC单片机

DS1302驱动函数的头文件

#ifndef _DS1302_H_
#define _DS1302_H_
#include <reg52.h>
sbit CE=P1^0;
sbit SCK=P1^1;
sbit IO=P1^2;
void DS1302_Init();
void DS1302_Write_Reg(unsigned char Reg,unsigned char Dat);
unsigned char DS1302_Read_Reg(unsigned char Reg);
void SPI_Write(unsigned char Dat);
unsigned char SPI_Read();
#endif

DS1302的驱动函数

#include "ds1302.h"
void DS1302_Init()
{
  CE=0;
	SCK=0;
}
void DS1302_Write_Reg(unsigned char Reg,unsigned char Dat)
{
  CE=1;
	SPI_Write(Reg);
	SPI_Write(Dat);
	CE=0;
}
unsigned char DS1302_Read_Reg(unsigned char Reg)
{
	unsigned char Dat;
	CE=1;
  SPI_Write(Reg);
	Dat=SPI_Read();
	CE=0;
	return Dat;
}
void SPI_Write(unsigned char Dat)
{
	unsigned char i=0;
	for(i=0;i<8;i++)
	{
	if(Dat&0x01)
	{
	IO=1;
	}
	else
	{
	IO=0;
	}
	SCK=1;
	SCK=0;
	Dat>>=1;
	}
	IO=1;
}
unsigned char SPI_Read()
{
  unsigned char i=0,Dat=0;
	for(i=0;i<8;i++)
	{
	Dat>>=1;
	SCK=1;
	if(IO)
	{
	Dat|=0x80;
	}
	SCK=0;
	}
	return Dat;
}

 主函数部分

首先进行DS1302的初始化,将时分秒部分清0,年月日暂且不管,然后进入主循环,不断的对时间进行读取,这里并没有执行BCD码的转换

#include "ds1302.h"
void main()
{
	unsigned char h,m,s;
	DS1302_Init();
	DS1302_Write_Reg(0x8e,0x80);
	DS1302_Write_Reg(0x80,0x00);
	DS1302_Write_Reg(0x82,0x00);
	DS1302_Write_Reg(0x84,0x00);
	while(1)
	{
	  h=DS1302_Read_Reg(0x85);
	  m=DS1302_Read_Reg(0x83);
		s=DS1302_Read_Reg(0x81);
	}
}

下面是proteus仿真电路图,DS1302的晶振不接也是可以正常运行的

DS1302教程及proteus仿真(51和stm32)

接下来是stm32部分,使用stm32f103c8t6单片机 

DS1302驱动函数的头文件

#ifndef _DS1302_H_
#define _DS1302_H_
void DS1302_Init(void);
void SPI_Write(unsigned char Dat);
unsigned char SPI_Read(void);
void DS1302_Write_Reg(unsigned char Reg,unsigned char Dat);
unsigned char DS1302_Read_Reg(unsigned char Reg);

#endif

DS1302驱动函数

#include "stm32f10x_rcc.h"
//CE PA0
//SCK PA1
//IO PA2
void DS1302_Init(void)
{
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
	GPIO_InitTypeDef DS1302={0};
	DS1302.GPIO_Mode=GPIO_Mode_Out_OD;
	DS1302.GPIO_Pin=GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2;
	DS1302.GPIO_Speed=GPIO_Speed_50MHz;
	GPIO_Init(GPIOA,&DS1302);
	GPIO_ResetBits(GPIOA,GPIO_Pin_0);
	GPIO_ResetBits(GPIOA,GPIO_Pin_1);
}
void SPI_Write(unsigned char Dat)
{
  unsigned char i=0;
	for(i=0;i<8;i++)
	{
	if(Dat&0x01)
	{
	GPIO_SetBits(GPIOA,GPIO_Pin_2);
	}
	else
	{
	GPIO_ResetBits(GPIOA,GPIO_Pin_2);
	}
	GPIO_SetBits(GPIOA,GPIO_Pin_1);
	GPIO_ResetBits(GPIOA,GPIO_Pin_1);
	Dat>>=1;
	}
	GPIO_SetBits(GPIOA,GPIO_Pin_2);
}
unsigned char SPI_Read(void)
{
  unsigned char i=0,Dat=0;
	for(i=0;i<8;i++)
	{
		Dat>>=1;
	  GPIO_SetBits(GPIOA,GPIO_Pin_1);
    if(GPIOA->IDR&1<<2)
		{
		Dat|=0x80;
		}
		GPIO_ResetBits(GPIOA,GPIO_Pin_1);
	}
	return Dat;
}
void DS1302_Write_Reg(unsigned char Reg,unsigned char Dat)
{
  GPIO_SetBits(GPIOA,GPIO_Pin_0);
	SPI_Write(Reg);
	SPI_Write(Dat);
	GPIO_ResetBits(GPIOA,GPIO_Pin_0);
}
unsigned char DS1302_Read_Reg(unsigned char Reg)
{
	unsigned char Dat=0;
	GPIO_SetBits(GPIOA,GPIO_Pin_0);
	SPI_Write(Reg);
	Dat=SPI_Read();
	GPIO_ResetBits(GPIOA,GPIO_Pin_0);
  return Dat;
}

主函数

#include "ds1302.h"
#include "stm32f10x.h"
int main()
{
  DS1302_Init();
	DS1302_Write_Reg(0x8e,0x80);
	DS1302_Write_Reg(0x80,0x00);
	DS1302_Write_Reg(0x82,0x00);
	DS1302_Write_Reg(0x84,0x00);
	while(1)
	{
	  DS1302_Read_Reg(0x85);
	  DS1302_Read_Reg(0x83);
		DS1302_Read_Reg(0x81);
	}
}

下面是proteus仿真,管于这个proteus仿真,我要说点什么

就是关于这个开漏输出的上拉电阻,之前用oled12864的时候,I2C通信我选用开漏输出,没有加上拉电阻,它可以正常显示,再加上stm32本身就比较强悍,使得我对它内部带有上拉电阻深信不疑。本想着花两三个小时在51上把这款芯片研究通,再把他映射到stm32上将会非常简单,万万没想到,对着程序研究了一下午,就在最后快要放弃的时候,我尝试性地在通讯线上加了三颗上拉电阻,没想到竟然成功了。。。。

DS1302教程及proteus仿真(51和stm32)

 文章来源地址https://www.toymoban.com/news/detail-450641.html

到了这里,关于DS1302教程及proteus仿真(51和stm32)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 51单片机——DS1302可调时钟

    目录 一、功能介绍 二、主要模块介绍 2.1 DS1302模块 2.1.1 DS1302芯片介绍 2.1.2  DS1302的使用 三、程序汇总 3.1测试文件test.c 3.2 LCD1602模块程序 3.2.1 LCD1602.h 3.2.2 LCD1602.c 3.3 DS1302模块程序 3.3.1 DS1302.h 3.3.2 DS1302.c 3.4 独立按键模块程序 3.4.1 Independentkey.h 3.4.2 Independentkey.c 3.5 T0定时器模

    2024年02月02日
    浏览(69)
  • 【51单片机系列】DS1302时钟模块

    本文是关于DS1302时钟芯片的相关介绍。 DS1302是DALLAS公司推出的涓流充电时钟芯片,内部含有一个实时时钟/日历和31字节静态RAM,通过简单的串行接口与单片机进行通信。该芯片是3线SPI接口。 实时时钟/日历电路提供秒、分、时、日、周、月、年的信息,每月的天数和闰年的天

    2024年02月03日
    浏览(67)
  • 51单片机(十)DS1302实时时钟

    ❤️ 专栏简介:本专栏记录了从零学习单片机的过程,其中包括51单片机和STM32单片机两部分;建议先学习51单片机,其是STM32等高级单片机的基础;这样再学习STM32时才能融会贯通。 ☀️ 专栏适用人群 :适用于想要从零基础开始学习入门单片机,且有一定C语言基础的的童鞋

    2024年02月03日
    浏览(47)
  • 使用51单片机和DS1302时钟芯片做一个简易的电子时钟

    今天给大家推荐一个51单片机小实验,带你使用51单片机做一款简易的电子时钟,其中计时模块采用DS1302硬件模块,显示采用LCD显示屏,具体怎么实现开来一起看看吧! DS1302 是 DALLAS 公司推出的涓流充电时钟芯片,内含有一个实时时钟和31字节静态 RAM,通过简单的串行接口与

    2024年02月11日
    浏览(46)
  • 基于51单片机、DS1302时钟模块的电子闹钟设计

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 提示:以下是本篇文章正文内容,下面案例可供参考 DS1302 是美国DALLAS公司推出的一种高性能、低功耗、带RAM的实时时钟电路,它可以对年、月、日、周、时、分、秒进行计时,具有闰年补偿功能,工作

    2024年02月02日
    浏览(63)
  • STM32 Proteus仿真水箱水塔水位温度控制系统DS18B20 -0065

    STM32 Proteus仿真水箱水塔水位温度控制系统DS18B20 -0065 Proteus 仿真小实验: STM32 Proteus仿真水箱水塔水位温度控制系统DS18B20 -0065 功能: 硬件组成:STM32F103C8单片机 +LCD1602显示器+ADC220V转3.3V电路+DS18B20温度+多个按键(设置温度和水位)+继电器模拟加热+继电器模拟加水。 1.人工

    2024年02月15日
    浏览(36)
  • 基于STM32的时钟设计并在六位数码管上显示附proteus仿真

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 提示:这里可以添加本文要记录的大概内容: 例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础内容。 提示:以下是本篇

    2024年02月12日
    浏览(48)
  • 36、基于STM32的电子闹钟(DS1302)

          本设计由STM32单片机+液晶1602+按键+DS1302时钟模块+声光报警模组成。 1、采用STM32F103最小系统。 2、利用DS1302芯片提供时钟信号 3、液晶1602实时显示年月日、时分秒、星期等信息。 4、四个按键可实现年月日、时分秒的设定,闹钟的时分设置。按键功能分别为:设置时间键

    2024年02月03日
    浏览(37)
  • 基于51单片机多路温度检测proteus仿真 ds18b20

    本设计是基于51单片机多路温度检测proteus仿真_ds18b20(仿真+程序+原理图) 仿真图proteus 7.8 程序编译器:keil 4/keil 5 编程语言:C语言 设计编号:C0042 功能说明: 通过对多路DS18B20温度传感器的数据采集,实现8路/4路温度采集并将数值显示在LCD显示屏上; 通过按键设置温度报警

    2024年02月12日
    浏览(46)
  • 51单片机DS18B20测温数码管显示例程(Proteus仿真+程序)

          本设计由STM32单片机+DS18B20温度传感器+四段数码管显示模块组成。 1、主控制器是51单片机 2、DS18B20温度传感器采集温度,精度0.1摄氏度 3、数码管显示温度,由三极管驱动。 4、测温范围-55~110摄氏度,误差±0.1℃ 注意:Proteus7.8以上版本打开 19、51单片机DS18B20测温数码管

    2023年04月08日
    浏览(46)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包