51单片机(十二)AT24C02(I2C)

news2024/11/22 11:16:14

❤️ 专栏简介:本专栏记录了从零学习单片机的过程,其中包括51单片机和STM32单片机两部分;建议先学习51单片机,其是STM32等高级单片机的基础;这样再学习STM32时才能融会贯通。
☀️ 专栏适用人群 :适用于想要从零基础开始学习入门单片机,且有一定C语言基础的的童鞋。
🌙专栏目标:实现从零基础入门51单片机和STM32单片机,力求在玩好单片机的同时,能够了解一些计算机的基本概念,了解电路及其元器件的基本理论等。

⭐️ 专栏主要内容: 主要学习51单片机的功能、各个模块、单片机的外设、驱动等,最终玩好单片机和单片机的外设,全程手敲代码,实现我们所要实现的功能。
🌴 专栏说明 :如果文章知识点有错误的地方,欢迎大家随时在文章下面评论,我会第一时间改正。让我们一起学习,一起进步。
💑专栏主页:http://t.csdn.cn/HCD8v

本学习过程参考:https://space.bilibili.com/383400717

单片机安装软件、各种资料以及源码的路径:
https://pan.baidu.com/s/1vDTN2o8ffvczzNQGfyjHng
提取码:gdzf

本节主要介绍学习AT24C02(I2C)的相关知识,包括AT24C02(I2C)基础知识介绍、本节目标等;基础知识包括存储器介绍、AT24C02介绍、I2C总线介绍、AT24C02数据帧;并利用两个小实验来写程序进行练习,分别是AT24C02数据存储以及秒表(定时器扫描按键数码管),最后附上相关代码。

文章目录

  • 一、AT24C02(I2C)和本节目标
    • 1.1 AT24C02(I2C)基础知识
      • 1.1.1 存储器介绍
      • 1.1.2 AT24C02介绍
      • 1.1.3 I2C总线介绍
      • 1.1.4 AT24C02数据帧
    • 1.2 本节目标
  • 二、AT24C02数据存储
  • 三、秒表(定时器扫描按键数码管)

一、AT24C02(I2C)和本节目标

1.1 AT24C02(I2C)基础知识

1.1.1 存储器介绍

在这里插入图片描述
存储器分为RAM和ROM两种;RAM表示随机存储器;ROM表示只读存储器;

  • RAM的特点是存储速度特别快,但是掉电会丢失;
  • ROM的存储速度比较慢,但是特点是掉电后不会丢失。

所以一般都是两者结合使用,他们各自的种类如上图所示。

存储器的简化模型
在这里插入图片描述
存储器内部分为地址总线(横向)和数据总线(纵向);

当第一根地址总线被给到高电平1时,表示被选中,此时如果将纵向的第1,2,3根线连上,其他线不连,则表示第一根地址总线存储的数据为1110 0000 ,如下图所示:

在这里插入图片描述

当然纵向的数据总线并不是直接连在地址总线上的,为了防止各个行之间的互相干扰,而是通过二极管的方式,如图中右侧的Mask ROM和PROM,二极管可以保证电流只是一个方向;

在这里插入图片描述
图中的蓝色二极管比较特殊,其很容易被击穿;当断开时,两个二极管都是断开;但是当有高电压过来时,蓝色二极管被击穿,也就成了右边的短路接通状态;因此PROM只能写入数据一次,就是因为蓝色二极管被击穿后无法恢复,只能被击穿一次;(所以单片机下载程序的过程也被成为烧录,就是烧毁的意思);

1.1.2 AT24C02介绍

在这里插入图片描述

AT24C02是一种掉电不丢失的存储器;其存储介质是E2PROM(电可擦除可编程ROM);使用的通讯接口是I2C总线;

引脚和应用电路

在这里插入图片描述
WP是写保护接口。

内部结构框图

在这里插入图片描述

1.1.3 I2C总线介绍

详细的介绍参考视频:https://www.bilibili.com/video/BV1Mb411e7re?p=27&vd_source=e2638d12685eef84cda913d9d67be0a9第45分钟开始,建议详细看一下这一部分。

在这里插入图片描述

I2C电路规范

在这里插入图片描述
I2C总线的时序图:

在这里插入图片描述

在这里插入图片描述
绿色代表发送一个字节;

在这里插入图片描述

紫色代表接收一个字节;

