蓝桥杯单片机AT24C02芯片上电自启动编程「建议收藏」

蓝桥杯单片机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();

	}
}
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/115103.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • vue JS 对象转数组[通俗易懂]

    vue JS 对象转数组[通俗易懂]option:{ head:{ title:”日期”, name:date, width:180 }, data:{ date:”2021-05-27″, name:”张三”, address:”上海市浦东新区XX路XX号” } }转数组:letoption=this.option;letArr=Object.keys(option).map(k

    2022年9月13日
    0
  • 动态规划0—1背包问题

    动态规划0—1背包问题动态规划0-1背包问题Ø  问题描述:  给定n种物品和一背包。物品i的重量是wi,其价值为vi,背包的容量为C。问应如何选择装入背包的物品,使得装入背包中物品的总价值最大?Ø 对于一种物品,要么装入背包,要么不装。所以对于一种物品的装入状态可以取0和1.我们设物品i的装入状态为xi,xi∈(0,1),此问题称为0-11背包问题。

    2022年7月26日
    4
  • AVX2指令集浮点乘法性能分析

    AVX2指令集浮点乘法性能分析AVX2指令集浮点乘法性能分析一、AVX2指令集介绍二、代码实现0.数据生成1.普通连乘2.AVX2指令集乘法:单精度浮点(float)3.AVX2指令集乘法:双精度浮点(double)三、性能测试测试环境计时方式测试内容进行性能测试第一次测试第二次测试四、总结个人猜测原因:一、AVX2指令集介绍AVX2是SIMD(单指令多数据流)指令集,支持在一个指令周期内同时对256位内存进行操作。包含乘法,加法,位运算等功能。下附Intel官网使用文档。Intel®IntrinsicsGuide我

    2022年5月30日
    35
  • linux 如何编译安装软件

    linux 如何编译安装软件

    2021年10月18日
    40
  • Unity键盘钩子[通俗易懂]

    Unity键盘钩子[通俗易懂]http://blog.csdn.net/qq452626100/article/details/52398830privatestaticintKeyboardHookProc(intnCode,Int32wParam,IntPtrlParam){ if(nCode==HC_ACTION ) { varkc=(KeyCode)(wParam+97-65)

    2022年5月28日
    46
  • VB.NET数据库编程基础教程

    VB.NET数据库编程基础教程关键词:作者罗姗众所周知,VB.NET自身并不具备对数据库进行操作的功能,它对数据库的处理是通过.NETFrameWorkSDK中面向数据库编程的类库和微软的MDAC来实现的。其中,ADO.NET

    2022年7月1日
    19

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号