蓝桥杯备战——8.DS1302时钟芯片

news2024/11/18 21:29:22

1.分析原理图

在这里插入图片描述
由上图可以看到,芯片的时钟引脚SCK接到了P17,数据输出输入引脚IO接到P23,复位引脚RST接到P13。

2.查阅DS1302芯片手册

具体细节还需自行翻阅手册,我只截出重点部分
在这里插入图片描述
总结:数据在上升沿写出,下降沿读入,读时序命令字节结束的下降沿读出数据
在这里插入图片描述

3.代码封装库

请自行阅读芯片手册,理解记忆即可

#include "ds1302.h"
 
void DS1302_writebyte(u8 command,u8 byte)
{
	u8 i;
	RST=1;
	for(i=0;i<8;i++)
	{
		IO=command &(0x01<<i);	//低位在前
		SCK=1;	//提供上升沿,输出数据
		SCK=0;
	}
	for(i=0;i<8;i++)
	{
		IO=byte &(0x01<<i);	//低位在前
		SCK=1;	//提供上升沿,输出数据
		SCK=0;
	}
	RST=0;
}

u8 DS1302_readbyte(u8 command)
{
	u8 i,byte=0x00;
	RST=1;
	command++;
	for(i=0;i<8;i++)
	{
	 	IO=command &(0x01<<i);	//低位在前
		SCK=0;	//提供上升沿,输出数据
		SCK=1;
	}
	for(i=0;i<8;i++)
	{
		SCK=1;	//在下降沿读入数据
		SCK=0;
		if(IO) byte|=(0x01<<i);	//低位在前
	}
	RST=0;IO=0;	//复位
	return byte;
}

//时间数组,分别为年、月、日、时、分、秒、星期
u8 DS1302_Time[]={24,1,28,00,00,30,7};

//写入初始时间
void Init_DS1302()
{
	RST=0;SCK=0;	//复位
	DS1302_writebyte(0x8e,0x00);//写保护关
	//十进制转BCD码后写入
	DS1302_writebyte(0x8c,DS1302_Time[0]/10*16+DS1302_Time[0]%10);	//年
	DS1302_writebyte(0x88,DS1302_Time[1]/10*16+DS1302_Time[1]%10);	//月
	DS1302_writebyte(0x86,DS1302_Time[2]/10*16+DS1302_Time[2]%10);	//日
	DS1302_writebyte(0x84,DS1302_Time[3]/10*16+DS1302_Time[3]%10);	//时
	DS1302_writebyte(0x82,DS1302_Time[4]/10*16+DS1302_Time[4]%10);	//分
	DS1302_writebyte(0x80,DS1302_Time[5]/10*16+DS1302_Time[5]%10);	//秒
	DS1302_writebyte(0x8a,DS1302_Time[6]/10*16+DS1302_Time[6]%10);	//星期

	DS1302_writebyte(0x8e,0x80);
}

//读取后的时间存放于数组DS1302_Time[]
void DS1302_ReadTime()
{
	//BCD码转十进制后读取
	u8 Temp;
	Temp=DS1302_readbyte(0x8c);
	DS1302_Time[0]=(Temp>>4)*10+Temp%16;
	Temp=DS1302_readbyte(0x88);
	DS1302_Time[1]=(Temp>>4)*10+Temp%16;
	Temp=DS1302_readbyte(0x86);
	DS1302_Time[2]=(Temp>>4)*10+Temp%16;
	Temp=DS1302_readbyte(0x84);
	DS1302_Time[3]=(Temp>>4)*10+Temp%16;
	Temp=DS1302_readbyte(0x82);
	DS1302_Time[4]=(Temp>>4)*10+Temp%16;
	Temp=DS1302_readbyte(0x80);
	DS1302_Time[5]=(Temp>>4)*10+Temp%16;
	Temp=DS1302_readbyte(0x8a);
	DS1302_Time[6]=(Temp>>4)*10+Temp%16;
}

4.使用示例

我这里使用之前封装的数码管显示函数来显示时间:

#include "main.h"

extern u8 DS1302_Time[];//0~6:年月日时分秒星期

void System_Init(void);
void Timer0_Init(void);

void main()
{
	System_Init();
	Timer0_Init();
	Init_DS1302();
	while(1)
	{
		Nixie_Display(1,DS1302_Time[3]/10);	//时
		Nixie_Display(2,DS1302_Time[3]%10);
		Nixie_Display(3,DS1302_Time[4]/10);	//分
		Nixie_Display(4,DS1302_Time[4]%10);
		Nixie_Display(5,DS1302_Time[5]/10);	//秒
		Nixie_Display(6,DS1302_Time[5]%10);
		Nixie_Display(7,16);	//.
		Nixie_Display(8,DS1302_Time[6]);	//星期天
	}
}