在这里插入图片描述
黄色表示发送应答;黑色表示接收应答;0表示收到;

发送一帧数据
在这里插入图片描述

接收一帧数据
在这里插入图片描述

复合格式
在这里插入图片描述

在这里插入图片描述

手册上的时序图:

在这里插入图片描述

1.1.4 AT24C02数据帧

1.2 本节目标

目标1:AT24C02数据存储
刚开始hi初始化后,LCD1602上显示0000,每按下K1按键,数字加一,即变成0001,再按下变成0002;按下K2时数字减1;0000减1是65535;按下K3按键是将当前数字保存下来;即使断电再上电后,按下K4按键也能恢复上次保存的数字。

在这里插入图片描述

目标2:秒表(定时器扫描按键数码管)

目标2实现一个秒表,按下K1按键,秒表开始工作:
在这里插入图片描述
再按下K1,秒表暂停;按下K2,秒表清零

在这里插入图片描述
按下K3,保存当前数字,
在这里插入图片描述

然后断电,再重新上电后,按下K4,恢复原来保存的数字

在这里插入图片描述

二、AT24C02数据存储

代码路径:51单片机入门教程资料\课件及程序源码\程序源码\KeilProject\12-1 AT24C02数据存储
具体代码:

#include <REGX52.H>
#include "LCD1602.h"
#include "Key.h"
#include "AT24C02.h"
#include "Delay.h"

unsigned char KeyNum;
unsigned int Num;

void main()
{
	LCD_Init();
	LCD_ShowNum(1,1,Num,5);
	while(1)
	{
		KeyNum=Key();
		if(KeyNum==1)	//K1按键,Num自增
		{
			Num++;
			LCD_ShowNum(1,1,Num,5);
		}
		if(KeyNum==2)	//K2按键,Num自减
		{
			Num--;
			LCD_ShowNum(1,1,Num,5);
		}
		if(KeyNum==3)	//K3按键,向AT24C02写入数据
		{
			AT24C02_WriteByte(0,Num%256);
			Delay(5);
			AT24C02_WriteByte(1,Num/256);
			Delay(5);
			LCD_ShowString(2,1,"Write OK");
			Delay(1000);
			LCD_ShowString(2,1,"        ");
		}
		if(KeyNum==4)	//K4按键,从AT24C02读取数据
		{
			Num=AT24C02_ReadByte(0);
			Num|=AT24C02_ReadByte(1)<<8;
			LCD_ShowNum(1,1,Num,5);
			LCD_ShowString(2,1,"Read OK ");
			Delay(1000);
			LCD_ShowString(2,1,"        ");
		}
	}
}

AT24C02.c:AT24C02存储的相关操作

#include <REGX52.H>
#include "I2C.h"

#define AT24C02_ADDRESS		0xA0

/**
  * @brief  AT24C02写入一个字节
  * @param  WordAddress 要写入字节的地址
  * @param  Data 要写入的数据
  * @retval 无
  */
void AT24C02_WriteByte(unsigned char WordAddress,Data)
{
	I2C_Start();
	I2C_SendByte(AT24C02_ADDRESS);
	I2C_ReceiveAck();
	I2C_SendByte(WordAddress);
	I2C_ReceiveAck();
	I2C_SendByte(Data);
	I2C_ReceiveAck();
	I2C_Stop();
}

/**
  * @brief  AT24C02读取一个字节
  * @param  WordAddress 要读出字节的地址
  * @retval 读出的数据
  */
unsigned char AT24C02_ReadByte(unsigned char WordAddress)
{
	unsigned char Data;
	I2C_Start();
	I2C_SendByte(AT24C02_ADDRESS);
	I2C_ReceiveAck();
	I2C_SendByte(WordAddress);
	I2C_ReceiveAck();
	I2C_Start();
	I2C_SendByte(AT24C02_ADDRESS|0x01);
	I2C_ReceiveAck();
	Data=I2C_ReceiveByte();
	I2C_SendAck(1);
	I2C_Stop();
	return Data;
}

I2C.c:I2C总线的相关操作

#include <REGX52.H>

sbit I2C_SCL=P2^1;
sbit I2C_SDA=P2^0;

/**
  * @brief  I2C开始
  * @param  无
  * @retval 无
  */
void I2C_Start(void)
{
	I2C_SDA=1;
	I2C_SCL=1;
	I2C_SDA=0;
	I2C_SCL=0;
}

