STC89C52单片机学习——第28节: [12-2] AT24C02数据存储秒表(定时器扫描按键数码管)

写这个文章是用来学习的,记录一下我的学习过程。希望我能一直坚持下去,我只是一个小白,只是想好好学习,我知道这会很难,但我还是想去做!

本文写于:2025.03.20

51单片机学习——第28节: [12-2] AT24C02数据存储&秒表(定时器扫描按键数码管)

  • 前言
  • 开发板说明
  • 引用
  • 解答和科普
  • 一、编写AT24C02的读写函数
  • 二、加入延迟函数实现LED闪烁
  • 问题
  • 总结

前言

   本次笔记是用来记录我的学习过程,同时把我需要的困难和思考记下来,有助于我的学习,同时也作为一种习惯,可以督促我学习,是一个激励自己的过程,让我们开始51单片机的学习之路。
   欢迎大家给我提意见,能给我的嵌入式之旅提供方向和路线,现在作为小白,我就先学习51单片机了,就跟着B站上的江协科技开始学习了.
   在这里会记录下江协科技51单片机开发板的配套视频教程所作的实验和学习笔记内容,因为我之前有一个开发板,我大概率会用我的板子模仿着来做.让我们一起加油!
   另外为了增强我的学习效果:每次笔记把我不知道或者问题在后面提出来,再下一篇开头作为解答!

开发板说明

   本人采用的是慧净的开发板,因为这个板子是我N年前就买的板子,索性就拿来用了。不再另外购买视频中的普中开发板了。
   原理图如下
在这里插入图片描述
视频中的都用这个开发板来实现,如果有资源就利用起来。
仔细看了看:开发板的晶振为:11.0592Mhz;12Mhz晶振是用来给CH340G芯片外置晶振;

下图是实物图
在这里插入图片描述

引用

51单片机入门教程-2020版 程序全程纯手打 从零开始入门
还参考了下图中的书籍:
手把手教你学51单片机(C语言版)
在这里插入图片描述
STC89C52手册
在这里插入图片描述

解答和科普

一、编写AT24C02的读写函数

1.I2C的拼图
在main函数中调出来,AT.C就不用调出来I2C了。
在这里插入图片描述
在这里插入图片描述

位声明:

sbit I2C_SCL =P1^7;
sbit I2C_SDA=P1^2;

1.1起始拼图
在这里插入图片描述

void I2C_Start(void)
{I2C_SDA=1;I2C_SCL=1;I2C_SDA=0;I2C_SCL=0;}

1.2终止拼图
在这里插入图片描述

void I2C_Stop(void)
{I2C_SDA=0;I2C_SCL=1;I2C_SDA=1;
}

1.3发送一个字节
在这里插入图片描述

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;			//看时序是否满足能够承受的时间是多少}
}

1.4接受一个字节

在这里插入图片描述

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;
}

1.5主机的发送应答
在这里插入图片描述
这里相当于主机写:

void I2C_SendAck(unsigned char AckBit)
{I2C_SDA=AckBit;I2C_SCL=1;I2C_SCL=0;
}

1.6 从机的接收应答
这里是从机写,反过来就是主机读
在这里插入图片描述

unsigned char I2C_ReceiveAck(void)
{unsigned char AckBit=0;I2C_SDA=1;I2C_SCL=1;AckBit=I2C_SDA;			//高电平读取I2C_SCL=0;return AckBit;
}

2.AT24C02 的数据帧

先宏定义一个地址:W

#define AT24C02_ADDRESS   0xA0

地址:R

AT24C02_ADDRESS|0x01

2.1字节写
在这里插入图片描述

#define AT24C02_ADDRESS   0xA0/*** @brief    AT24C02向指定地址写入一个字节数据* @param    WordAddress:字地址 范围0-255,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();
}

2.2 随机读
在这里插入图片描述