void Timer0_Isr() interrupt 1
{
	static u16 count1=0;
	
	if(++count1==1000){
		P10=!P10;
		Set_Leds(1,P10);
		DS1302_ReadTime();
		count1=0;
	}
}

void Timer0_Init()		//1毫秒@12.000MHz
{
	AUXR &= 0x7F;			//12T模式
	TMOD &= 0xF0;			//定时器0:16位自动重装载
	TL0 = 0x18;				//设置定时初始值
	TH0 = 0xFC;
	TF0 = 0;	//清除TF0标志
	ET0 = 1;	//使能定时器0中断
	EA = 1;		//开总中断
	TR0 = 1;	//定时器0开始计时
}

void System_Init()//系统上电初始化
{
	//先锁存蜂鸣器,继电器所在573输出低电平,防止上电乱叫
	P25=1;P26=0;P27=1; //74HC138-->Y5=0,else=1-->Y5C=1,else=0
	P04=0;P06=0;	//ULN2003输入经过非门送入达林顿管,低电平有效
	P25=0;P26=0;P27=0;//锁存数据
	
	//关闭所有LED灯
	P25=0;P26=0;P27=1; //74HC138-->Y4=0,else=1-->Y4C=1,else=0
	P0=0XFF;
	P25=0;P26=0;P27=0;//锁存数据
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1417588.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

赚钱的雏形,是跑通最小闭环!

没赚钱本事&#xff0c;就专心打磨武器&#xff01; 很多人有一个错误的认知&#xff0c;就是做项目一定是新的&#xff0c;一定是有创新在里面&#xff0c;但其实赚钱的开始&#xff0c;一定是复制现有的项目。 现有的项目&#xff0c;可以确保他有市场&#xff0c;能够跑通&a…

Ps:段落面板

Ps菜单&#xff1a;窗口/段落 Window/Paragraph Ps菜单&#xff1a;文字/面板/段落面板 Type/Panels/Paragraph Panel 对于“点文本”&#xff0c;默认一行为一个段落。每按一次回车键&#xff0c;就多出一个段落。 对于“段落文本”&#xff0c;一段可能有多行&#xff0c;具体…

【Vite+Vue3+TS】基于Vite+Vue3+TypeScript+ESLint+Prettier+Stylelint搭建项目(亲测超详细)

目 录 项目搭建步骤确定node版本使用Vite创建Vue3项目规范目录结构配置环境修改Vite配置文件集成路由工具Vue Router集成状态管理工具Pinia集成CSS预编译器Sassvite-plugin-svg-icons图标组件集成UI框架Element Plus集成HTTP 请求工具 Axios 项目代码规范集成ESLint配置集成Pre…

动手学深度学习(一)深度学习介绍1

目录 一、引言 1.日常生活中的机器学习&#xff1a; 2.机器学习中的关键组件&#xff1a; 2.1 数据&#xff1a; 2.2 模型&#xff1a; 2.3 目标函数&#xff1a; 2.4 优化算法&#xff1a; 3. 各种机器学习问题&#xff1a; 3.1 监督学习&#xff1a; 3.1.1 回归&…

qemu + vscode图形化调试linux kernel

一、背景 使用命令行连接gdb 在调试时&#xff0c;虽然可以通过tui enable 显示源码&#xff0c;但还是存在设置断点麻烦&#xff08;需要对着源码设置&#xff09;&#xff0c;terminal显示代码不方便&#xff0c;不利于我们学习&#xff1b;另外在gdb 下p命令显示结构体内容…

Vue Router 简介

聚沙成塔每天进步一点点 本文内容 ⭐ 专栏简介Vue Router 简介主要特性&#xff1a;安装和基本用法&#xff1a; ⭐ 写在最后 ⭐ 专栏简介 Vue学习之旅的奇妙世界 欢迎大家来到 Vue 技能树参考资料专栏&#xff01;创建这个专栏的初衷是为了帮助大家更好地应对 Vue.js 技能树的…

CSRF靶场练习

简述&#xff1a;CSRF漏洞实际很少&#xff1b;条件限制很多&#xff1b;局限性很大&#xff1b;实验仅供参考&#xff0c;熟悉csrf概念和攻击原理即可 Pikachu靶场 CSRF GET 登录用户vince的账户可以看到用户的相关信息&#xff1b; 点击修改个人信息&#xff0c;发现数据包…

基于springboot+layui实现的旅游信息管理系统源码+数据库,可以查看旅游路线、飞机火车的班次

travel 介绍 旅游信息管理系统&#xff0c;系统架构&#xff1a;springbootlayui 系统截图 ) 技术选型 技术版本说明Spring Boot2.1.6MVC核心框架Spring Security oauth22.1.5认证和授权框架MyBatis3.5.0ORM框架MyBatisPlus3.1.0基于mybatis&#xff0c;使用lambda表达式的…

TensorFlow2实战-系列教程6:迁移学习实战

&#x1f9e1;&#x1f49b;&#x1f49a;TensorFlow2实战-系列教程 总目录 有任何问题欢迎在下面留言 本篇文章的代码运行界面均在Jupyter Notebook中进行 本篇文章配套的代码资源已经上传 1、迁移学习 用已经训练好模型的权重参数当做自己任务的模型权重初始化一般全连接层需…

读AI3.0笔记08_自然语言

1. 人工智能研究的惯用的套路 1.1. 定义一个在细分领域中比较有用的任务 1.2. 收集一个大型数据集来测试机器在该任务上的性能 1.3. 对人类在该数据集上完成任务的能力进行一个有限的度量 1.4. 建立一场竞赛使得人工智能系统可以在该数据集上互相竞争 1.5. 直到最终达到或…

内存储器之只读存储器(ROM),随机存取存储器(RAM)和Cache详解

内存储器 计算机中的存储器分为内存和外存两大类。 内存的存取速度快而容量相对较小&#xff0c;它与CPU直接相连&#xff0c;用来存放等待CPU运行的程序和处理的数据&#xff1b;外存的速度较慢而容量相对很大&#xff0c;它与CPU并不直接连接&#xff0c;用于永久性地存放计…

网络安全04-sql注入靶场第一关

目录 一、环境准备 1.1我们进入第一关也如图&#xff1a; ​编辑 二、正式开始第一关讲述 2.1很明显它让我们在标签上输入一个ID&#xff0c;那我们就输入在链接后面加?id1 ​编辑 2.2链接后面加个单引号()查看返回的内容&#xff0c;127.0.0.1/sqli/less-1/?id1,id1 …

Unity 迭代器模式(实例详解)

文章目录 简介**实例1&#xff1a;遍历数组****实例2&#xff1a;自定义迭代器类****实例3&#xff1a;异步加载资源****实例4&#xff1a;游戏关卡序列****实例5&#xff1a;无限生成敌人** 简介 在Unity中&#xff0c;虽然不直接使用迭代器模式的原始定义&#xff08;即设计…

PDF标准详解(一)——PDF文档结构

已经很久没有写博客记录自己学到的一些东西了。但是在过去一年的时间中自己确实又学到了一些东西。一直攒着没有系统化成一篇篇的文章&#xff0c;所以今年的博客打算也是以去年学到的一系列内容为主。通过之前Vim系列教程的启发&#xff0c;我发现还是写一些系列文章对自己的帮…

Springmvc-@RequestBody

SpringBoot-2.7.12 请求的body参数无法转换&#xff0c;服务端没有报错信息打印&#xff0c;而是响应的状态码是400 PostMapping("/static/user") public User userInfo(RequestBody(required false) User user){user.setAge(19);return user; }PostMapping("…

05 Redis之Benchmark+简单动态字符串SDS+集合的底层实现

3.8 Benchmark Redis安装完毕后会自动安装一个redis-benchmark测试工具&#xff0c;其是一个压力测试工具&#xff0c;用于测试 Redis 的性能。 src目录下可找到该工具 通过 redis-benchmark –help 命令可以查看到其用法 3.8.1 测试1 3.9 简单动态字符串SDS 无论是 Redis …

【面试】测试开发面试题

帝王之气&#xff0c;定是你和万里江山&#xff0c;我都护得周全 文章目录 前言1. 网络原理get与post的区别TCP/IP各层是如何传输数据的IP头部包含哪些内容TCP头部为什么有浮动网络层协议1. 路由协议2. 路由信息3. OSPF与RIP的区别Cookie与Session&#xff0c;Token的区别http与…

Redis学习——高级篇①

Redis学习——高级篇① Redis7高级之单线程和多线程&#xff08;一&#xff09; 一、Redis单线程VS多线程1.Redis的单线程部分1.1 Redis为什么是单线程&#xff1f;1.2 Redis所谓的“单线程”1.3 Redis演进变化1.3.1 Redis 3.x 单线程时代性能很快的原因1.3.2…

林浩然科学趣谈:妙解麦克斯韦方程的电磁奥秘

林浩然科学趣谈&#xff1a;妙解麦克斯韦方程的电磁奥秘 Lin Haoran’s Scientific Banter: Playful Insights into the Electromagnetic Mysteries of Maxwell’s Equations 在科学的璀璨星河中&#xff0c;林浩然如同一颗热爱探索的行星&#xff0c;以其独特的幽默和严谨的态…

latent-diffusion model环境配置--我转载的

latent-diffusion model环境配置&#xff0c;这可能是你能够找到的最细的博客了_latent diffusion model 训练 autoencoder-CSDN博客 前言 最近在研究diffusion模型&#xff0c;并对目前最火的stable-diffusion模型很感兴趣&#xff0c;又因为stable-diffusion是一种latent-di…