/**
  * @brief  I2C停止
  * @param  无
  * @retval 无
  */
void I2C_Stop(void)
{
	I2C_SDA=0;
	I2C_SCL=1;
	I2C_SDA=1;
}

/**
  * @brief  I2C发送一个字节
  * @param  Byte 要发送的字节
  * @retval 无
  */
void I2C_SendByte(unsigned char Byte)
{
	unsigned char i;
	for(i=0;i<8;i++)
	{
		I2C_SDA=Byte&(0x80>>i);
		I2C_SCL=1;
		I2C_SCL=0;
	}
}

/**
  * @brief  I2C接收一个字节
  * @param  无
  * @retval 接收到的一个字节数据
  */
unsigned char I2C_ReceiveByte(void)
{
	unsigned char i,Byte=0x00;
	I2C_SDA=1;
	for(i=0;i<8;i++)
	{
		I2C_SCL=1;
		if(I2C_SDA){Byte|=(0x80>>i);}
		I2C_SCL=0;
	}
	return Byte;
}

/**
  * @brief  I2C发送应答
  * @param  AckBit 应答位,0为应答,1为非应答
  * @retval 无
  */
void I2C_SendAck(unsigned char AckBit)
{
	I2C_SDA=AckBit;
	I2C_SCL=1;
	I2C_SCL=0;
}

/**
  * @brief  I2C接收应答位
  * @param  无
  * @retval 接收到的应答位,0为应答,1为非应答
  */
unsigned char I2C_ReceiveAck(void)
{
	unsigned char AckBit;
	I2C_SDA=1;
	I2C_SCL=1;
	AckBit=I2C_SDA;
	I2C_SCL=0;
	return AckBit;
}

最终的效果就是目标1.

三、秒表(定时器扫描按键数码管)

代码路径:51单片机入门教程资料\课件及程序源码\程序源码\KeilProject\12-2 秒表(定时器扫描按键数码管)
具体代码:

#include <REGX52.H>
#include "Timer0.h"
#include "Key.h"
#include "Nixie.h"
#include "Delay.h"
#include "AT24C02.h"

unsigned char KeyNum;
unsigned char Min,Sec,MiniSec;
unsigned char RunFlag;

void main()
{
	Timer0_Init();
	while(1)
	{
		KeyNum=Key();
		if(KeyNum==1)			//K1按键按下
		{
			RunFlag=!RunFlag;	//启动标志位翻转
		}
		if(KeyNum==2)			//K2按键按下
		{
			Min=0;				//分秒清0
			Sec=0;
			MiniSec=0;
		}
		if(KeyNum==3)			//K3按键按下
		{
			AT24C02_WriteByte(0,Min);	//将分秒写入AT24C02
			Delay(5);
			AT24C02_WriteByte(1,Sec);
			Delay(5);
			AT24C02_WriteByte(2,MiniSec);
			Delay(5);
		}
		if(KeyNum==4)			//K4按键按下
		{
			Min=AT24C02_ReadByte(0);	//读出AT24C02数据
			Sec=AT24C02_ReadByte(1);
			MiniSec=AT24C02_ReadByte(2);
		}
		Nixie_SetBuf(1,Min/10);	//设置显示缓存,显示数据
		Nixie_SetBuf(2,Min%10);
		Nixie_SetBuf(3,11);
		Nixie_SetBuf(4,Sec/10);
		Nixie_SetBuf(5,Sec%10);
		Nixie_SetBuf(6,11);
		Nixie_SetBuf(7,MiniSec/10);
		Nixie_SetBuf(8,MiniSec%10);
	}
}

/**
  * @brief  秒表驱动函数,在中断中调用
  * @param  无
  * @retval 无
  */
void Sec_Loop(void)
{
	if(RunFlag)
	{
		MiniSec++;
		if(MiniSec>=100)
		{
			MiniSec=0;
			Sec++;
			if(Sec>=60)
			{
				Sec=0;
				Min++;
				if(Min>=60)
				{
					Min=0;
				}
			}
		}
	}
}

