草庐IT

蓝桥杯单片机 | 特训案例【进阶03】24C02的基本读写操作

小蜜蜂老师 2023-04-20 原文

【1】题目要求

新建工程,以I/O模式编写代码,在CT107D单片机综合训练平台上,实现以下功能:

1、将IIC总线的底层驱动代码文件正确移植到工程中。

2、系统上电后,从24C04存储器0x010x030x05这三个地址单元读取数据。

3、将0x01单元读出的数据进行加1操作,如果计算结果大于10,复位为0,然后将这个结果写回0x01单元。

4、将0x03单元读出的数据进行加2操作,如果计算结果大于20,复位为0,然后将这个结果写回0x03单元。

5、将0x05单元读出的数据进行加3操作,如果计算结果大于30,复位为0,然后将这个结果写回0x05单元。

6、将三个单元的当前数据从左到右依次显示在数码管上,各个数字之间用“-”分隔。

【小提示】:

IIC接口的基本原理,可见本博客:《【蓝桥杯单片机进阶强化-01】IIC总线接口技术基础》

24C02的基本原理,可见本博客:《【蓝桥杯单片机进阶强化-03】24C02存储器的基本原理与应用》

【2】核心源码参考

/*==================蓝桥杯单片机特训==================
【进阶03】:24C02的基本读写操作
**平  台:CT107D单片机综合实训平台
**模  式:IO模式
**底层驱动文件:2022年竞赛资源数据包提供的文件
**设  计:欧浩源(小蜜蜂老师,ohy3686@qq.com)
**时  间:2022-04-01
**更多详见:www.xmf393.com
====================================================*/

#include "reg52.h"
#include "iic.h"

//定义动态显示中单个数码管点亮时长
#define TSMG	500
//-------共阳数码管的段码编码表(无小数点)--------
//0 1 2 3 4 5 6 7 8 9 A B C D E F - .
unsigned char code SMG_NoDot[18]={0xc0,0xf9,
	  0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,
    0x88,0x80,0xc6,0xc0,0x86,0x8e,0xbf,0x7f};

//定义3个计数变量
unsigned char dat1 = 0, dat2 = 0, dat3 = 0;

/*====锁存器设置和数码管显示的代码参考前面的案例====*/
//===================读取值显示函数===================
void DisplaySMG_24C02()
{
	//数码管右起第0位
	DisplaySMG_Bit(7,SMG_NoDot[dat3	% 10]);
	//数码管右起第1位
	DisplaySMG_Bit(6,SMG_NoDot[dat3 / 10]);		
	//数码管右起第2位
	DisplaySMG_Bit(5,SMG_NoDot[16]);				
	
	//数码管右起第3位
	DisplaySMG_Bit(4,SMG_NoDot[dat2	% 10]);
	//数码管右起第4位
	DisplaySMG_Bit(3,SMG_NoDot[dat2 / 10]);		
	//数码管右起第5位
	DisplaySMG_Bit(2,SMG_NoDot[16]);				
	
	//数码管右起第6位
	DisplaySMG_Bit(1,SMG_NoDot[dat1 % 10]);				
	//数码管右起第7位
	DisplaySMG_Bit(0,SMG_NoDot[dat1 / 10]);				
}
//================24C02单字节写入=================
void Write_24C02(unsigned char addr, unsigned char dat)
{
	IIC_Start();			//起始信号
	IIC_SendByte(0xa0);		//EEPROM的写设备地址
	IIC_WaitAck();		    //等待从机应答
	IIC_SendByte(addr);		//内存单元地址
	IIC_WaitAck();			//等待从机应答
	IIC_SendByte(dat);		//内存写入数据
	IIC_WaitAck();			//等待从机应答
	IIC_Stop();				//停止信号
}
//================24C02单字节读取=================
unsigned char Read_24C02(unsigned char addr)
{
	unsigned char tmp;
	//首先,进行一个伪写操作
	IIC_Start();			//起始信号
	IIC_SendByte(0xa0);		//EEPROM的写设备地址
	IIC_WaitAck();			//等待从机应答
	IIC_SendByte(addr);		//内存单元地址
	IIC_WaitAck();			//等待从机应答
	//然后,开始字节读操作
	IIC_Start();			//起始信号
	IIC_SendByte(0xa1);		//EEPROM的读设备地址
	IIC_WaitAck();			//等待从机应答
	tmp = IIC_RecByte();	//读取内存中的数据
	IIC_SendAck(1);			//产生非应答信号
	IIC_Stop();				//停止信号
	return tmp;
}
//==============24C02数据读取与写入===============
void Read_Write_24C02()
{
	dat1 = Read_24C02(0x01);	//从24C02读取dat1
	dat2 = Read_24C02(0x03);	//从24C02读取dat2
	dat3 = Read_24C02(0x05);	//从24C02读取dat3
	
	dat1 = dat1 + 1;			//第1个计数变量+1
	dat2 = dat2 + 2;			//第2个计数变量+2
	dat3 = dat3 + 3;			//第3个计数变量+3
	if(dat1 > 10)
		dat1 = 0;
	if(dat2 > 20)
		dat2 = 0;
	if(dat3 > 30)
		dat3 = 0;
	
	Write_24C02(0x01, dat1);
	DelaySMG(1000);				//等待字节写入完成
	Write_24C02(0x03, dat2);
	DelaySMG(1000);				//等待时间不够会影响dat3写入
	Write_24C02(0x05, dat3);
	DelaySMG(1000);
}

