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

news/2024/5/9 6:20:09/文章来源:https://blog.csdn.net/weixin_42937740/article/details/137086861

目录

前言

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程序设计,本文我们进行异步的串口通信的程序设计。

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.luyixian.cn/news_show_1026274.aspx

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

相关文章

FASTAPI系列 16-其他响应类型

FASTAPI系列 16-其他响应类型 文章目录 FASTAPI系列 16-其他响应类型前言一、HTMLResponse 响应 HTML二、纯文本响应三、另外的JSON 响应四、FileResponse文件五、StreamingResponse六、RedirectResponse 重定向请求总结更多内容&#xff0c;请关注公众号, 发送666 更可以得到免…

面试算法-92-不同的二叉搜索树 II

题目 给你一个整数 n &#xff0c;请你生成并返回所有由 n 个节点组成且节点值从 1 到 n 互不相同的不同 二叉搜索树 。可以按 任意顺序 返回答案。 示例 1&#xff1a; 输入&#xff1a;n 3 输出&#xff1a;[[1,null,2,null,3],[1,null,3,2],[2,1,3],[3,1,null,null,2],…

移动硬盘盒结合PD技术为电脑供电:一种便携高效的供电新方案

在数字化时代&#xff0c;电脑已经成为我们生活和工作中不可或缺的工具。而在电脑的使用过程中&#xff0c;供电问题一直是我们需要关注的重要方面。近年来&#xff0c;随着技术的不断进步&#xff0c;移动硬盘盒子与PD&#xff08;Power Delivery&#xff09;技术的结合&#…

pnpm :无法加载文件 D:\nodejs\node_global\pnpm.ps1,因为在此系统上禁止运行脚本

一、问题描述 pnpm : 无法加载文件 D:\zyt\work\soft\node\node_global\pnpm.ps1&#xff0c;因为在此系统上禁止运行脚本。有关详细信息&#xff0c;请参阅 https:/go.microsoft.com/fwlink/?LinkID135170 中的 about_Execution_Policies。 所在位置 行:1 字符: 1pnpm --ver…

UOS、Linux下的redis的详细部署流程(适用于内网)

提示&#xff1a;适用于Linux以及UOS等内外网系统服务器部署。 文章目录 一.上传离线包二.部署基本环境三.解压并安装redis四.后台运行redis五.uos系统可能遇到的问题六.总结 一.上传离线包 1.自己去Redis官网下载适配自己部署系统的redis安装包。 2.通过文件传输工具&#xf…

『Apisix进阶篇』动态负载均衡:APISIX的实战演练与策略应用

&#x1f680;『Apisix系列文章』探索新一代微服务体系下的API管理新范式与最佳实践 【点击此跳转】 &#x1f4e3;读完这篇文章里你能收获到 &#x1f3af; 掌握APISIX中多种负载均衡策略的原理及其适用场景。&#x1f4c8; 学习如何通过APISIX的Admin API和Dashboard进行负…

Redis - list 列表

前言 列表类似于 Java 中的数组或者顺序表&#xff0c;在 Redis 中&#xff0c;可以对列表两端插⼊&#xff08;push&#xff09;和弹出&#xff08;pop&#xff09;&#xff0c;还可以获取指定范围的元素列表、 获取指定索引下标的元素等。列表是⼀种⽐较灵活的数据结构&#…

16、OpenFeign和Sentinel集成实现fallback服务降级

注&#xff1a;本篇文章主要参考周阳老师讲解的cloud进行整理的&#xff01; 1、需求说明 cloudalibaba-consumer-nacos-order83 通过OpenFeign调用 cloudalibaba-provider-payment9001 1、 83 通过OpenFeign调用 9001微服务&#xff0c;正常访问OK 2、 83 通过OpenFeign调用 …

【Redis教程0x01】入门:Windows下安装和启动Redis

什么是Redis&#xff1f; Redis 是互联网技术领域中使用最广泛的存储中间件&#xff0c;它是 Remote Dictionary Service 三个单词中加粗字母的组合。 Redis 以超高的性能、完美的文档、简洁的源码著称&#xff0c;国内外很多大型互联网公司都在用。它的版本更新非常的快&…