void Timer0_Routine() interrupt 1
{
	static unsigned int T0Count1,T0Count2,T0Count3;
	TL0 = 0x18;		//设置定时初值
	TH0 = 0xFC;		//设置定时初值
	T0Count1++;
	if(T0Count1>=20)
	{
		T0Count1=0;
		Key_Loop();	//20ms调用一次按键驱动函数
	}
	T0Count2++;
	if(T0Count2>=2)
	{
		T0Count2=0;
		Nixie_Loop();//2ms调用一次数码管驱动函数
	}
	T0Count3++;
	if(T0Count3>=10)
	{
		T0Count3=0;
		Sec_Loop();	//10ms调用一次数秒表驱动函数
	}
}

最终的效果是目标2。

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

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

相关文章

车企招聘高薪车载开发岗位,如何抓住机会进入该领域?

随着智能化、电动化和网联化的趋势不断加强&#xff0c;车载应用正在成为汽车和信息技术产业的一个重要领域。未来的车载应用将会实现智能驾驶、舒适性、智能信息娱乐等领域的创新&#xff0c;为车辆和车主带来更好的用户体验。 从行业来看&#xff0c;车载应用的相关企业不断…

Azkaban学习——单机版安装与部署

目录 1.解压改名 2.修改装有mysql的虚拟机的my.cnf文件 3.重启装有mysql的虚拟机 4.Datagrip创建azkaban数据库&#xff0c;执行脚本文件 5.修改/opt/soft/azkaban-exec/conf/azkaban.properties文件 6.修改commonprivate.properties 7.传入mysql-connector-java-8.0.29…

最简单的helm教程

最简单的Helm教程 学习前置条件 你得了解Kubernetes&#xff0c;拥有实际的使用经验那是最好不过了 Helm是什么&#xff1f; 我们打开Helm的官网&#xff1a;Helm的官网 可以看到官网的第一页就告诉了我们Helm是什么。 **Helm是Kubernetes&#xff08;k8s&#xff09;的包…

第十二届蓝桥杯青少组省赛Python真题,包含答案

目录 一、选择题 二、编程题 第十二届蓝桥杯青少组省赛Python真题 一、选择题 第 1 题 单选题 设s="Hello Lan Qiao,执行print(s[4:11])输出的结果为 () 答案:D 第 2 题 单选题 循环语句for iin range (8,4,2) : 执行了几次循环 ()

进腾讯了,38k....

大家好&#xff0c;最近有一位老同学成功去了腾讯&#xff0c;特意找他要了一些面试相关的资料&#xff0c;内容涵盖测试理论、Linux基础、MySQL基础、Web测试、接口测试、App测试、管理工具、Python基础、Selenium相关、性能测试、LordRunner相关等质量非常高&#xff01;&…

SM2椭圆曲线公钥密码算法--密钥对与数字签名

1. SM2国密算法介绍 SM2算法全称是SM2椭圆曲线公钥密码算法&#xff08;SM是商用密码的拼音缩写&#xff09;&#xff0c;是一种基于“椭圆曲线”的密码ECC(Elliptic Curve Cryptography)。2016年&#xff0c;SM2成为中国国家密码标准。 在商用密码体系中&#xff0c;SM2主要用…

超详细,多图 PVE 安装 OpenWRT 教程(个人记录)

前言 - 写这个的目的是因为本人健忘所以做个记录以便日后再折腾时查阅。 - 本人笔拙如有选词&#xff0c;错字&#xff0c;语法&#xff0c;标点错误请忽视&#xff0c;大概率不会修改&#xff0c;我自己能看懂就好。 - 内容仅适用于本人的使用环境&#xff0c;不同环境请忽…

Java --- redis7之布隆过滤器BloomFilter

目录 一、布隆过滤器BloomFilter 1.1、面试题 1.2、 布隆过滤器简介 1.2.1、设计思想 1.3、特点 1.4、布隆过滤器原理 1.4.1、实现原理与数据结构 1.4.2、添加key、查询key 1.4.3、hash冲突导致数据不精准 1.4.4、三步骤 1.4.5、布隆过滤器误判&#xff0c;为什么不…

使用ncnn在树莓派4B上部署nanoDet-m网络(12fps)

1. 背景 在机器人的应用中&#xff0c;目标检测是一个重要的课题。深度学习的快速发展&#xff0c;在检测的效果方面对比大多数传统检测算法&#xff0c;都有明显的优势。但是将深度学习模型部署到端侧设备上&#xff0c;实现高效的推理&#xff0c;同样是一个问题很多的领域。…

1099 Build A Binary Search Tree(超详细注解+38行代码)

