蓝桥杯单片机必备知识—–(11)EEPROM

蓝桥杯单片机必备知识—–(11)EEPROM

蓝桥杯单片机必备知识—–(11)EEPROM

EEPROM

由于EPROM操作的不便,后来出的主板上BIOS ROM芯片大部分都采用EEPROM(Electrically Erasable Programmable ROM,电可擦除可编程ROM)。EEPROM的擦除不需要借助于其它设备,它是以电子信号来修改其内容的,而且是以Byte为最小修改单位,不必将资料全部洗掉才能写入,彻底摆脱了EPROM Eraser和编程器的束缚。EEPROM在写入数据时,仍要利用一定的编程电压,此时,只需用厂商提供的专用刷新程序就可以轻而易举地改写内容,所以,它属于双电压芯片。借助于EEPROM芯片的双电压特性,可以使BIOS具有良好的防毒功能,在升级时,把跳线开关打至“on”的位置,即给芯片加上相应的编程电压,就可以方便地升级;平时使用时,则把跳线开关打至“off”的位置,防止CIH类的病毒对BIOS芯片的非法修改。所以,仍有不少主板采用EEPROM作为BIOS芯片并作为自己主板的一大特色。
IIC.H添加

void write_eeprom(unsigned char add,unsigned char val);
unsigned char read_eeprom(unsigned char add);

IIC.C中添加

// 写入
void write_eeprom(unsigned char add,unsigned char val)
{
   
	IIC_Start();
	IIC_SendByte(0xa0);
	IIC_WaitAck();
	IIC_SendByte(add);
	IIC_WaitAck();
	IIC_SendByte(val);
	IIC_WaitAck();
	IIC_Stop();
}

unsigned char read_eeprom(unsigned char add)
{
   
	unsigned char da;
	
	IIC_Start();
	IIC_SendByte(0xa0);
	IIC_WaitAck();
	IIC_SendByte(add);
	IIC_WaitAck();
	
	IIC_Start();
	IIC_SendByte(0xa1);
	IIC_WaitAck();
	da = IIC_RecByte();
	IIC_SendAck(1);
	IIC_Stop();
	
	return da;
}

MAIN.C中调用

void delay()		//10ms @11.0592MHz
{
   
	unsigned char i, j;

	i = 108;
	j = 145;
	do
	{
   
		while (--j);
	} while (--i);
}

//数据的读写操作
// write_eeprom(0x00,0x00); //EEPROM中存储的数据需要进行初始化
    reset_cnt = read_eeprom(0x00);  //从AT24C02地址0x00中读取数据
	delay();	//延时10ms
    write_eeprom(0x00,reset_cnt);  //向AT24C02地址0x00中写入数据
	delay();

测试结果:

实现功能:记录开机次数。
在这里插入图片描述

整个代码粘贴

IIC.H

#ifndef _IIC_H
#define _IIC_H

void IIC_Start(void); 
void IIC_Stop(void);  
bit IIC_WaitAck(void);  
void IIC_SendAck(bit ackbit); 
void IIC_SendByte(unsigned char byt); 
unsigned char IIC_RecByte(void); 

void write_eeprom(unsigned char add,unsigned char val);
unsigned char read_eeprom(unsigned char add);

#endif

IIC.C


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

#define DELAY_TIME 5

#define SlaveAddrW 0xA0
#define SlaveAddrR 0xA1

//总线引脚定义
sbit SDA = P2^1;  /* 数据线 */
sbit SCL = P2^0;  /* 时钟线 */

void IIC_Delay(unsigned char i)
{
   
    do{
   _nop_();}
    while(i--);        
}
//总线启动条件
void IIC_Start(void)
{
   
    SDA = 1;
    SCL = 1;
    IIC_Delay(DELAY_TIME);
    SDA = 0;
    IIC_Delay(DELAY_TIME);
    SCL = 0;	
}

//总线停止条件
void IIC_Stop(void)
{
   
    SDA = 0;
    SCL = 1;
    IIC_Delay(DELAY_TIME);
    SDA = 1;
    IIC_Delay(DELAY_TIME);
}

//发送应答
void IIC_SendAck(bit ackbit)
{
   
    SCL = 0;
    SDA = ackbit;  					// 0:应答,1:非应答
    IIC_Delay(DELAY_TIME);
    SCL = 1;
    IIC_Delay(DELAY_TIME);
    SCL = 0; 
    SDA = 1;
    IIC_Delay(DELAY_TIME);
}

//等待应答
bit IIC_WaitAck(void)
{
   
    bit ackbit;
	
    SCL  = 1;
    IIC_Delay(DELAY_TIME);
    ackbit = SDA;
    SCL = 0;
    IIC_Delay(DELAY_TIME);
    return ackbit;
}

//通过I2C总线发送数据
void IIC_SendByte(unsigned char byt)
{
   
    unsigned char i;

    for(i=0; i<8; i++)
    {
   
        SCL  = 0;
        IIC_Delay(DELAY_TIME);
        if(byt & 0x80) SDA  = 1;
        else SDA  = 0;
        IIC_Delay(DELAY_TIME);
        SCL = 1;
        byt <<= 1;
        IIC_Delay(DELAY_TIME);
    }
    SCL  = 0;  
}

//从I2C总线上接收数据
unsigned char IIC_RecByte(void)
{
   
    unsigned char i, da;
    for(i=0; i<8; i++)
    {
      
    	SCL = 1;
	IIC_Delay(DELAY_TIME);
	da <<= 1;
	if(SDA) da |= 1;
	SCL = 0;
	IIC_Delay(DELAY_TIME);
    }
    return da;    
}




