新建工程,以I/O模式编写代码,在CT107D单片机综合训练平台上,实现以下功能:
1、将IIC总线的底层驱动代码文件正确移植到工程中。
2、系统上电后,从24C04存储器的0x01、0x03和0x05这三个地址单元读取数据。
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存储器的基本原理与应用》
/*==================蓝桥杯单片机特训==================
【进阶03】:24C02的基本读写操作
**平 台:CT107D单片机综合实训平台
**模 式:IO模式
**底层驱动文件:2022年竞赛资源数据包提供的文件
**设 计:欧浩源(小蜜蜂老师,[email protected])
**时 间: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(); //循环动态刷新数码管
}
}
【注】:更多关于蓝桥杯单片机备赛内容,详见《蓝桥杯单片机设计与开发》小蜜蜂特训手册,本站可下载,相关更多蓝桥杯的案例完整源码及学习备赛笔记,欢迎进入“小蜜蜂笔记”公众号。