蓝桥杯单片机AT24C02芯片上电自启动编程

蓝桥杯单片机AT24C02芯片上电自启动读取数据,写入数据的实现也是挺重要的一个模块,往年的考试就有考到过,下面就来解说一下具体的分析过程吧。

编写一个记录上电次数的代码,每一次上电自加一,使用数码管显示。

首先,官方提供的数据包中有提供了IIC总线的底层驱动代码,我们是可以直接调用这个底层驱动代码的,方便自己编写代码;
其次,系统设置一个记录上电次数的变量,上电的时候,上电之后把变量自加一,写入到芯片中;
之后,对芯片数据进行读取,读取到的数据进行显示;
最后,大概流程就差不多了,开始动手吧。

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

typedef unsigned char u8;
typedef unsigned int u16;

u8 shuma[12] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf,0xbf};

// 外设初始化
void init_system()
{
    P2 = (P2 & 0x1f) | 0x80;
	P0 = 0xff;
	P2 = (P2 & 0x1f);

	P2 = (P2 & 0x1f) | 0xa0;
	P0 = 0x00;
	P2 = (P2 & 0x1f);

	P2 = (P2 & 0x1f) | 0xc0;
	P0 = 0x00;
	P2 = (P2 & 0x1f);
}

	// 外设导通选择
void select(u8 local)
{
    switch(local)
	{
	    case(4): P2 = (P2 & 0x1f) | 0x80; break;
		case(5): P2 = (P2 & 0x1f) | 0xa0; break;
		case(6): P2 = (P2 & 0x1f) | 0xc0; break;
		case(7): P2 = (P2 & 0x1f) | 0xe0; break;
	}
}


void delay()
{
    u8 t = 200;
	while(t--);
}

void display(u8 local, u8 num)
{
    select(6);
	P0 = 0x80 >> (local - 1);
	P2 = P2 & 0x1f;
	delay();

    // 消隐
	select(7);
	P0 = num;
	P2 = P2 & 0x1f;	
}


void write_at24c02(u8 add, u8 data1)    // 往AT24C02芯片写入数据函数
{
    IIC_Start();
	IIC_SendByte(0xa0);
	IIC_WaitAck();

	IIC_SendByte(add);
	IIC_WaitAck();

	IIC_SendByte(data1);
	IIC_WaitAck();
	IIC_Stop();
  
}

unsigned char read_at24c02(u8 add)   //  读取ATC24C02的数据函数
{
    u8 temp;      
    IIC_Start();   // 启动总线 ,函数主体在底层函数中
	IIC_SendByte(0xa0);     //  发送标志字节
	IIC_WaitAck();      // 等待总线响应

	IIC_SendByte(add);  // 发送读取数据的地址
	IIC_WaitAck();     // 等待总线响应

	IIC_Start();	  // 重新启动再发送地址单元写进去
	IIC_SendByte(0xa1);   
	IIC_WaitAck();

	temp = IIC_RecByte();
	IIC_WaitAck();
	IIC_Stop();
	return temp;
}


void Delay2ms()		//@11.0592MHz
{
	unsigned char i, j;

	_nop_();
	_nop_();
	i = 22;
	j = 128;
	do
	{
		while (--j);
	} while (--i);
}


void main()
{
    u8 num;
    init_system();
	num = read_at24c02(0x55);  // 读取数据的地址可以0x00-0xff,自行选择,注意写入到那个地址,之后读取数据就在那个地址进行读取
	write_at24c02(0x55,++num);   // 写入数据到上面读取数据的地址(地址需要一致)
    while(1)
	{
		display(1,shuma[num%10]);
		display(2,shuma[num/10]);
		close_display();
		Delay2ms();

	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

程序员吴同学

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

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

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

打赏作者

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

抵扣说明:

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

余额充值