// 写入
void write_eeprom(unsigned char add,unsigned char val)
{
   
	IIC_Start();
	IIC_SendByte(0xa0);
	IIC_WaitAck();
	IIC_SendByte(add);
	IIC_WaitAck();
	IIC_SendByte(val);
	IIC_WaitAck();
	IIC_Stop();
}

unsigned char read_eeprom(unsigned char add)
{
   
	unsigned char da;
	
	IIC_Start();
	IIC_SendByte(0xa0);
	IIC_WaitAck();
	IIC_SendByte(add);
	IIC_WaitAck();
	
	IIC_Start();
	IIC_SendByte(0xa1);
	IIC_WaitAck();
	da = IIC_RecByte();
	IIC_SendAck(1);
	IIC_Stop();
	
	return da;
}

MAIN.C

#include <stc15f2k60s2.h>
#include "iic.h"

#define uchar unsigned char
#define uint unsigned char
	
uchar tab[] = {
   0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8, 0x80, 0x90, 0xff};
uchar dspbuf[8] = {
   10,10,10,10,10,10,10,10};
uchar a1 = 10,b1 = 20,c1 = 0,a2,b2,c2;
//uchar s4 = 0,s5 = 0,s8 = 0,s9 = 0;
uchar s4 = 0,s5 = 0,s6 = 0,s7 = 0,s8 = 0,s9 = 0,s10 = 0;
uchar s11 = 0,s12 = 0,s13 = 0,s14 = 0,s15 = 0,s16 = 0,s17 = 0,s18 = 0,s19 = 0;


void load();
void display();
void read_key();
void delay()		//10ms @11.0592MHz
{
   
	unsigned char i, j;

	i = 108;
	j = 145;
	do
	{
   
		while (--j);
	} while (--i);
}
void cls()
{
   
	P2 = (P2 & 0x1f) | 0x80;
	P0 = 0xff;
	P2 = 0x1f;
	
	P2 = (P2 & 0x1f) | 0xa0;
	P0 = 0x00;
	P2 = 0x1f;
}

void main()
{
   
	cls();
	AUXR = 0xc0;
	TMOD = 0x00;
	TL0 = 0xcd;
	TH0 = 0xd4;
	TR0 = 1;
	ET0 = 1;
	EA = 1;
	c2 = read_eeprom(0x04);
	delay();
	c1 = c2 + 1;
	write_eeprom(0x04,c1);
	delay();
	dspbuf[4] = c2 / 10;
	dspbuf[5] = c2 % 10;
	while(1){
   }
}

void time0() interrupt 1
{
   
	display();
}



void display()
{
   
	static unsigned char dspcom = 0;
	
	
	P2 = (P2 & 0x1f) | 0xe0;
	P0 = 0xff;
	P2 = 0x1f;
	
	P2 = (P2 & 0x1f) | 0xc0;
	P0 = 1 << dspcom;
	P2 = 0x1f;
	
	P2 = (P2 & 0x1f) | 0xe0;
	P0 = tab[dspbuf[dspcom]];
	P2 = 0x1f;
	
	if(++dspcom == 8) dspcom = 0;
}
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

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

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


相关推荐

  • office 365 e5开发者_百度网盘5t不够用怎么扩容

    office 365 e5开发者_百度网盘5t不够用怎么扩容Microsoft365E5开发者扩容到5T1.进入网址https://admin.microsoft.com/Adminportal/Home?source=applauncher#/users找到活跃用户2.找到你的账户进入管理产品许可证3.点击OneDrive,再点击编辑4.点击修改为此用户最大空间…

    2025年10月10日
    3
  • 自动编码器模型和代码解释

    自动编码器模型和代码解释CNN算法与程序研究 1)      深度学习基本理论方法http://wenku.baidu.com/view/2e630ddfc5da50e2524d7ff3 特征多,给出的信息多,识别准确性会提升。但是,计算复杂度增加,搜索的空间大,可以用来训练的数据在每个特征上就会稀疏。采用层次网络结构,BP一层隐层节点的浅层模型,带有一层隐层节点(如SVM、Boostin

    2022年6月7日
    25
  • 数据处理之pandas库

    1.Series对象由于series对象很简单,跟数组类似,但多了一些额外的功能,偷个懒,用思维导图表示2.DaraFrame对象DataFrame将Series的使用场景由一维扩展到多维,

    2021年12月30日
    32
  • 线程锁EnterCriticalSection和LeaveCriticalSection的用法

    线程锁EnterCriticalSection和LeaveCriticalSection的用法线程锁的概念函数EnterCriticalSection和LeaveCriticalSection的用法注:使用结构CRITICAL_SECTION需加入头文件#include“afxmt.h”定义一个全局的锁CRITICAL_SECTION的实例  和一个静态全局变量CRITICAL_SECTIONcs;//可以理解为锁定一个资源staticintn_AddVal

    2022年9月16日
    2
  • assertEquals方法

    assertEquals方法/***Assertsthattwoobjectsareequal.Iftheyarenot,an*{@linkAssertionError}isthrownwiththegivenmessage.If*expectedandactualarenull,*theyareconsideredeq

    2022年7月12日
    27
  • python基础几大数据类型

    python基础几大数据类型数据类型1.数据类型之整型int大白话理解:整数int作用:记录人的年龄班级人数…定义:都是整数age=18直接写整数就是整型2.数据类型之浮点型float大白话理解:

    2022年7月5日
    19

发表回复

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

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