/*** @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;
}

3、写入数据测试
在这里插入图片描述

#include <REGX52.H>
#include "Key.h"
#include "LCD1602.h"
#include "AT24C02.h"
#include "Delay.H"unsigned char Data;
void main(void)
{LCD_Init();LCD_ShowString(1,1,"HELLO");AT24C02_WriteByte(1,66);Delay(5);Data=AT24C02_ReadByte(1);LCD_ShowNum(2,1,Data,2);while(1){}
}

测试现象
在这里插入图片描述
先写后读,掉电不丢失。在这里插入图片描述
AT24C02按键控制

#include <REGX52.H>
#include "Key.h"
#include "LCD1602.h"
#include "AT24C02.h"
#include "Delay.H"
#include "Init.h"unsigned char KeyNum;
unsigned int Num;
void main(void)
{LCD_Init();LCD_ShowNum(1,1,Num,5);Nixietube_OFF();DianZhengGuan();while(1){KeyNum=Key();if(KeyNum==1){Num++;LCD_ShowNum(1,1,Num,5);}if(KeyNum==2){Num--;LCD_ShowNum(1,1,Num,5);}if(KeyNum==3){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){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存储数据(按键控制)

二、加入延迟函数实现LED闪烁

问题

总结

本节课主要学

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

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

相关文章

Verilog-HDL/SystemVerilog/Bluespec SystemVerilog vscode 配置

下载 verible https://github.com/chipsalliance/verible的二进制包 然后配置 vscode

STM32使用HAL库,模拟UART输出字符串

测试芯片是STM32F103C8T6&#xff0c;直接封装好了&#xff0c;波特率是 9600 MyDbg.h #ifndef __MYDBG_H #define __MYDBG_H #include "stm32f1xx_hal.h" #include <stdio.h> #include <stdarg.h>/*使用GPIO口 模拟 UART 输出字符串 */ //初始化调试…

[工控机安全] 使用DriverView快速排查不可信第三方驱动(附详细图文教程)

导语&#xff1a; 在工业控制领域&#xff0c;设备驱动程序的安全性至关重要。第三方驱动可能存在兼容性问题、安全漏洞甚至恶意代码&#xff0c;威胁设备稳定运行。本文将手把手教你使用 DriverView工具&#xff0c;高效完成工控机驱动安全检查&#xff0c;精准识别可疑驱动&a…

HTML5响应式使用css媒体查询

HTML 负责搭建页面结构&#xff0c;CSS 负责样式设计&#xff0c;并且通过媒体查询实现了较好的响应式效果&#xff0c;能够适应不同屏幕尺寸下面就是写了一个详细的实例。 CSS 部分 * {margin: 0;padding: 0;box-sizing: border-box; } * 是通配选择器&#xff0c;会选中页面…

洛谷P1434 [SHOI2002] 滑雪

P1434 [SHOI2002] 滑雪 - 洛谷 代码区&#xff1a; #include<algorithm> #include<iostream> #include<cstring> using namespace std;const int MAX 105; int r, c; int arr[MAX][MAX], dp[MAX][MAX]; int xindex[4] {-1,1,0,0};//上下左右 int yindex[…

【操作系统】进程间通信方式

进程间通信方式 前言 / 概述一、管道管道命名管道 二、消息队列三、共享内存四、信号量信号量概述互斥访问条件同步信号 五、socket总结 前言 / 概述 每个进程的用户地址空间都是独立的&#xff0c;⼀般而言是不能互相访问的&#xff0c;但内核空间是每个进程都共享的&#xff…

WPF 布局中的共性尺寸组(Shared Size Group)

1. 什么是共性尺寸组&#xff1f; 在 WPF 的 Grid 布局中&#xff0c;SharedSizeGroup 允许多个 Grid 共享同一列或行的尺寸&#xff0c;即使它们属于不同的 Grid 也能保持大小一致。这样可以保证界面元素的对齐性&#xff0c;提高布局的一致性。 SharedSizeGroup 主要用于需…

Netty源码—2.Reactor线程模型二

