蓝桥杯嵌入式学习笔记(6):IIC程序设计

目录

前言

1. IIC基本原理

2. 电路原理

3. 代码编程

3.1 预备工作

3.2 AT24C02写读功能编写

3.2.1 AT24C02写操作实现

3.2.2 AT24C02读操作实现

3.3 MCP4017写读功能编写

3.3.1 MCP4017写操作实现

3.3.2 MCP4017读操作实现

3.4 main.c编写

3.4.1 头文件引用

3.4.2 变量声明

3.4.3 液晶屏显示代码

3.4.4 编写主要main函数部分

4. 测试

5. 总结


前言

因本人备赛蓝桥杯嵌入式省赛,故编写此学习笔记进行学习上的记录。

上文我们实现了UART程序设计,本文我们进行IIC程序设计。

1. IIC基本原理

I2C(IIC,Inter-Intergrated Circuit),两线式串行总线,由PHILIPS公司开发用于连接微控制器及其外围设备。

它是由数据线SDA和时钟SCL构成的串行总线,可发送和接收数据。在CPU与被控IC之间、IC与IC之间进行双向传送,高速IIC总线一般可达400kbps以上。

IIC是半双工通信方式。

IIC总线是不同IC或模块之间的双向两线通信,这两条是串行数据线(SDA)和串行时钟线(SCL)。这两条线必须通过上拉电路连接至电源。数据传输只能在总线不忙时启动。

2. 电路原理

蓝桥杯嵌入式主要考察利用IIC原理去读取24C02存储器和MCP4017可编程电阻的读写,并已给出参考历程。

下图所示为MCP4017可编程电阻的内部示意图,A点悬空,如上图所示W和B分别接了VDD和GND,所以MCP4017可编程电阻的实际电阻值就是W与B之间的阻值。

如下图所示,其中编程电阻其实就是改变N。

Rwb的实际计算方式如下图所示,其中翻阅手册得知Rab为100k

不考虑Rw的影响,每一个编程电阻分量值(N属于1~127)为0.7874k,由竞赛板的电路图可以计算出Vwb的电压为\frac{3.3*0.78740*N}{0.78740*N+10}V。

3. 代码编程

3.1 预备工作

将竞赛公开包中的i2c_hal.c和i2c_hal.h文件分别拷贝到Test\Test_Project\Src\BSP\I2C\和Test\Test_Project\Inc\BSP\I2C\中,并更名为bsp_i2c.c和bsp_i2c.h(可以不改,为了规范😄)。打开Test_Project工程,进行文件Group的添加

更改bsp_i2c.c的依赖头文件

#include "I2C/bsp_i2c.h" 

注意,这里需要修改bsp_i2c.c中的unsigned char I2CWaitAck(void)函数内容,将SDA_Output_Mode()挪到delay1(DELAY_TIME)后。修改后的结果如下:

unsigned char I2CWaitAck(void)
{unsigned short cErrTime = 5;SDA_Input_Mode();delay1(DELAY_TIME);SCL_Output(1);delay1(DELAY_TIME);while(SDA_Input()){cErrTime--;delay1(DELAY_TIME);if (0 == cErrTime){SDA_Output_Mode();I2CStop();return ERROR;}}SCL_Output(0);delay1(DELAY_TIME);SDA_Output_Mode();//本行代码改到delay1(DELAY_TIME)之后return SUCCESS;
}

接下来进行24C02存储器和MCP4017可编程电阻的函数的编写。

3.2 AT24C02写读功能编写

3.2.1 AT24C02写操作实现

1KB/2KB EEPROM能进行8字节页面写入,4KB、8KB和16KB设备能进行16字节写入。激发写页面写操作时序图如下

写页面时序 

AT24C02的芯片地址为1010(二进制),十进制为A,(W=0,R=1)

所以写的器件地址为0xA0

根据时序图编写AT24C02存储器的写操作

//AT24C02的写
void iic_24c02_write(unsigned char *pucBuf, unsigned char ucAddr, unsigned char ucNum)
{I2CStart();I2CSendByte(0xa0);I2CWaitAck();I2CSendByte(ucAddr);I2CWaitAck();while(ucNum--){I2CSendByte(*pucBuf++);I2CWaitAck();}I2CStop();delay1(500);
}

