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

【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();		//循环动态刷新数码管
	}
}

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

  • 18
    点赞
  • 71
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 7
    评论
void start 开始信号 void stop 停止信号 void Ack 发确认信号 void NoAck 发无确认信号 void init 初始化信号 拉高SDA和SCL两条总线 bit write byte uchar date 写一字节 将 date 写入AT24C02 中 uchar read byte 读一字节 从 AT24C02 中读一字节 bit busy 应答查询 stop 后 启动AT24C02内部写周期 启动查询 初始化EEPROM子程序内容为0XFF nPage 0 31 void Init Flash uchar nPage 8 bytes 1 page init 0xFF void write add uchar address uchar date 向 AT24C02 中写数据 从AT24C02中给定的地址nAddr起 将存放在以指针nContent开头的存储空间中的nLen个字节数据 连续写入AT24C02 void write flash uchar nContent uchar nAddr uchar nLen uchar read add uchar address 从 AT24C02 中读出数据 从AT24C02中给定的地址nAddr起 读取nLen个字节数据存放在以指针nContent开头的存储空间 void read flash uchar nContent uchar nAddr uchar nLen 单片机P2口接74HC138(三八译码器)P2 3 74HC138: EI P2 2 74HC138:A2 P2 1 74HC138:A1 P2 0 74HC138:A0 译码器输出 Y0 Y1 Y2 Y3 Y4 Y5 Y6 Y7均低电平有效 分别选通1 8个数码管 包括2个四位一体数码管LG3641BH 共2x4 8个数码管 数码管数据口为P0口 数码管为共阳4位一体数码管 功能: 译码器输出为1 8个数码管的段选信号 轮流选择1 8数码管 void display uchar nContent uchar nLen 功能:在8段数码管上显示nLen个字符 这些字符存储在指针nContent开头的往下的内容中 显示原理: 1 送出要显示的段数 2 P2译码 选择要显示的位 3 延时1 2ms 时间不能太长 否则会闪烁 也不能太短 否则会很暗 4 取消段选 消隐 若要显示多段 重复以上4步 ">void start 开始信号 void stop 停止信号 void Ack 发确认信号 void NoAck 发无确认信号 void init 初始化信号 拉高SDA和SCL两条总线 bit write byte uchar date 写一字节 将 date 写入AT24C02 中 uchar read byte 读一字节 从 AT24C02 中读一 [更多]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小蜜蜂老师

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值