分数 30 全屏浏览题目 作者 CHEN, Yue 单位 浙江大学 A Binary Search Tree (BST) is recursively defined as a binary tree which has the following properties: The left subtree of a node contains only nodes with keys less than the nodes key.The right subtree…

Word+ChatGPT,一分钟完成周报总结作文

大家好&#xff0c;我是可夫小子&#xff0c;关注AIGC、读书和自媒体。解锁更多ChatGPT、AI绘画玩法。加&#xff1a;keeepdance&#xff0c;备注&#xff1a;chatgpt&#xff0c;拉你进群。 Office 的办公软件Word&#xff0c;是我们日常的文字工作的阵地。与ChatGPT的文字生成…

自学黑客【网络安全】,一般人我劝你还是算了吧

一、自学网络安全学习的误区和陷阱 1.不要试图先成为一名程序员&#xff08;以编程为基础的学习&#xff09;再开始学习 我一直强调不要以编程为基础再开始学习网络安全&#xff0c;一般来说&#xff0c;学习编程不但学习周期长&#xff0c;而且实际向安全过渡后可用到的关键…

6 # 实现简单的 promise

什么是 Promise &#xff1f; 在 JavaScript 中&#xff0c;Promise 是一种用于处理异步操作的对象&#xff0c;它可以更加优雅地处理回调函数嵌套和错误处理。 promise es6已经内部实现了&#xff0c; ie 不兼容 promise&#xff0c;需要 polyfill &#xff08;比如&#xf…

C++学习记录——이십이 红黑树

文章目录 1、了解概念2、模拟实现1、插入2、插入代码3、测试是否是红黑树 3、封装map、set 1、了解概念 红黑树&#xff0c;是一种二叉搜索树&#xff0c;但在每个结点上增加一个存储位表示结点的颜色&#xff0c;可以是Red或 Black。 通过对任何一条从根到叶子的路径上各个结…

Dcip的学习1-计算器

文章目录 前言一、配置安装环境1.1 网址1.2 再次打开需要进行的操作1.3 NodeJS控制台的操作1.4 出现的页面 二、Dcip生成计算器2.1 软件的基本单位 - Unitform中添加内容 2.2 OnleftChange(); 前言 只是为方便学习&#xff0c;不做其他用途&#xff0c; 一、配置安装环境 1.1 …

Jetpack之Navigation技术解密

Navigation是什么 官方的话&#xff1a; Navigation 是一个框架&#xff0c;用于在 Android 应用中的“目标”之间导航&#xff0c;该框架提供一致的 API&#xff0c;无论目标是作为 Fragment、Activity 还是其他组件实现。 自己的话&#xff1a; Navigation是管理Fragment…

win11、VS2019下配置PCL1.11.1

1、PCL安装配置 下载pcl-1.11.1-pdb-msvc2019-win64与PCL-1.11.1-AllInOne-msvc2019-win64.exe文件。以管理员身份运行PCL-1.11.1-AllInOne-msvc2019-win64.exe程序&#xff0c;截图如下&#xff1a; 安装过程中没有弹出OpenNI2的安装&#xff0c;但是要安装在3rdParty下&#…

MySQL空间查询

MySQL空间查询 文章目录 MySQL空间查询1. 空间数据支持2. 空间函数支持3. 操作示例3.1 创建表结构3.2 插入数据3.3 查询空间相交数据 4. 参考链接 1. 空间数据支持 MySQL 具有对应于 OpenGIS 类的空间数据类型。一些空间数据类型包含单个几何值&#xff1a; GEOMETRYPOINTLIN…

PCS-2022-VVC中帧内和帧间预测的统一快速划分算法

本文来自PCS 2022的论文《Unified Fast Partitioning Algorithm for Intra and Inter Predictions in Versatile Video Coding》 介绍 VVC (Versatile Video Coding) 标准采用了比HEVC (High Efficiency Video Coding) 标准更灵活的划分结构&#xff0c;在HEVC的四叉树划分结构…

前端CSS经典面试题总结

前端CSS经典面试题总结 2.1 介绍一 下 CSS 的盒子模型&#xff1f;2.2 css 选择器优先级&#xff1f;2.3 垂直居中几种方式&#xff1f;2.4 简明说一下 CSS link 与 import 的区别和用法&#xff1f;2.5 rgba和opacity的透明效果有什么不同&#xff1f;2.6 display:none和visib…