做推广便宜的网站有哪些/关键词推广软件
1.EEPROM概念
1.EEPROM
1.1 一些概念
(1)一些概念:ROM【只读存储器---硬盘】,RAM【随机访问存储器--内存】,PROM【可编程的ROM】,EPROM【可擦除ROM】,EEPROM【电可擦除ROM】
1.2 为什么需要EEPROM
单片机内部的ROM只能在程序下载时进行擦除和改写,但是程序运行本身是不能改写的。
单片机内部的RAM中的数据程序运行时可以改,但是掉电就丢失了。
有时候我们需要有一些数据存在系统中,要求掉电不丢失,而且程序还要能改。所以内部ROM和RAM都不行。【这时候系统需要一块EEPROM】
1.3 EEPROM和flash的区别与联系
单片机解密中Flash和EEPROM的区别-电子工程世界
1.4 EEPROM存在系统中的2种形式
1:内置在单片机内部
2:外部扩展
2.EEPROM如何编程
1.I2C接口底层时序
底层:CPU和I2C的接口
2.器件定义的寄存器读写时序
上层:器件时序
2.AT24C02原理图和数据手册
1.接线确定
查看SCL和SDA无其他接线影响
SCL对应P2.1 SDA对应P2.0
2.数据手册理论
立创商城_一站式电子元器件采购自营商城_现货元器件交易网-嘉立创电子商城
24c02中文官方资料手册pdf - 百度文库
1.芯片的基本信息
类似于一个主持人叫A说话,其他人就不可以说话,但是其他人可以听到主持人和A说话,但是不可以回应。 --广播式
主设备:51单片机---发送器
从设备:24Cxxx---接收器
2.I2C从地址确定
每一个I2C都有从地址
3.I2C底层时序
起始信号:
发送字节:一般第一个是从设备的地址【因为我们在通话之前,要先发送要进行通话的地址,设备都与自己的地址是否相同,如果相同则响应;如果不同,则丢弃】
读取字节:
停止信号:
3.I2C总结
(1)主CPU和其附属芯片之间最常用的接口,尤其是各种传感器,因此在物联网时代非常重要
(2)三根线:SCL,SDA,GND,串行,电平式
(3)总线式结构:可以一对多,总线上可以挂上百个器件【一个主设备,多个从设备】,用【从地址】来区分--主设备不需要地址
(4)主从式,由主设备来发起通信及总线仲裁,从设备被动响应
(5)通信速率一般(kbps级别),不合适语音,视频等信息类型
4.I2C总线协议定义
起始信号
终止信号
应答信号
从设备回复主设备,判断从设备是否得到数据。
可以设置是否要进行”应答信号“【可有可无】
3.I2C低层时序图和程序
1.起始信号和结束信号
SCL和SDA交互进行判断
(1)起始信号:SCL保持高时,SDA有一个从高到低(下降沿)
(2)结束信号:SCL保持高时,SDA有一个从低到高(上升沿)
起始信号
/*******************************************************************************
* 函 数 名 : iic_start
* 函数功能 : 产生IIC起始信号
* 输 入 : 无
* 输 出 : 无
*******************************************************************************/
void iic_start(void)
{IIC_SDA=1;//如果把该条语句放在SCL后面,第二次读写会出现问题delay_10us(1);IIC_SCL=1;delay_10us(1);IIC_SDA=0; //当SCL为高电平时,SDA由高变为低,表示起始信号delay_10us(1);IIC_SCL=0;//钳住I2C总线,准备发送或接收数据delay_10us(1);
}
终止信号
/*******************************************************************************
* 函 数 名 : iic_stop
* 函数功能 : 产生IIC停止信号
* 输 入 : 无
* 输 出 : 无
*******************************************************************************/
void iic_stop(void)
{ IIC_SDA=0;//如果把该条语句放在SCL后面,第二次读写会出现问题delay_10us(1);IIC_SCL=1;delay_10us(1);IIC_SDA=1; //当SCL为高电平时,SDA由低变为高,表示结束信号delay_10us(1);
}
2.I2C发送一个字节
传输”0“或应答位(A)
传输”1“或应答位(/A)
/*******************************************************************************
* 函 数 名 : iic_write_byte
* 函数功能 : IIC发送一个字节
* 输 入 : dat:发送一个字节
* 输 出 : 无
*******************************************************************************/
void iic_write_byte(u8 dat)
{ u8 i=0; //为了保证时序正确,这里要加上 //当SDA将数据放好才可以将SCL置为高电平IIC_SCL=0; for(i=0;i<8;i++) //循环8次将一个字节传出,先传高再传低位{ if((dat&0x80)>0) IIC_SDA=1;elseIIC_SDA=0;dat<<=1; //将次高位移动到最高位 delay_10us(1); IIC_SCL=1; //产生一个上升沿delay_10us(1); IIC_SCL=0; //产生一个下降沿 delay_10us(1);}
}
(1)I2C发送和接收字节时,都是从高位开始的
3.应答位处理
在接收完8位bit后,在第9个时间周期
应答处理:SDA变低【AT2402拉低】。
如果我们去检测,如果此时SDA为低电平,则表示已经被拉低,则表示已经响应到;如果SDA为高电平,则表示未能响应到。
产生ACK应答
/*******************************************************************************
* 函 数 名 : iic_ack
* 函数功能 : 产生ACK应答
* 输 入 : 无
* 输 出 : 无
*******************************************************************************/
void iic_ack(void)
{IIC_SCL=0;IIC_SDA=0; //SDA为低电平delay_10us(1);IIC_SCL=1; //将SCL拉高delay_10us(1);IIC_SCL=0; //在将SCL拉低
}
产生NACK非应答
/*******************************************************************************
* 函 数 名 : iic_nack
* 函数功能 : 产生NACK非应答
* 输 入 : 无
* 输 出 : 无
*******************************************************************************/
void iic_nack(void)
{IIC_SCL=0;IIC_SDA=1; //SDA为高电平delay_10us(1);IIC_SCL=1;delay_10us(1);IIC_SCL=0;
}
等待应答信号到来
/*******************************************************************************
* 函 数 名 : iic_wait_ack
* 函数功能 : 等待应答信号到来
* 输 入 : 无
* 输 出 : 1,接收应答失败0,接收应答成功
*******************************************************************************/
u8 iic_wait_ack(void)
{u8 time_temp=0;IIC_SCL=1;delay_10us(1);while(IIC_SDA) //等待SDA为低电平{time_temp++;if(time_temp>100)//超时则强制结束IIC通信{ iic_stop();return 1; } }IIC_SCL=0;return 0;
}
4.I2C接收一个字节
释放总线
在51单片机中,SDA=1就是释放总线【相当于主持人把话筒给嘉宾】;在其他更高级的单片机(比如STM32)这里的处理还会不一样。【因为拉高,则可以拉低(接地);但是拉低了,但是无法拉高】
为什么SDA=1就是释放总线??是因为当51单片机把引脚拉高时,从设备可以选择再把引脚拉高或者拉低;但是当51单片机把这个引脚拉低(接地)后,从设备也没有办法把这个引脚拉高了。
unsigned char IIC_ReadByte()
{unsigned char a=0,dat=0;//释放总线IIC_SDA=1; //起始和发送一个字节之后IIC_SCL都是0IIC_delay();//按道理来说这里应该有一个SCL=0的for(a=0;a<8;a++){IIC_SCL=1;//通知从设备我要开始读了,可以放bit数据到SDA了IIC_delay();dat<<=1; //读取的时候高位再前dat|=IIC_SDA;IIC_delay();IIC_SCL=0;// 拉低为下一个bit周期做准备ICC_delay();}return dat;
}
4.EEPROM读写测试
1. 器件寻址
(1)从器件的地址是由器件自身定义的,不同的从器件的地址的定义方式是不同的,要查具体的芯片数据手册来确定
(2)同一个I2C网络中只有一个主设备,但是从设备可以有多个。这多个从设备的地址不能相同。【硬件工程师必须保证这一点。因为从地址是不能通过软件设定的】
(3)A0,A1,A2----2的三次方=8【表示最多只能接8个EEPROM】
从CPU的角度来分析24C02的地址定义【如果不是从CPU角度看则得出结果不一样】
从设备地址是:读地址:0xa1
写地址:0xa0
2.24C02写高层时序
写操作时序
start-send_byte(从地址)--send_byte(字节地址)---send_byte(写入数据)
字节写
/*******************************************************************************
* 函 数 名 : at24c02_write_one_byte
* 函数功能 : 在AT24CXX指定地址写入一个数据
* 输 入 : addr:写入数据的目的地址 dat:要写入的数据
* 输 出 : 无
*******************************************************************************/
void at24c02_write_one_byte(u8 addr,u8 dat)
{ iic_start(); iic_write_byte(0XA0); //发送写命令,发送写器件地址 iic_wait_ack(); //表示要接收应答 iic_write_byte(addr); //发送写地址 iic_wait_ack(); //表示要接收应答 iic_write_byte(dat); //发送字节 iic_wait_ack(); iic_stop(); //产生一个停止条件delay_ms(10);
}
页写
/*******************************************************************************
* 函 数 名 : at24c02_write_one_byte
* 函数功能 : 在AT24CXX指定地址写入一个数据
* 输 入 : addr:写入数据的目的地址 dat:要写入的数据
* 输 出 : 无
*******************************************************************************/
void at24c02_write_one_byte(u8 addr,u8 dat[],u8 i)
{ u8 j; iic_start(); iic_write_byte(0XA0); //发送写命令,发送写器件地址 iic_wait_ack(); //表示要接收应答 iic_write_byte(addr); //发送写地址 iic_wait_ack(); //表示要接收应答 for(j=0;j<i;i++){iic_write_byte(dat[i]); //发送字节 iic_wait_ack();} iic_stop(); //产生一个停止条件delay_ms(10);
}
3. 24C02读高层时序
/*******************************************************************************
* 函 数 名 : at24c02_read_one_byte
* 函数功能 : 在AT24CXX指定地址读出一个数据
* 输 入 : addr:开始读数的地址
* 输 出 : 读到的数据
*******************************************************************************/
u8 at24c02_read_one_byte(u8 addr)
{ u8 temp=0; iic_start(); iic_write_byte(0XA0); //发送写命令 iic_wait_ack(); iic_write_byte(addr); //发送写地址 iic_wait_ack(); iic_start(); iic_write_byte(0XA1); //进入接收模式 iic_wait_ack(); temp=iic_read_byte(0); //读取字节 iic_stop(); //产生一个停止条件 return temp; //返回读取的数据
}
4.复合格式
1.先发送在接收
2.字节写+随机读
4.加入串口输出代码
/*******************************************************************************
* 实验名 : EEPROM实验
* 使用的IO :
* 实验效果 : 按K1保存显示的数据,按K2读取上次保存的数据,按K3显示数据加一,
*按K4显示数据清零。
* 注意 :由于P3.2口跟红外线共用,所以做按键实验时为了不让红外线影响实验效果,最好把红外线先
*取下来。
*
*********************************************************************************/
#include <reg51.h>
#include "at24c02.h"
#include "uart.h"void delay20ms(void) //误差 -0.000000000005us
{unsigned char a,b,c;for(c=1;c>0;c--)for(b=222;b>0;b--)for(a=40;a>0;a--);
}/*******************************************************************************
* 函 数 名 : main
* 函数功能 : 主函数
* 输 入 : 无
* 输 出 : 无
*******************************************************************************/void main()
{unsigned char i;unsigned char addr; unsigned char src_data[] = "()ab#cde!fg1234567"; unsigned char buf[8] = "ABCDEFGH";uart_init();
/*for (i=0; i<128; i++){uart_send_byte(i);}while (1);
*/// 先随便找一堆数据,譬如"abcdefg1234567-_-*&%@/\"// 把这些写入EEPROM的特定地址中// 然后读EEROM的这些地址,读出后通过串口打印出来看是不是我们写入的uart_send_byte('%');addr = 0;for (i=0; i<8; i++){At24c02Write(addr, src_data[i]);delay20ms();addr++;}//先打印出buf//如果这里没有给buf初始化,则打印会出现问题for (i=0; i<8; i++){uart_send_byte(buf[i]);}//分割for (i=0; i<20; i++){uart_send_byte('-');}// 读出测试addr = 0;for (i=0; i<8; i++){buf[i] = At24c02Read(addr);delay20ms();addr++;}//将数据打印出来for (i=0; i<8; i++){uart_send_byte(buf[i]);}while (1);// 进一步测试// 先写入一些特定内容,然后关机断电;然后改代码为读出并打印显示看内容}
问题分析
(1)通过调试发现程序跑飞了,经检测发现uart中没有关中断
(2)读出内容不对,怀疑是EEPROM经不起快速的连续读写,所以在读和写之间加入20ms的delay,测试后发现读写正确了
(3)定义了局部变量没有初始化,程序中直接去通过串口输出,结果导致程序
相关文章:

【单片机】14-I2C通信之EEPROM
1.EEPROM概念 1.EEPROM 1.1 一些概念 (1)一些概念:ROM【只读存储器---硬盘】,RAM【随机访问存储器--内存】,PROM【可编程的ROM】,EPROM【可擦除ROM】,EEPROM【电可擦除ROM】 1.2 为什么需要EE…...

Mini-dashboard 和meilisearch配合使用
下载的meilisearch一般是development模式,内置客户端,修改客户端后需要重要全部编译,花时间太长了。前后端分离才是正道,客户端修改不用重新编译后端。 方法如下: 1、修改配置文件/etc/meilisearch.toml,…...

leetcode 886. 可能的二分法
给定一组 n 人(编号为 1, 2, …, n), 我们想把每个人分进任意大小的两组。每个人都可能不喜欢其他人,那么他们不应该属于同一组。 给定整数 n 和数组 dislikes ,其中 dislikes[i] [ai, bi] ,表示不允许将…...

Elasticsearch:使用 ELSER 文本扩展进行语义搜索
在今天的文章里,我来详细地介绍如何使用 ELSER 进行文本扩展驱动的语义搜索。 安装 Elasticsearch 及 Kibana 如果你还没有安装好自己的 Elasticsearch 及 Kibana,请参考如下的链接来进行安装: 如何在 Linux,MacOS 及 Windows 上…...

OpenRadar DOA函数 Bartlett/CBF和Capon使用
Bartlett / CBF原理看这里 Capon原理看这里 这里只讲怎么调用openradar提供的aoa_bartlett和aoa_capon函数: 一些吐槽:虽然看起来openradar的作者代码水平很高,但里面有很多匪夷所思的写法,比如他demo里的解析文件格式就很迷啊等…...

二叉树--翻转二叉树
文章前言:如果有小白同学还是对于二叉树不太清楚,作者推荐:二叉树的初步认识_加瓦不加班的博客-CSDN博客 给你一棵二叉树的根节点 root ,翻转这棵二叉树,并返回其根节点。 如果思路不清楚,请看动态页面&am…...

强化学习环境 - robogym - 学习 - 3
强化学习环境 - robogym - 学习 - 3 文章目录 强化学习环境 - robogym - 学习 - 3项目地址为什么选择 robogymObservation - 观测信息Action - 动作信息Initialization - 初始状态设置 项目地址 https://github.com/openai/robogym 为什么选择 robogym 自己的项目需要做一些机…...

CUDA+cuDNN+TensorRT 配置避坑指南
深度学习模型加速部署的环境配置,需要在本地安装NVIDIA的一些工具链和软件包,这是一个些许繁琐的过程,而且一步错,步步错。笔者将会根据自己的经验来提供建议,减少踩坑几率。当然可以完全按照官方教程操作,…...

关于PointHeadBox类的理解
forward函数 def forward(self, batch_dict):"""Args:batch_dict:batch_size:point_features: (N1 N2 N3 ..., C) or (B, N, C)point_features_before_fusion: (N1 N2 N3 ..., C)point_coords: (N1 N2 N3 ..., 4) [bs_idx, x, y, z]point_labels (opti…...

javascript二维数组(10)ajax的使用
在JQuery中,使用AJAX的方法主要有以下几种: $.ajax():这是JQuery中最通用的AJAX请求方法。它需要一个包含各种参数的对象,其中包括请求的URL、请求方式、数据类型、请求参数等。请求成功后执行的回调函数也是通过参数来定义的。 …...

CMMI5认证哪些企业可以申请
CMMI5认证哪些企业可以申请 什么是CMMI5认证 CMMI(Capability Maturity Model Integration)是一种用于评估组织的软件工程能力的国际标准。CMMI模型包括5个等级,其中CMMI5是最高等级,代表组织具有达到持续优化和创新的能力。获得…...

【iptables 实战】9 docker网络原理分析
在开始本章阅读之前,需要提前了解以下的知识 阅读本节需要一些docker的基础知识,最好是在linux上安装好docker环境。提前掌握iptables的基础知识,前文参考【iptables 实战】 一、docker网络模型 docker网络模型如下图所示 说明࿱…...

【多级缓存】
文章目录 1. JVM进程缓存2. Lua语法3. 实现多级缓存3.1 反向代理流程3.2 OpenResty快速入门 4. 查询Tomcat4.1 发送http请求的API4.2 封装http工具4.3 基于ID负载均衡4.4 流程小结 5. Redis缓存查询5.1 实现Redis查询 6. Nginx本地缓存6.1 本地缓存API6.2 实现本地缓存查询 7. …...

第五课 树与图
文章目录 第五课 树与图lc94.二叉树的中序遍历--简单题目描述代码展示 lc589.N叉树的层序遍历--中等题目描述代码展示 lc297.二叉树的序列化和反序列化--困难题目描述代码展示 lc105.从前序与中序遍历序列构造二叉树--中等题目描述代码展示 lc106.从中序与后序遍历序列构造二叉…...

2023-10-07 事业-代号z-副业-CQ私服-调研与分析
摘要: CQ作为一款运营了20年的游戏, 流传出的私服可以说是层出不穷, 到了现在我其实对这款游戏的长线运营的前景很悲观. 但是作为商业的一部分, 对其做谨慎的分析还是很有必要的. 传奇调研的来源: 一. 各种售卖私服的网站 传奇服务端版本库-传奇手游源码「免费下载」传奇GM论…...

合并不同门店数据-上下合并
项目背景:线下超市分店,统计产品的销售数量和销售额,并用透视表计算求和 merge()函数可以根据链接键横向连接两张不同表,concat()函数可以上下合并和左右合并2种不同的合并方式。merge()函数只能横向连接两张表,而con…...

学习记忆——数学篇——案例——算术——整除特点
理解记忆法 对于数的整除特征大家都比较熟悉:比如4看后两位(因为100是4的倍数),8看后三位(因为1000是8的倍数),5末尾是0或5,3与9看各位数字和等等,今天重点研究一下3,9,…...

PHP8中的魔术方法-PHP8知识详解
在PHP 8中,魔术方法是一种特殊的方法,它们以两个下划线(__)开头。魔术方法允许您定义类的行为,例如创建对象、调用其他方法或访问和修改类的属性。以下是一些常见的魔术方法: __construct(): 类的构造函数…...

[图论]哈尔滨工业大学(哈工大 HIT)学习笔记23-31
视频来源:4.1.1 背景_哔哩哔哩_bilibili 目录 1. 哈密顿图 1.1. 背景 1.2. 哈氏图 2. 邻接矩阵/邻接表 3. 关联矩阵 3.1. 定义 4. 带权图 1. 哈密顿图 1.1. 背景 (1)以地球为建模,从一个大城市开始遍历其他大城市并且返回…...

Nginx+Keepalived实现服务高可用
Nginx 和 Keepalived 是常用于构建高可用性(High Availability)架构的工具。Nginx 是一款高性能的Web服务器和反向代理服务器,而Keepalived则提供了对Nginx服务的健康状态监测和故障切换功能。 下载Nginx 在服务器1和服务器2分别下载nginx …...

picodet onnx转其它芯片支持格式时遇到
文章目录 报错信息解决方法两模型精度对比 报错信息 报错信息为: Upsample(resize) Resize_0 not support attribute coordinate_transformation_mode:half_pixel. 解决方法 整个模型转换过程是:paddle 动态模型转成静态,再用paddle2onnx…...

【学习笔记】CF704B Ant Man
智商不够啊,咋想到贪心的😅 非常经典的贪心模型🤔 首先,从小到大将每个 i i i插入到排列中,用 D P DP DP记录还有多少个位置可以插入,可以通过钦定新插入的位置左右两边是否继续插入数来提前计算贡献。注…...

SQLines数据迁移工具
Data and Analytics Platform Migration - SQLines Tools SQLines提供的工具可以帮助您在不同的数据库平台之间传输数据、转换数据库模式(DDL)、视图、存储过程、包、用户定义函数(udf)、触发器、SQL查询和SQL脚本。 SQLines SQL Converter OverviewCommand LineConfigurati…...

pkl文件与打开(使用numpy和pickle)
文章目录 1. 什么是pkl文件2. 如何打开?Reference 1. 什么是pkl文件 1)python中有一种存储方式,可以存储为.pkl文件。 2)该存储方式,可以将python项目过程中用到的一些暂时变量、或者需要提取、暂存的字符串、列表、…...

3d渲染农场全面升级,好用的渲染平台值得了解
什么是渲染农场? 渲染农场是专门从事 3D 渲染的大型机器集合,称为渲染节点,这些机器组合在一起执行一项任务(渲染 3D 帧和动画)。通过将渲染工作分配给数百台机器,可以显着减少渲染时间,从而使…...

1.5 JAVA程序运行的机制
**1.5 Java程序的运行机制** --- **简介:** Java程序的运行涉及两个主要步骤:编译和运行。这种机制确保了Java的跨平台特性。 **主要内容:** 1. **Java程序的执行过程**: - **编译**:首先,扩展名为.jav…...

基于FPGA的拔河游戏设计
基于FPGA的拔河游戏机 设计内容: (1)拔河游戏机需要11个发光二极管排成一行,开机 后只有中间一个亮点,作为拔河的中间线。 游戏双方 各持一个按键,迅速且不断地按动产生脉冲,哪方按 得快,亮点就向哪方移动, 每按一次,亮点移动一次。 移到任一方二极管的终端,该方就…...

关联规则挖掘(下):数据分析 | 数据挖掘 | 十大算法之一
⭐️⭐️⭐️⭐️⭐️欢迎来到我的博客⭐️⭐️⭐️⭐️⭐️ 🐴作者:秋无之地 🐴简介:CSDN爬虫、后端、大数据领域创作者。目前从事python爬虫、后端和大数据等相关工作,主要擅长领域有:爬虫、后端、大数据…...

8、【Qlib】【主要组件】预测模型:模型训练和预测
8、【主要组件】预测模型:模型训练和预测 简介基本类Example简介 预测模型(Forecast Model)旨在对股票做出预测评分。用户可以通过 qrun 在自动化工作流中使用预测模型。 由于 Qlib 中的组件设计成了松耦合方式,预测模型也可以作为一个独立模块使用。 基本类 Qlib 提供了…...

kettle安装
kettle安装 安装java环境 mkdir /data/java ln -s /data/java/ /opt/ cd /opt/javatar zxvf jdk-8u171-linux-x64.tar.gz#java export JAVA_HOME/opt/java/jdk1.8.0_171 export JRE_HOME$JAVA_HOME/jre export CLASSPATH$JAVA_HOME/lib:$JRE_HOME/lib:$CLASSPATH export PATH$J…...