//===================系统初始化===================
void Init_sys()
{
	Set_HC573(0, 0x00);			//关闭所有锁存器
	Set_HC573(5, 0x00);			//关闭蜂鸣器和继电器
	Set_HC573(4, 0xff);			//关闭全部LED灯
	DisplaySMG_All(0xff);		//关闭全部数码管
}
//=======================主函数=======================
void main()
{
	Init_sys();					//系统初始化
	Read_Write_24C02();			//读写24C02的三个单元的数据
	while(1)
	{
		DisplaySMG_24C02();		//循环动态刷新数码管
	}
}

【注】:更多关于蓝桥杯单片机备赛内容,详见《蓝桥杯单片机设计与开发》小蜜蜂特训手册,本站可下载,相关更多蓝桥杯的案例完整源码及学习备赛笔记,欢迎进入“小蜜蜂笔记”公众号。

有关蓝桥杯单片机 | 特训案例【进阶03】24C02的基本读写操作的更多相关文章

  1. postman——集合——执行集合——测试脚本——pm对象简单示例02 - 2

    //1.验证返回状态码是否是200pm.test("Statuscodeis200",function(){pm.response.to.have.status(200);});//2.验证返回body内是否含有某个值pm.test("Bodymatchesstring",function(){pm.expect(pm.response.text()).to.include("string_you_want_to_search");});//3.验证某个返回值是否是100pm.test("Yourtestname",function(){varjsonData=pm.response.json

  2. C51单片机——实现用独立按键控制LED亮灭(调用函数篇) - 2

    说在前面这部分我本来是合为一篇来写的,因为目的是一样的,都是通过独立按键来控制LED闪灭本质上是起到开关的作用,即调用函数和中断函数。但是写一篇太累了,我还是决定分为两篇写,这篇是调用函数篇。在本篇中你主要看到这些东西!!!1.调用函数的方法(主要讲语法和格式)2.独立按键如何控制LED亮灭3.程序中的一些细节(软件消抖等)1.调用函数的方法思路还是比较清晰地,就是通过按下按键来控制LED闪灭,即每按下一次,LED取反一次。重要的是,把按键与LED联系在一起。我打算用K1来作为开关,看了一下开发板原理图,K1连接的是单片机的P31口,当按下K1时,P31是与GND相连的,也就是说,当我按下去时

  3. 牛客网专项练习30天Pytnon篇第02天 - 2

    1.在Python3中,下列关于数学运算结果正确的是:(B)a=10b=3print(a//b)print(a%b)print(a/b)A.3,3,3.3333...B.3,1,3.3333...C.3.3333...,3.3333...,3D.3.3333...,1,3.3333...解析:    在Python中,//表示地板除(向下取整),%表示取余,/表示除(Python2向下取整返回3)2.如下程序Python2会打印多少个数:(D)k=1000whilek>1:    print(k)k=k/2A.1000 B.10C.11D.9解析:    按照题意每次循环K/2,直到K值小于等

  4. 蓝桥杯备赛(二) - 2

    目录前言: 一、ASC分析代码实现二、 卡片分析代码实现三、 直线分析代码实现四、货物摆放分析代码实现小结:前言:  在刷题的过程中,发现蓝桥杯的题目和力扣的差别很大。让人有一种不一样的感觉,蓝桥杯题目偏向对于实际问题用编程去的解决,而力扣给人感觉很锻炼自己的编程思维,逻辑能力。两者结合去刷,相信会有不一样的收获。 一、ASC  已知大写字母A的ASCII码为65,请问大写字母L的ASCII码是多少?分析  这道题目看上去很简单,我们需确定自己计算的准确,所以我建议用编程去解决。代码实现publicclassTest8{publicstaticvoidmain(String[]args){Sy

  5. 蓝桥杯C/C++VIP试题每日一练之报时助手 - 2

    ?作者主页:静Yu?简介:CSDN全栈优质创作者、华为云享专家、阿里云社区博客专家,前端知识交流社区创建者?社区地址:前端知识交流社区?博主的个人博客:静Yu的个人博客?博主的个人笔记本:前端面试题个人笔记本只记录前端领域的面试题目,项目总结,面试技巧等等。接下来会更新蓝桥杯官方系统基础练习的VIP试题,依然包括解题思路,源代码等等。问题描述:给定当前的时间,请用英文的读法将它读出来。时间用时h和分m表示,在英文的读法中,读一个时间的方法是:  如果m为0,则将时读出来,然后加上“o’clock”,如3:00读作“threeo’clock”。  如果m不为0,则将时读出来,然后将分读出来,如5

  6. micropython复现经典单片机项目(二)可视化音频 频谱解析(基本搞定) - 2

    本人是音乐爱好者,从小就特别喜欢那个随着音乐跳动的方框效果,就是这个:arduino上一大把对,我忍你很久了,我就想用mpy做,全网没有,行我自己研究。果然兴趣是最好的老师,我之前有篇博客专门讲音频,有兴趣的可以回顾一下。提到可视化频谱,必然绕不开fft,大学学过这玩意,当时一心玩,老师讲的一个字都么听进去,网上教程简略扫了一下,大该就是把时域转频域的工具,我大mpy居然没有fft函数,奶奶的,先放着。音频信息如何收集?第一种傻瓜式的ADC,模拟转数字,原始粗暴,第二种,I2S库,我之前博客有讲过,数据是PCM编码。然后又去学PCM编码,一学豁然开朗,舒服,以代码为例:audio_in=I2S

  7. ruby-on-rails - Rails 未定义方法 `strftime' 为 "2013-03-06":String - 2

    我遇到了错误“2013-03-06”的未定义方法`strftime':String当尝试使用strftime从字符串2013-03-06正常显示日期(2013年6月3日或类似日期)时。在我的index.html.erb中执行此操作的行看起来像这样我只是在学习Rails,所以我确信这只是一个愚蠢的初学者错误,我们将不胜感激。谢谢 最佳答案 当strftime是时间/日期类的方法时,您的截止日期看起来是一个字符串。你可以试试这个:Date.parse(task.duedate).strftime("%B%e,%Y")

  8. 十四届蓝桥青少组模拟赛Python-20221108 - 2

    十四届蓝桥青少组模拟赛Python-20221108T1.二进制位数十进制整数2在十进制中是1位数,在二进制中对应10,是2位数。十进制整数22在十进制中是2位数,在二进制中对应10110,是5位数。请问十进制整数2022在二进制中是几位数?print(len(bin(2022))-2)#运行结果:11T2.晨跑小蓝每周六、周日都晨跑,每月的1、11、21、31日也晨跑。其它时间不晨跑。已知2022年1月1日是周六,请问小蓝整个2022年晨跑多少天?#样例代码1ls=[0,31,28,31,30,31,30,31,31,30,31,30,31]ans=0k=6foriinrange(1,13)

  9. 蓝桥杯 stm32 MCP4017 - 2

    本文代码使用HAL库。文章目录前言一、MCP4017的重要特性二、MCP4017计算RBW阻值三、MCP4017地址四、MCP4017读写函数五、CubeMX创建工程(利用ADC测量MCP4017电压)、对应代码:总结前言一、MCP4017的重要特性蓝桥杯板子上的是MCP4017T-104ELT,如图1。MCP4017是一个可编程电阻,通过写入的数值可以改变电阻的大小。重点在于6引脚(W),5引脚(B&#

  10. 51单片机——74HC595的应用(SPI实践) - 2

    目录SPI总线SPI总线概述 SPI总线分类SPI优点及缺点SPI接口硬件原理SPI四种工作模式 74HC595应用74HC595芯片概述74HC595封装及管脚功能74HC595工作原理 ​编辑 74HC595串行转并行点亮LED灯 程序实现  Proteus运行结构示意图SPI总线SPI总线概述 SPI(SerialPeripheralinterface):串行外围设备接口 用途:用来在微控制器与外围设备芯片之间实现数据交换 特点:高速、全双工、同步 SPI总线分类四线制全双工SPI(同时收发)MISO    主机输入/从机输出MOSI    主机输出/从机输入SCLK   串行时钟CS或

随机推荐