大纲 1.关于NioEventLoop的问题整理 2.理解Reactor线程模型主要分三部分 3.NioEventLoop的创建 4.NioEventLoop的启动 4.NioEventLoop的启动 (1)启动NioEventLoop的两大入口 (2)判断当前线程是否是NioEventLoop线程 (3)创建一个线程并启动 (4)NioEventLoop的启动总结 (…

前端项目中应该如何选择正确的图片格式

在前端项目中选择正确的图片格式是优化页面性能、提升用户体验的关键步骤之一。以下是常见图片格式的特点、适用场景及选择建议&#xff0c;帮助你在不同场景下做出最优决策&#xff1a; 一、常见图片格式对比 格式特点适用场景不适用场景JPEG- 有损压缩&#xff0c;文件小- 不…

保姆级 STM32 HAL 库外部中断教学

1. 外部中断概述 为什么用外部中断&#xff1f; 当按键按下时&#xff0c;CPU 无需轮询检测引脚状态&#xff0c;而是通过中断机制立即响应&#xff0c;提高效率&#xff0c;适用于实时性要求高的场景。 关键概念 EXTI (External Interrupt/Event Controller)&#xff1a;ST…

Postman高级功能深度解析:Mock Server与自动化监控——构建高效API测试与监控体系

引言&#xff1a;Postman在API开发中的核心价值 在数字化时代&#xff0c;API&#xff08;应用程序编程接口&#xff09;已成为系统间交互的“神经网络”&#xff0c;其质量直接影响用户体验与业务连续性。然而&#xff0c;传统API测试面临两大挑战&#xff1a; 开发阶段依赖…

【程序人生】成功人生架构图(分层模型)

文章目录 ⭐前言⭐一、根基层——价值观与使命⭐二、支柱层——健康与能量⭐三、驱动层——学习与进化⭐四、网络层——关系系统⭐五、目标层——成就与财富⭐六、顶层——意义与传承⭐外层&#xff1a;调节环——平衡与抗风险⭐思维导图 标题详情作者JosieBook头衔CSDN博客专家…

【最后203篇系列】020 rocksdb agent

今天还是挺开心的一天&#xff0c;又在工具箱里加了一个工具。嗯&#xff0c;但是快下班的时候也碰到一些不太顺心的事&#xff0c;让我有点恼火。我还真没想到一个专职的前端&#xff0c;加测试&#xff0c;以及其他一堆人&#xff0c;竟然不知道后端返回的markdown,在前端渲染…

10-- 网络攻击防御原理全景解析 | 从单包攻防到DDoS军团作战(包你看一遍全记住)

&#x1f6e1;️ 网络攻击防御原理全景解析 | 从单包攻防到DDoS军团作战 如果你也对网络工程师的内容感兴趣的话&#xff0c;欢迎看我的最新文章9–BGP路由黑洞&#xff08;超万字大解析&#xff09;&#xff1a;网络世界的“百慕大三角“逃生指南(BGP路由配置实验含路由黑洞,…

解锁Python print()函数高级用法

print() 是 Python 中最常用的函数之一,用于将内容输出到控制台。虽然它的基本用法非常简单,但 print() 函数还支持许多高级功能,如格式化输出、重定向输出、控制分隔符和结束符等。 1. print() 函数的基本用法 1.1 语法 print() 函数的基本语法如下: print(*objects, …

鬼泣:动作系统3

文章目录 self-Tag&#xff1a;可以直接在游戏运行时通过标签区分不同Actorsolid隔离&#xff1a;模块化低耦合&#xff1a;将功能拆分成多个模块&#xff0c;修改单一模块时无需修改其他模块 动作优先级&#xff1a;当前动作能否打断上一动作函数不能使用timelineset timer by…

Polymer入门指南:从零开始构建、组织、管理Web Component

前言 Web Component是一种强大的技术&#xff0c;它允许开发者创建可重用的自定义元素&#xff0c;其功能和样式都与原生HTML元素类似。Polymer是一个用于创建Web Component的库&#xff0c;简化了开发过程。今天我们将一起来了解如何基于Polymer开发Web Component。 什么是P…

广度优先搜索(BFS) vs 深度优先搜索(DFS):算法对比与 C++ 实现

目录 一、BFS 和 DFS 的核心思想 1. BFS&#xff08;广度优先搜索&#xff09; 2. DFS&#xff08;深度优先搜索&#xff09; 二、BFS 和 DFS 的对比 三、C 代码实现 1. BFS 实现&#xff08;邻接表表示的无向图&#xff09; 2. DFS 实现&#xff08;递归与迭代两种方式&…

vulhub靶机----基于docker的初探索,环境搭建

环境搭建 首先就是搭建docker环境&#xff0c;这里暂且写一下 #在kali apt update apt install docker.io配置docker源&#xff0c;位置在/etc/docker/daemon.json {"registry-mirrors": ["https://5tqw56kt.mirror.aliyuncs.com","https://docker…

第7章 类与面向对象

6-1 二维平面上的点操作&#xff08;Python3&#xff09; 题目描述 设计一个表示二维平面上点的类 Point。该类应该包含以下功能&#xff1a; 两个私有属性 _x 和 _y&#xff0c;分别表示点的横坐标和纵坐标。 一个构造函数 __init__&#xff0c;用于初始化点的坐标。 一个…