【蓝桥杯嵌入式】【HAL库】七、AT24C02数据的存储——i2c验证

【蓝桥杯嵌入式】【HAL库】七、AT24C02数据的存储——i2c验证,第1张

【蓝桥杯嵌入式】【HAL库】七、AT24C02数据的存储——i2c验证 原理图分析


由原理图可知,SCL,SDA对应PB6,PB7。此方法为软件模拟iic *** 作,本次实验将实现对AT24C02指定地址进行数据的存储和读取,并将数据用lcd显示。此工程直接使用的官方例程提供的iic文件,关于iIc,AT24C02的原理在这里不再叙述。

STM32CubeMX配置

时钟,时钟树配置不再叙述。
其实本次实验直接生成工程即可,不需要配置GPIO,因为在iic文件里有配置相关引脚的函数,不过我们在这配置也没关系,模式什么的不用管,想了解的同学可以去查看i2c.c文件的start函数。

生成工程即可。

代码

我们需要添加用户代码,本次工程涉及lcd,iic两个文件夹:
链接:https://pan.baidu.com/s/1XBkoEnNFpfE1Y-dUVCRW5Q
提取码:6666

将user文件夹放在工程目录下,并且在工程里添加路径。(往节都有介绍)
main.h添加的头文件:


#include "lcd.h"
#include "i2c.h"
#include "stdio.h"

main.c定义变量:


uint8_t val = 0;  // 存入数据的初始值
char buf[20];     // 用来显示一行lcd的字符串

AT24C02的读,写代码:


// AT24C02读取指定地址数据
uint8_t AT24C02_Read(uint8_t address)
{
	unsigned char val;
	
	I2CStart(); 
	I2CSendByte(0xa0);
	I2CWaitAck(); 
	
	I2CSendByte(address);
	I2CWaitAck(); 
	
	I2CStart();
	I2CSendByte(0xa1); 
	I2CWaitAck();
	val = I2CReceiveByte(); 
	I2CWaitAck();
	I2CStop();
	
	return(val);
}
// AT24C02在指定地址写数据
void AT24C02_Write(unsigned char address,unsigned char data)
{
	I2CStart(); 
	I2CSendByte(0xa0); 
	I2CWaitAck(); 
	
	I2CSendByte(address);	
	I2CWaitAck(); 
	I2CSendByte(data); 
	I2CWaitAck(); 
	I2CStop();
}

main函数里的代码:

  
	I2CInit();  			// -----------
	LCD_Init();
							//i2c和lcd的初始化——白底清屏,红色字体
	LCD_Clear(White);
	LCD_SetBackColor(White);
	LCD_SetTextColor(Red);  // -----------
	
	AT24C02_Write(0, val);  // 先向指定地址写入初始数据
	HAL_Delay(100);         // 写入需要一定的时间,本人测试的延迟1ms也是可以的
  

  
  
  while (1)
  {
    
	  val = AT24C02_Read(0); // 从指定地址读取数据
	  sprintf(buf, "   AT24C02_data:%d   ", val); // 将val值放入buf字符串中
	  LCD_DisplayStringLine(Line4, (uint8_t *)(buf)); // 在第四行显示buf的内容
	  val++; 
	  AT24C02_Write(0, val); // 将自身加一后的val值写入指定地址
	  HAL_Delay(1000);
    
  }
  
运行结果

每一秒加一,当超过255时,即溢出,将重新归零。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zaji/5710470.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-18
下一篇 2022-12-17

发表评论

登录后才能评论

评论列表(0条)

保存