腾讯云2核2G服务器CVM S5和轻量应用服务器优惠价格

腾讯云2核2G服务器多少钱一年&#xff1f;轻量服务器61元一年&#xff0c;CVM 2核2G S5服务器313.2元15个月&#xff0c;腾讯云2核2G服务器优惠活动 txyfwq.com/go/txy 链接打开如下图&#xff1a; 腾讯云2核2G服务器价格 轻量61元一年&#xff1a;轻量2核2G3M、3M带宽、200GB月…

力扣-20 有效的括号详解 Java

目录 1.题目分析 2.基础知识储备 2.1 哈希表 2.2 栈的存取 3. 逻辑概要 4.源码 示例 1.题目分析 为了对比都是从内而外&#xff0c;一个个匹配&#xff0c;全部匹配成功即为有效字符 2.基础知识储备 2.1 哈希表 简单来说&#xff0c;keyvalue存储 &#xff0c;通过key…

Go打造REST Server【二】:用路由的三方库来实现

前言 在之前的文章中&#xff0c;我们用Go的标准库来实现了服务器&#xff0c;JSON渲染重构为辅助函数&#xff0c;使特定的路由处理程序相当简洁。 我们剩下的问题是路径路由逻辑&#xff0c;这是所有编写无依赖HTTP服务器的人都会遇到的问题&#xff0c;除非服务器只处理一到…

基于Google云原生工程师的kubernetes最佳实践(三)

目录 三、集群管理 利用node affinity、taint等机制管理node 通过pod affinity/anti-affinity机制将pod分配到合适的node Node分级管理 从Qos角度将Pod分级 用namespace隔离不同的环境和用户 配置RBAC权限控制 1. 遵循最小权限原则 2. 使用 Role 和 ClusterRole 分离权…

Nuxt3(项目创建)

1.官方文档 Installation Get Started with Nuxt 2.版本要求 node版本>18.0&#xff0c;建议使用偶数版本 3.安装 可采用npx或pnpm&#xff0c;本人使用的pnpm进行安装&#xff0c;如果提示npx没有安装的话使用npm install -g npx安装即可。 // 安装npx npm install…

Python爬虫学习完整版

一、什么是爬虫 网络爬虫&#xff0c;是一种按照一定规则&#xff0c;自动抓取互联网信息的程序或者脚本。由于互联网数据的多样性和资源的有限性&#xff0c;根据用户需求定向抓取相关网页并分析也成为如今主流的爬取策略。 1 爬虫可以做什么 你可以爬取网络上的的图片&#…

全国超市数据可视化仪表板制作

全国超市消费数据展示 指定 Top几 客户销费数据展示 指定 Top几 省份销费数据展示 省份销售额数据分析 完整结果

FFmpeg拉取RTSP流并定时生成10秒短视频

生成效果: 视频时长为10秒 生成格式为FLV 输出日志: 完整实现代码如下: 需要在Mac和终端先安装FFmpeg brew install ffmpeg CMake文件配置: cmake_minimum_required(VERSION 3.27) project(ffmpeg_open_stream) set(CMAKE_CXX_STANDARD 17)#头文件包目录 include_director…

IDEA 2023右下角无git分支显示解决

当你排除项目问题之后&#xff0c;可能就是idea配置问题了&#xff0c;需要在View -> Appearance -> Status Bar Widgets 中 把 git Branch 勾上。

6.windows ubuntu 子系统 测序数据质量控制。

上一个分享&#xff0c;我们对测序数据进行了质量评估&#xff0c;接下来我们需要对数据进行数据质量控制。 数据预处理&#xff08;Data Preprocessing&#xff09;&#xff1a;包括去除接头序列&#xff08;adapter trimming&#xff09;、去除低质量序列&#xff08;qualit…

jdk8中的Arrays.sort

jdk8中Arrays.sort 这里可以看到根据传入数组类型的不同&#xff0c;排序的算法是由区别的。 拆分解析 我们在平时引用的时候&#xff0c;一般只会传入一个数组&#xff0c;但是真正调用的时候&#xff0c;参数会进行补全。 public static void sort(int[] a) {DualPivotQui…