3.2.2 AT24C02读操作实现

随机地址读取时序如图所示。随机读取需要一个空字节写序列来载入数据地址。

顺序读取时序如图所示。顺序读取由立即地址读取或随机地址读取激发。

根据时序图编写AT24C02存储器的读操作

//AT24C02的读
void iic_24c02_read(unsigned char *pucBuf, unsigned char ucAddr, unsigned char ucNum)
{I2CStart();I2CSendByte(0xa0);I2CWaitAck();I2CSendByte(ucAddr);I2CWaitAck();I2CStart();I2CSendByte(0xa1);I2CWaitAck();while(ucNum--){*pucBuf++ = I2CReceiveByte();if(ucNum)I2CSendAck();elseI2CSendNotAck();}I2CStop();
}

3.3 MCP4017写读功能编写

3.3.1 MCP4017写操作实现

根据读时序,编写写电阻操作代码 

//MCP4017写电阻
void write_registor(uint8_t value)
{I2CStart();I2CSendByte(0x5E);I2CWaitAck();I2CSendByte(value);I2CWaitAck();I2CStop();
}

3.3.2 MCP4017读操作实现

 根据读时序,编写读电阻操作代码 

//MCP4017写读电阻
uint8_t read_registor(void)
{uint8_t value;I2CStart();I2CSendByte(0x5F);I2CWaitAck();value = I2CReceiveByte();I2CSendNotAck();I2CStop();return value;
}

3.4 main.c编写

3.4.1 头文件引用

/* Includes ------------------------------------------------------------------*/
#include "main.h"
#include "LCD\bsp_lcd.h"
#include "I2C\bsp_i2c.h"

3.4.2 变量声明

//变量声明
__IO uint32_t uwTick_Lcd_Set_Point;//LCD减速//*LCD显示专用变量
unsigned char Lcd_Disp_String[22];//EEPROM的相关变量
unsigned char EEPROM_String_1[5] = {0x11,0x22,0x33,0x44,0x55};
unsigned char EEPROM_String_2[5] = {0};
//R4017
uint8_t R4017;

3.4.3 液晶屏显示代码

void Lcd_Proc(void)
{if((uwTick - uwTick_Lcd_Set_Point)<200)return;uwTick_Lcd_Set_Point = uwTick;sprintf((char*)Lcd_Disp_String,"EE:%x,%x,%x,%x,%x",EEPROM_String_2[0],EEPROM_String_2[1],EEPROM_String_2[2],EEPROM_String_2[3],EEPROM_String_2[4]);LCD_DisplayStringLine(Line2,Lcd_Disp_String);sprintf((char*)Lcd_Disp_String,"R:%5.2fKQ",0.7874*R4017);LCD_DisplayStringLine(Line3,Lcd_Disp_String);sprintf((char*)Lcd_Disp_String,"Voltage:%6.3fV",3.3*0.7874*R4017/(0.7874*R4017+10));LCD_DisplayStringLine(Line4,Lcd_Disp_String);
}

3.4.4 编写主要main函数部分

int main(void)
{HAL_Init();SystemClock_Config();LCD_Init();LCD_Clear(White);LCD_SetBackColor(White);LCD_SetTextColor(Blue);I2CInit();//读写M24C02存储器iic_24c02_write(EEPROM_String_1,0,5);HAL_Delay(1);iic_24c02_read(EEPROM_String_2,0,5);//读写MCP4017write_registor(0x0D);HAL_Delay(1);R4017 = read_registor();while (1){Lcd_Proc();}
}

4. 测试

如果测试成功,则屏幕上会显示写入EEPROM1的数据,R电阻和电压值

由图可以看到,代码测试成功。

5. 总结

本文进行IIC的介绍,并利用IIC原理去实现了读取24C02存储器和MCP4017可编程电阻的读写,通过代码测试成功实现了存储器和可编程电阻的读写功能。

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

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

相关文章

Spring实战:采用Spring配置文件管理Bean

