蓝桥杯嵌入式学习笔记(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程序设计,本文我们进行异步的串口通信的程序设计。

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.mzph.cn/news/776670.shtml

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

相关文章

蓝桥杯每日一题(floyd算法)

4074 铁路与公路 如果两个城市之间有铁路t11&#xff0c;公路就会t2>1,没铁路的时候t1>1,公路t21。也就是公路铁路永远都不会相等。我们只需要计算通过公路和铁路从1到n最大的那个即可。 floyd是直接在数组上更新距离。不需要新建dis数组。另外一定要记得把邻接矩阵初始…

【数据结构】链表习题之环形链表的约瑟夫问题

&#x1f451;个人主页&#xff1a;啊Q闻 &#x1f387;收录专栏&#xff1a;《数据结构》 &#x1f389;道阻且长&#xff0c;行则将至 前言 今天这道题目时牛客上的题目&#xff0c;名为环形链表的约瑟夫问题&#xff0c;很有趣的的一道题目 环形链表的约瑟…

vue中实现超出一行 展开和收起的功能

html中: <divclass="txttype"ref="txttype"style="margin-bottom: 6px":class="hidetext == true ? hidetext : "><div style="width: 96%"><el-tagtype="info"style="margin-right: 10px&…

SpringBoot在线电影订票系统实战开发教程及源码之手把手教你做一个在线电影订票系统(带参考论文)

今天发布的是一款基于SpringBoot脚手架开发的在线电影订票系统实战开发教程和完整源码&#xff0c;这里强调一下&#xff1a;本系统基于springboot脚手架开发&#xff0c;如果还没学习脚手架的话先去学习脚手架&#xff0c;不然学不懂这个电影订票系统哦&#xff0c;重要的事说…

2024河北石家庄矿业矿山展览会|河北智慧矿山展会|河北矿博会

2024中国&#xff08;石家庄&#xff09;国际矿业博览会      时间&#xff1a;2024年7月4-6日 地点&#xff1a;石家庄国际会展中心.正定      随着全球经济的持续增长和矿产资源需求的不断攀升&#xff0c;矿业行业正迎来前所未有的发展机遇。作为矿业领域的盛会&…

蓝桥OJ3510 冶炼金属(暴力+二分)

冶炼金属 学习了b站Turing_Sheep的思路 一、暴力模拟 思路&#xff1a; b[i] a[i] / v b[1] a[1] / v b[2] a[2] / v .... b[n] a[n] / v 以上列举中v要满足所有的记录&#xff0c;但凡一个记录不满足&#xff0c;v就不满足题意。 从小到大列举v,设置v最大为1e6 设置一个标…

Codeup_4054:问题 B: DFS or BFS?

目录 Problem DescriptionInputOutputSample InputSample Output原题链接解题思路经验总结代码实现&#xff08;C&#xff09; Problem Description 说好了&#xff0c;题目不黑人。 给你一个8*8的矩阵&#xff0c;你的初始位置是左下角方格&#xff08;用’U’表示&#xff…

如何用Flask中的Blueprints构建大型Web应用

本文分享自华为云社区《构建大型Web应用Flask中的Blueprints指南》&#xff0c;作者&#xff1a; 柠檬味拥抱。 什么是Blueprints&#xff1f; 什么是Blueprints&#xff1f; Blueprints是Flask中的一种模式&#xff0c;用于将应用程序分解为可重用的模块。每个蓝图实际上是…

ADB 安装与操作命令详解及用法大全

目录 ADB定义 ADB安装 Windows系统&#xff1a; macOS系统&#xff1a; Linux系统&#xff1a; ADB常用命令 ADB定义 ADB&#xff08;Android Debug Bridge&#xff09;是一个多功能命令行工具&#xff0c;它允许开发者与连接的Android设备或模拟器进行通信。 ADB提供了…

时序数据库IoTDB:功能详解与行业应用

一文读懂时序数据库 IoTDB。 01 为什么需要时序数据库 解释时序数据库前&#xff0c;先了解一下何谓时序数据。 时序数据&#xff0c;也称为时间序列数据&#xff0c;是指按时间顺序记录的同一统计指标的数据集合。这类数据的来源主要是能源、工程、交通等工业物联网强关联行业…

蓝牙耳机哪个品牌的好?2024年精选硬核机型推荐

​随着时代的进步和潮流的演进&#xff0c;人们对蓝牙耳机的需求已不再局限于音质&#xff0c;舒适度也成为了关键考量。下面&#xff0c;我将为你推荐五款既舒适又性能出色的蓝牙耳机。 一、如何挑选蓝牙耳机&#xff1f;&#xff08;重点码住&#xff09; 1.选择知名大品牌&…

【PostgreSQL】- 1.1 在 Debian 12 上安装 PostgreSQL 15

官方说明参考 &#xff08;原文 PostgreSQL&#xff1a;Linux 下载 &#xff08;Debian&#xff09;&#xff09; 默认情况下&#xff0c;PostgreSQL 在所有 Debian 版本中都可用。但是&#xff0c; Debians 的稳定版本“快照”了特定版本的 PostgreSQL 然后在该 Debian 版本的…

1.4.1 着色器

着色器&#xff08;Shader&#xff09;是运行在GPU上的小程序&#xff0c;这些小程序为图形渲染管线的某个特定部分而运行&#xff0c;从基本意义上来说&#xff0c;着色器只是一种把输入转化为输出的程序。 一、着色器类QOpenGLShaderProgram QOpenGLShaderProgram是Qt中对着…

关于vite+vue3引入tailwind框架的正确方式

首先可以明确的知道,只按照官网的配置是会导致样式不加载或者加载不生效等问题的。 正确的处理方案 1.首先按照官网的指示安装 npm install -D tailwindcss postcss autoprefixer npx tailwindcss init2.然后项目根目录创建postcss.config.js文件 module.exports {plugins: …

如何部署cobbler批量安装的服务端

cobbler批量安装 cobbler简介 Cobbler是一个Linux服务器安装的服务&#xff0c;可以通过网络启动(PXE)的方式来快速安装、重装物理服务器和虚拟机&#xff0c;同时还可以管理DHCP&#xff0c;DNS等。 Cobbler可以使用命令行方式管理&#xff0c;也提供了基于Web的界面管理工…

C++ 迭代器与反向迭代器

目录 一&#xff0c;什么是迭代器 1&#xff0c;定义 2&#xff0c;迭代器的设计思维 3&#xff0c;迭代器种类 二&#xff0c;迭代器与容器 1&#xff0c;容器中的迭代器 2&#xff0c;迭代器失效问题 三&#xff0c;迭代器的类型萃取&#xff08;traits&#xff09; …

Python函数、参数变量详细介绍

Python函数概述 在Python中&#xff0c;函数是组织好的、可重复使用的代码块&#xff0c;用于实现单一或相关联功能。函数能提高应用的模块性和代码的重复利用率。除了内建函数外&#xff0c;Python还支持用户自定义函数。 定义函数 自定义函数使用 def 关键字开始定义。函数…

sdwan本地组网分析

随着数字化转型的深入发展&#xff0c;企业对网络架构的要求也不断提高。SDWAN&#xff08;软件定义广域网&#xff09;作为一种创新的网络技术&#xff0c;正在逐渐受到企业的关注和采用。SDWAN本地组网技术可以帮助企业快速搭建高效稳定的企业网络架构&#xff0c;提升企业的…

Android kotlin全局悬浮窗全屏功能和锁屏页面全屏悬浮窗功能一

1.前言 在进行app应用开发中,在实现某些功能中要求实现悬浮窗功能,分为应用内悬浮窗 ,全局悬浮窗和 锁屏页面悬浮窗功能 等,接下来就来实现这些悬浮窗全屏功能,首选看下第一部分功能实现 2.kotlin全局悬浮窗全屏功能和锁屏页面全屏悬浮窗功能一分析 悬浮窗是属于Androi…

API接口开发lazada获得lazada商品详情API采集商品详情页实时数据、实时销量、库存等参数接入演示

要获取Lazada商品详情页的实时数据、实时销量和库存等参数&#xff0c;你需要使用Lazada的API接口。以下是一个简单的Python示例&#xff0c;展示了如何使用requests库调用Lazada API并解析返回的数据&#xff1a; # coding:utf-8 """ Compatible for python2.…