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