文章目录 一、Spring框架概述二、实战&#xff1a;采用Spring配置文件管理Bean&#xff08;一&#xff09;创建Jakarta EE项目&#xff08;二&#xff09;添加Spring依赖&#xff08;三&#xff09;创建杀龙任务类&#xff08;四&#xff09;创建勇敢骑士类&#xff08;五&…

Chrome浏览器隐藏的截图功能配置及使用

来自实用又方便&#xff0c;轻松打开Chrome浏览器隐藏的截图功能&#xff01;​​​​​​​ 一、通过谷歌Chrome浏览器 现在直接通过谷歌Chrome浏览器内置功能&#xff0c;免安装扩充插件也可以实现Chrome的截图和长截图功能了&#xff01; 也不需要额外安装任何截图工具 &a…

数据链路层之信道:数字通信的桥梁与守护者

✨✨ 欢迎大家来访Srlua的博文&#xff08;づ&#xffe3;3&#xffe3;&#xff09;づ╭❤&#xff5e;✨✨ &#x1f31f;&#x1f31f; 欢迎各位亲爱的读者&#xff0c;感谢你们抽出宝贵的时间来阅读我的文章。 我是Srlua小谢&#xff0c;在这里我会分享我的知识和经验。&am…

Adaboost集成学习 | Matlab实现基于ELM-Adaboost极限学习机结合Adaboost集成学习时间序列预测(股票价格预测)

目录 效果一览基本介绍模型设计程序设计参考资料效果一览 基本介绍 基于ELM-Adaboost极限学习机结合Adaboost集成学习时间序列预测(股票价格预测) 单变量时间序列单步预测。 ELM(Extreme Learning Machine,极限学习机)和AdaBoost(Adaptive Boosting,自适应提升)都是机…

基于 FFmpeg 和 SDL 的音视频同步播放器

基于 FFmpeg 和 SDL 的音视频同步播放器 基于 FFmpeg 和 SDL 的音视频同步播放器前置知识音视频同步简介复习DTS、PTS和时间基 程序框架主线程解复用线程音频解码播放线程视频解码播放线程 音视频同步逻辑源程序结果工程文件下载参考链接 基于 FFmpeg 和 SDL 的音视频同步播放器…

【Java 多线程】从源码出发,剖析Threadlocal的数据结构

文章目录 exampleset(T value)createMap(t, value);set(ThreadLocal<?> key, Object value)ThreadLocalMap和Thread的关系 全貌 ThreadLocal是个很重要的多线程类&#xff0c;里面数据结构的设计很有意思&#xff0c;很巧妙。但是我们平时使用它的时候常常容易对它的使用…

24年大一训练一(东北林业大学)

前言&#xff1a; 周五晚上的训练赛&#xff0c;以后应该每两周都会有一次。 正文&#xff1a; Problem:A矩阵翻转&#xff1a; #include<bits/stdc.h> using namespace std; int a[55][55]; int main(){int n,m;while(cin>>n>>m){for(int i1;i<n;i){for…

2024.3.30学习笔记

今日学习韩顺平java0200_韩顺平Java_对象机制练习_哔哩哔哩_bilibili 今日学习p295-p314 super关键字 super代表父类的引用&#xff0c;用于访问父类的属性、方法、构造器 super细节和语法 访问父类的属性&#xff0c;但不能访问父类的private属性 super.属性名 访问父类的…

CubeIDE 下如何将版本号和日期关联。

1. 使用__DATE__ 和__TIME__获取编译日期和时间。 2. 将__DATE__ 和__TIME__转换成UINT 3. 将转换后的数赋值给版本号。 4. 设置工程保证每次都会重新编译对应文件。 对应函数如下&#xff1a; uint8_t VER_MAIN; uint8_t VER_SUB; uint8_t VER_MIN; #include <stdlib.…

蓝桥杯刷题第四天

思路&#xff1a; 这道题很容易即可发现就是简单的暴力即可完成题目&#xff0c;我们只需满足所有数的和为偶数即可保证有满足条件的分法&#xff0c;同时也不需要存下每个输入的数据&#xff0c;只需要知道他是偶数还是奇数即可&#xff0c;因为我们只需要偶数个奇数搭配在一块…

使用通用内部函数对代码进行矢量化

返回&#xff1a;OpenCV系列文章目录&#xff08;持续更新中......&#xff09; 上一篇&#xff1a;OpenCV 如何使用 XML 和 YAML 文件的文件输入和输出 下一篇&#xff1a;OpenCV系列文章目录&#xff08;持续更新中......&#xff09; ​ 目标 本教程的目标是提供使用通用内…

[flask]请求全局钩子

flask从入门到精通之钩子、异常、context、jinjia模板、过滤器 - 异步非阻塞 - 博客园 (cnblogs.com) 参考的这个博客&#xff0c;但有一个需要注意的是&#xff0c;最新版本的flask不知道是不是更新了还是怎么了&#xff0c;他的before_first_request不见了&#xff0c;如果继…

《极客时间TonyBai go语言第一课》学习笔记

文章目录 前置篇显式组合 大纲 前置篇 显式 在 C 语言中&#xff0c;下面这段代码可以正常编译并输出正确结果&#xff1a; #include <stdio.h> int main() { short int a 5; int b 8; long c 0; c a b; printf("%ld\n", c); }我们看到在上面这段代码中…

【git】git使用手册

目录 一 初始化 1.1 账号配置 1.2 ssh生成 1.2.1 配置ssh 1.2.2 测试SSH 1.3 初始化本地仓库并关联远程仓库 二 使用 2.1 上传 2.2 拉取 三 问题 3.1 关联失败 一 初始化 git的安装很简单,下载后大部分进行下一步完成即可----->地址: git工具下载 1.1 账号配置…

UE4_碰撞_自定义碰撞检测通道

效果如图&#xff1a; 1、项目设置中新建追踪检测通道weapon&#xff0c;默认值为忽略。 2、新建几个actor作为枪&#xff0c;碰撞预设全部设为自定义&#xff0c;把新建的检测响应weapon设为阻挡。 3、角色进行射线检测 运行效果如下&#xff1a; 发现有些物体碰不到&#xff…

算法系列--动态规划--背包问题(4)--完全背包拓展题目

&#x1f495;"这种低水平质量的攻击根本就不值得我躲&#xff01;"&#x1f495; 作者&#xff1a;Lvzi 文章主要内容&#xff1a;算法系列–动态规划–背包问题(4)–完全背包拓展题目 大家好,今天为大家带来的是算法系列--动态规划--背包问题(4)--完全背包拓展题目…

Linux 常见性能分析方法论介绍(业务负载画像、下钻分析、USE方法论,检查清单)

写在前面 博文内容为 《BPF Performance Tools》 读书笔记整理内容涉及常用的性能调优方法论介绍&#xff1a;业务负载画像下钻分析USE方法论检查清单理解不足小伙伴帮忙指正 不必太纠结于当下&#xff0c;也不必太忧虑未来&#xff0c;当你经历过一些事情的时候&#xff0c;眼…

时序预测 | Matlab实现OOA-BP鱼鹰算法优化BP神经网络时间序列预测

时序预测 | Matlab实现OOA-BP鱼鹰算法优化BP神经网络时间序列预测 目录 时序预测 | Matlab实现OOA-BP鱼鹰算法优化BP神经网络时间序列预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 1.Matlab实现OOA-BP鱼鹰算法优化BP神经网络时间序列预测&#xff08;完整源码和数据…

Github profile Readme实现小游戏[github自述游戏]

Github profile Readme常用于个人主页介绍&#xff0c;将它与action自动化流程结合&#xff0c;可以实现一些小游戏 例如&#xff1a;2048、五子棋 2048实现 losehu (RUBO) GitHub 五子棋 https://github.com/losehu/losehu/tree/main 通过python/C编写可执行文件&#xf…

相机标定学习记录

相机标定是计算机视觉和机器视觉领域中的一项基本技术&#xff0c;它的主要目的是通过获取相机的内部参数&#xff08;内参&#xff09;和外部参数&#xff08;外参&#xff09;&#xff0c;以及镜头畸变参数&#xff0c;建立起现实世界中的点与相机成像平面上对应像素点之间准…