EEPROM器件读写例程设计

合集下载

stc单片机eeprom读写程序

stc单片机eeprom读写程序

stc单片机eeprom读写程序以下是STC单片机使用EEPROM进行读写的示例程序:#include <reg52.h>#include <intrins.h>#define EEPROM_ADDR 0xA0 // EEPROM的I2C地址sbit SDA = P2^0; // I2C的数据线sbit SCL = P2^1; // I2C的时钟线// I2C开始信号void I2C_Start(){SDA = 1;_nop_(); // 延时一段时间SCL = 1;_nop_(); // 延时一段时间SDA = 0;_nop_(); // 延时一段时间SCL = 0;_nop_(); // 延时一段时间}// I2C停止信号void I2C_Stop(){SDA = 0;_nop_(); // 延时一段时间SCL = 1;_nop_(); // 延时一段时间SDA = 1;_nop_(); // 延时一段时间}// I2C发送一个字节的数据void I2C_SendByte(unsigned char dat){unsigned char i;for (i = 0; i < 8; i++){SDA = dat & 0x80; // 获取最高位dat <<= 1;_nop_(); // 延时一段时间SCL = 1;_nop_(); // 延时一段时间SCL = 0;_nop_(); // 延时一段时间}SDA = 1;_nop_(); // 延时一段时间SCL = 1;_nop_(); // 延时一段时间SCL = 0;_nop_(); // 延时一段时间}// I2C接收一个字节的数据unsigned char I2C_ReceiveByte(){unsigned char i, dat = 0;SDA = 1;for (i = 0; i < 8; i++){_nop_(); // 延时一段时间SCL = 1;_nop_(); // 延时一段时间dat <<= 1;dat |= SDA;SCL = 0;}return dat;}// 在EEPROM中写入一个字节的数据void EEPROM_WriteByte(unsigned char addr, unsigned char dat) {I2C_Start();I2C_SendByte(EEPROM_ADDR | 0); // 发送写入指令I2C_SendByte(addr); // 发送地址I2C_SendByte(dat); // 发送数据I2C_Stop();}// 从EEPROM中读取一个字节的数据unsigned char EEPROM_ReadByte(unsigned char addr){unsigned char dat;I2C_Start();I2C_SendByte(EEPROM_ADDR | 0); // 发送写入指令 I2C_SendByte(addr); // 发送地址I2C_Start();I2C_SendByte(EEPROM_ADDR | 1); // 发送读取指令 dat = I2C_ReceiveByte(); // 读取数据I2C_Stop();return dat;}。

eeprom读写程序详解

eeprom读写程序详解

eeprom读写程序详解EEPROM(Electrically Erasable Programmable Read-Only Memory) 是一种可编程只读存储器,可以在电信号的作用下进行擦写和改写。

它通常用于存储单片机或其他嵌入式系统中的数据、设置参数、配置文件等。

对于 EEPROM 的读写程序,需要考虑以下几个方面:1. 读操作:读操作通常包括以下步骤:- 等待上次读操作完成。

- 获取要读取的数据的单元地址。

- 将 EEPGD 位和 CFGS 位清零。

- 启动读操作控制位 RD。

- 等待本次读操作完成。

- 将该单元地址中对应的数据返回。

在读取 EEPROM 数据时,为了避免芯片在一瞬间无法获取到数据,需要给芯片一定的时间来稳定获取数据。

因此,在读取操作中需要加入等待步骤。

2. 写操作:写操作通常包括以下步骤:- 等待上次写操作完成。

- 获取要写的数据的单元地址。

- 将要写的数据写入 EEPROM 的单元中。

- 将 EEPGD 位和 CFGS 位清零。

- 启动写操作控制位 WP。

- 等待写操作完成。

在写操作中,为了确保数据的可靠性,需要将要写的数据写入EEPROM 的单元中,并等待写操作完成。

同时,在写操作过程中,需要注意避免对无关的单元进行写操作,以免损坏 EEPROM 芯片。

3. 中断处理:在 EEPROM 的读写操作中,通常需要加入中断处理机制,以便在读写过程中及时响应和处理异常情况。

例如,在读取 EEPROM 数据时,如果 EEPROM 芯片出现故障,可能会导致读取失败。

为了避免这种情况,可以在读取操作中加入中断处理机制,在读取失败时及时报警或采取相应的应对措施。

总之,EEPROM 读写程序的实现需要考虑多个方面的因素,包括读操作、写操作、中断处理等。

同时,需要考虑 EEPROM 芯片的特性和限制,以便实现高效、稳定、可靠的 EEPROM 读写操作。

eeprom读写项目课程设计

eeprom读写项目课程设计

eeprom读写项目课程设计一、课程目标知识目标:1. 理解EEPROM的基本概念、内部结构和存储原理;2. 掌握EEPROM的读写操作流程及相关编程技巧;3. 了解EEPROM在嵌入式系统中的应用场景。

技能目标:1. 能够使用相关开发工具和编程语言对EEPROM进行读写操作;2. 学会分析EEPROM读写过程中可能遇到的问题,并提出相应的解决方案;3. 能够运用所学知识,完成一个简单的EEPROM读写项目。

情感态度价值观目标:1. 培养学生对电子技术及编程的兴趣,激发学习热情;2. 培养学生的团队协作意识和沟通能力,学会共同解决问题;3. 增强学生的自信心,使其认识到自己的潜力和价值。

课程性质:本课程为实践性较强的课程,结合理论知识与实际操作,旨在提高学生的动手能力和编程技能。

学生特点:本课程面向高年级学生,他们已经具备了一定的电子技术基础和编程能力,对实际项目具有强烈的好奇心。

教学要求:教师需结合实际案例,引导学生主动探究,注重理论与实践相结合,确保学生能够将所学知识应用于实际项目中。

在教学过程中,关注学生的个体差异,给予个性化指导,以提高整体教学效果。

通过本课程的学习,使学生达到上述课程目标,为今后的学习和工作打下坚实基础。

二、教学内容1. EEPROM基本概念与原理:- EEPROM定义、特点及应用场景;- EEPROM内部结构、存储单元及工作原理;- EEPROM与其它类型存储器的区别。

2. EEPROM读写操作:- I2C、SPI等通信协议在EEPROM中的应用;- EEPROM编程接口及编程语言选择;- EEPROM读写操作流程及编程技巧。

3. EEPROM应用案例分析:- 简单EEPROM读写项目案例介绍;- 案例中涉及的关键技术及其实现方法;- 分析案例中可能遇到的问题及解决方案。

4. 实践操作与项目实施:- 实践环境搭建,开发工具使用;- 指导学生完成EEPROM读写操作练习;- 分组讨论,协作完成一个简单的EEPROM读写项目。

单片机程序设计实践教程_第17章_EEPROM器件AT24C02读写

单片机程序设计实践教程_第17章_EEPROM器件AT24C02读写
1.加深对IIC总线通信工作方式及原理的理解; 2.掌握24C02芯片的功能以及在本开发板中所起的作用; 3.掌握EEPROM器件电路的连接方法; 4.理解对24C02进行写和读控制的软件编制方法; 5.在达到以上四点目标的基础上,根据本章“项目扩展任 务”中提出的问题,以组或个人为单位,在规定时间里 完成扩展项目任务。
4
图17-1 24C02读写项目的电路原理图 17- 24C02读写项目的电路原理图
5
17.3 系统板上硬件连线
PMY单片机开发板上24C02读写控制项目的连接插线设置如图 17-2所示。
24C02读写项目的连接插线设置 图17-2 开发板上24C02读写项目的连接插线设置 17- 开发板上24C02
3
17.2 项目任务
24C02读写控制项目的电路原理图如图17-1所示。在第17章已 经介绍过,STC89C52RC单片机本身不包含I2C总线通信控制器的 功能,为了与具有I2C总线通信和存储功能的EEPROM器件24C02 芯片进行数据交换,STC89C52RC单片机必须利用自身的两根 I/O线(这里是P14和P15引脚),作为I2C的SDA和SCL信号线,利 用 软 件 模 拟 产 生 I2C 通 信 协 议 规 定 的 传 输 数 据 信 号 , 以 完 成 与 24C02芯片之间的数据交换。 本次项目应完成以下程序设计:通过C51嵌入式软件对24C02指 定的多个连续地址写入指定数值,再读出已写入24C02器件地址的 数值,并在七段LED数码管上进行显示。
14
如何在项目中实现24C02 24C02的读写 17.6.3 如何在项目中实现24C02的读写
程序中的_24C02_WriteByte函数是向指定从地址器件的特定寄 存器地址写入一个字节数据,虽然与数字钟设计项目程序中的 PCF8563_WRINIT函数功能类似,但只是完成了向从器件传送一 个字节数据的功能。而PCF8563_WRINIT函数则完成向从器件指 定地址写入多个指定字节数据,在本项目主程序main中的以下语 句同样可以实现主器件(STC89C52RC)向指定从器件(24C02) 的指定地址连续写入多个字节的功能: /*************以下语句为向24C02写入数据*****************/ _24C02_Fillbyte(20,0xff); //将前20字节用0xff填充 for(i=0;i<16;i++) _24C02_WriteByte(i,DispDat[i]); //将数组DispDat设定的 显示代码写入到24C02 /*************以上语句为向24C02写入数据*****************/

STC单片机EEPROM读写程序

STC单片机EEPROM读写程序

STC单片机EEPROM读写程序在单片机中,EEPROM(Electrically Erasable Programmable Read-Only Memory)是一种非易失性存储器,可以用于存储数据,即使在断电情况下,数据也会被保留。

因此,掌握STC单片机的EEPROM读写程序对于开发嵌入式系统非常重要。

一、EEPROM简介EEPROM是一种可重复擦写的存储器,可用于存储小量数据。

与Flash存储器相比,EEPROM具有更快的写入和擦除速度。

在STC单片机中,EEPROM的存储容量通常较小,一般在几个字节到几千字节之间。

二、EEPROM读操作在STC单片机中,进行EEPROM读操作需要按照以下步骤进行:1. 初始化I2C总线:STC单片机使用I2C总线进行EEPROM读写操作,因此需要先初始化I2C总线。

通过设置相关寄存器,设置I2C 总线的速度和地址。

2. 发送设备地址:确定要读取的EEPROM设备的地址,并发送到I2C总线。

3. 发送寄存器地址:确定要读取的EEPROM寄存器地址,并将其发送到I2C总线。

4. 发送读命令:向EEPROM发送读命令,以启动读操作。

5. 读取数据:从EEPROM中读取数据,并保存到变量中。

6. 结束读操作:完成读操作后,关闭I2C总线。

三、EEPROM写操作类似于读操作,进行EEPROM写操作也需要按照一定的步骤进行:1. 初始化I2C总线:同样地,首先需要初始化I2C总线。

2. 发送设备地址:确定要写入的EEPROM设备的地址,并发送到I2C总线。

3. 发送寄存器地址:确定要写入的EEPROM寄存器地址,并将其发送到I2C总线。

4. 发送写命令:向EEPROM发送写命令,以启动写操作。

5. 写入数据:将要写入EEPROM的数据发送到I2C总线。

6. 结束写操作:完成写操作后,关闭I2C总线。

四、注意事项在进行EEPROM读写操作时,需要注意以下几点:1. 确保正确的设备地址:要与EEPROM的地址匹配,否则无法进行有效的读写操作。

iap15w4k61sEEPRom读写例程

iap15w4k61sEEPRom读写例程

iap15w4k61sEEPRom读写例程/********************************** STC iap15w4k61s EEPRom 读写例程main.c**********************************/ #include "lcd2004a.h"#include "stceepo.h"BYTE a,b,c;DWORD myLong;BYTE EEString[21]="";void main(){Io_Init(0,0x00, 0x00);Io_Init(2,0x00, 0x00);Io_Init(4,0x00, 0x00);LCDInit();while(1){strcpy(EEString,"abcdefghij");LCDDisplayString(1,0,EEString);myLong=1234;DisplayLongInt(2,0,myLong);IapEraseSector(0xE000);//Erase the 113th sectorfor(a=0;a<10;a++){IapWriteByte(0xE000+a,EEString[a]); //write EEString[] to E000H to E009H}IapEraseSector(0xE200);//Erase the 113th sectorfor(a=4; a>0; a--){b=8*(a-1);c= myLong>>b; //write myLong to E00AH~E00CH low behindIapWriteByte(0xE203-a+1,c);}strcpy(EEString,"1234567890");for(a=0;a<10;a++){EEString[a]=IapReadByte(0xE000+a); //ReadE000H to E009H to EEString[]}LCDDisplayString(3,0,EEString); // Display the Rea resultmyLong=0;for(a=0; a<4; a++){myLong +=IapReadByte(0xE200+a);if(a<3)myLong <<=8;}DisplayLongInt(4,0,myLong);}}/************************************************************** LCD1024A Head Files**************************************************************/ #ifndef __LCD2004A_H__#define __LCD2004A_H__/**********************************当使用的是4位数据传输的时候定义,使用8位取消这个定义**********************************/#define LCD2004A_4PINS/**********************************包含头文件**********************************/#include "myport.h"#include "mytype.h"#include "delay.h"/*使LCD2004A显示左移命令子函数*/// void LCDCurMoveL();/*LCD2004A显示光标并闪烁命令子函数*/void LCDCurOn();/*LCD2004A在指定位置显示光标并闪烁命令子函数*/ void LCDCurPOn(BYTE x,BYTE y);/*LCD2004A关闭光标命令子函数*/void LCDCurOff();/*LCD2004A清屏命令子函数*/void LCDClearScreen();/*LCD2004A写入8位命令子函数*/void LCDWriteCom(BYTE com);/*LCD2004A写入8位数据子函数*/void LCDWriteData(BYTE dat);/*LCD2004A写入8位窗口位置数据子函数*/void LCDSetWindow(BYTE x,BYTE y); //x: row mumber, y:clumn number/*LCD2004A初始化子程序*/void LCDInit(); //initate LCD2004A/*LCD2004A判忙子程序*///bit LCDCheckBusy();// Check LCD2004A busy/*LCD2004A显示字符串前x个字符子程序*/void LCDDisplayStringx(BYTE x, BYTE y,BYTE *D_String, BYTE z); //Display D_String 0~x charaters/*LCD2004A显示字符串前字符子程序*/void LCDDisplayString(BYTE x, BYTE y,BYTE *D_String); //Display D_String/*十进制显示整数子函数*/void DisplayLongInt(BYTE x, BYTE y,DWORD z);/*清空字符串(数组)子函数*/void ClearString(BYTE *D_String);/*将一个字符串(数组)的前指定个拷贝到另一个字符串(数组)指定位置的子函数*/ void StringPoncpy(BYTE *D_String,BYTE *SrString, BYTE Pos, BYTE nUm);#endif/************************************************************** *******LCD2004A.c**********************************************************************/#include "lcd2004a.h"/************************************************************** *************** *** 函数名 : LcdWriteCom* 函数功能 : 向LCD写入一个字节的命令* 输入 : com* 输出 : 无*************************************************************** *************** */#ifndef LCD2004A_4PINS //当没有定义这个LCD1602_4PINS 时void LCDWriteCom(BYTE com) //写入命令com: command data{LCD_EA = 0; //使能LCD_RS = 0; //选择发送命令LCD_RW = 0; //选择写入LCD_DATAPINS = com; //放入命令Delay1ms(); //等待数据稳定LCD_EA = 1; //写入时序Delay1ms(); //保持时间LCD_EA = 0;}#elsevoid LCDWriteCom(BYTE com) //写入命令{LCD_EA = 0; //使能清零LCD_RS = 0; //选择写入命令LCD_RW = 0; //选择写入LCD_DATAPINS = com; //由于4位的接线是接到P0口的高四位,所以传送高四位不用改Delay1ms(); //等待数据稳定LCD_EA = 1; //写入时序Delay2ms(); //保持时间LCD_EA = 0;LCD_DATAPINS = com << 4; //发送低四位Delay1ms(); //等待数据稳定LCD_EA = 1; //写入时序Delay1ms(); //保持时间LCD_EA = 0;}#endif/************************************************************** *************** *** 函数名 : LcdWriteData* 函数功能 : 向LCD写入一个字节的数据* 输入 : dat* 输出 : 无*************************************************************** *************** */#ifndef LCD2004A_4PINSvoid LCDWriteData(BYTE dat) //写入数据{LCD_EA = 0; //使能清零LCD_RS = 1; //选择输入数据LCD_RW = 0; //选择写入LCD_DATAPINS = dat; //写入数据Delay1ms(); //等待数据稳定LCD_EA = 1; //写入时序Delay1ms(); //保持时间LCD_EA = 0;}#elsevoid LCDWriteData(BYTE dat) //写入数据{LCD_EA = 0; //使能清零LCD_RS = 1; //选择写入数据LCD_RW = 0; //选择写入LCD_DATAPINS = dat; //由于4位的接线是接到P0口的高四位,所以传送高四位不用改Delay1ms(); //等待数据稳定LCD_EA = 1; //写入时序Delay2ms(); //保持时间LCD_EA = 0;LCD_DATAPINS = dat << 4; //写入低四位Delay1ms(); //等待数据稳定LCD_EA = 1; //写入时序Delay1ms(); //保持时间LCD_EA = 0;}#endif/************************************************************** *************** *** 函数名 : LcdInit()* 函数功能 : 初始化LCD屏* 输入 : 无* 输出 : 无*************************************************************** *************** */#ifndef LCD2004A_4PINSvoid LCDInit() //LCD初始化子程序{LCDWriteCom(0x38); //8位总线显示LCDWriteCom(0x0c); //开显示不显示光标LCDWriteCom(0x06); //写一个指针加1LCDWriteCom(0x01); //清屏LCDWriteCom(0x80); //设置数据指针起点}#elsevoid LCDInit() //LCD初始化子程序{LCDWriteCom(0x32); //将8位总线转为4位总线LCDWriteCom(0x28); //在四位线下的初始化LCDWriteCom(0x0c); //开显示不显示光标LCDWriteCom(0x06); //写一个指针加1LCDWriteCom(0x01); //清屏LCDWriteCom(0x80); //设置数据指针起点}#endif//************************************************************* ************void LCDSetWindow(BYTE x,BYTE y) //x: 行号row mumber,1:第一行,2:第二行, y:纵坐标clumn number{switch(x){case 1:LCDWriteCom(0x80+y);break;case 2:LCDWriteCom(0xC0+y);break;case 3:LCDWriteCom(0x94+y);break;case 4:LCDWriteCom(0xD4+y);break;}}/************************************************************** **************bit LCDCheckBusy(){register LCD_State;LCD_EA = 1; //使能清零LCD_RS = 0; //选择读出数据LCD_RW = 1; //选择读出Delay1ms(); //等待数据稳定LCD_State=LCD_DATAPINS;LCD_EA = 0;return((bit)LCD_State&0X80);} *///************************************************************* *************** *******void LCDDisplayStringx(BYTE x, BYTE y,BYTE *D_String, BYTE z) //DisplayD_String 0~x charaters{BYTE i=0;LCDSetWindow(x,y);while(i<z)< bdsfid="296" p=""></z)<>{LCDWriteData(D_String[i]);i++;LCDSetWindow(x,y+i);}//************************************************************* *************** *********void LCDDisplayString(BYTE x, BYTE y,BYTE *D_String) //Display D_String{register i=0;LCDSetWindow(x,y);while(D_String[i]!=0){LCDWriteData(D_String[i]);i++;}}//************************************************************* *************** ******void DisplayLongInt(BYTE x, BYTE y,DWORD z)//十进制显示整数子函数{BYTE Tempchar[21]="********************";DWORD m;BYTE i;m=z;while(m>=10){m /=10;i++;}m=z;for(;i>0;i--){Tempchar[i-1]='0'+m%10;m /=10;}LCDDisplayString(x,y,Tempchar);}//****************************************void LCDClearScreen() //LCD2004A清屏命令子函数{LCDWriteCom(0x01); //清屏}//****************************************void LCDCurPOn(BYTE x,BYTE y) //LCD2004A在指定位置显示光标并闪烁命令子函数 {LCDSetWindow(x, y);LCDWriteCom(0x0F);}//*****************************************void LCDCurOn() //LCD2004A显示光标并闪烁命令子函数{LCDWriteCom(0x0F);}//*****************************************void LCDCurOff() //LCD2004A关闭光标命令子函数{LCDWriteCom(0x0c);}//******************************************/*void LCDCurMoveL() // 使LCD2004A显示左移命令子函数{LCDWriteCom(0x1B);}*///*********************************************void ClearString(BYTE *D_String) //清空字符串(数组)子函数 {BYTE i;while(D_String[i]!=0){D_String[i]=0;i++;}}//********************************************//将一个字符串(数组)的前指定个拷贝到另一个字符串(数组)指定位置的子函数void StringPoncpy(BYTE *D_String,BYTE *SrString, BYTE Pos, BYTE nUm){BYTE i;for(i=0; i<="" p="">{D_String[Pos+i]=SrString[i];}}/*******************************************************************/#ifndef __DELAY_H__#define __DELAY_H__//void Delay1us(); //@20.000MHz;//void Delay5us(); //@20.000MHzvoid Delay1ms(); //@20.000MHz//void Delay5ms(); //@20.000MHzvoid Delay10ms(); //@20.000MHz//void Delay2000ms(); //@20.000MHzvoid Delay2ms(); //@20.000MHzvoid Delay800ms(); //@20.000MHz//void Delay(BYTE n); //软件延时#endif/************************************************** delay.c ***********************************************/#include#include "delay.h"/*******************void Delay1us() //@20.000MHz{unsigned char i;_nop_();_nop_();i = 2;while (--i);}*//*******************void Delay5us() //@20.000MHz {unsigned char i;_nop_();i = 22;while (--i);} *///******************void Delay1ms() //@20.000MHz {unsigned char i, j;i = 20;j = 113;do{while (--j);} while (--i);}/*********************void Delay5ms() //@20.000MHz {unsigned char i, j;i = 98;j = 67;do{while (--j);} while (--i);}*///******************void Delay10ms() //@20.000MHz { unsigned char i, j, k;_nop_();i = 1;j = 195; k = 136; do {do {。

I2C EEPROM读写设计与制作

I2C EEPROM读写设计与制作

四川理工学院课程设计书学院计算机学院专业计算机科学与技术班级2013级 4 班课程嵌入式系统软硬件开发及应用实践题目I2C EEPROM读写设计与制作教师杨维剑学生龚程金黄雨杨坤陈超王俊枭摘要随着计算机系统及电子系统的飞速发展,信息的存储也越来越重要,EEPROM (电可擦写可编程只读存储器)是可用户更改的只读存储器(ROM),其可通过高于普通电压的作用来擦除和重编程(重写),断电后存在其中的数据不会丢失,通常用于存放硬件信息,如mac地址、BIOS芯片等,并在嵌入式ARM系统中应用广泛,IIC作为一种常见的总线技术,其方便扩展外围设备的特性使得其应用广泛,AT24C02是一款性价比超高的IIC接口EEPROM,擦写次数多、稳点不易丢失数据,本文将设计并制作ARM系统,并在Linux中实现I2C EEPROM读写。

关键词:ARM,EEPROM,IIC,AT24C02,Linux目录一、LinuxI2C驱动--概述 (1)1.1 设计任务与要求 (1)1.2 I2C (1)1.3 硬件 (1)1.4 软件 (1)二、硬件电路设计 (2)2.1 电路设计要求 (2)2.2 原理图的绘制 (2)2.2.1电源接口 (2)2.2.2UART接口 (3)2.2.3AT24C02接口 (3)2.3 PCB板的制作 (3)三、LinuxI2C驱动--I2C总线 (5)3.1 I2C总线物理结构 (5)3.2 I2C总线特性 (5)3.3 开始和停止条件 (6)3.4 数据传输格式 (6)3.5 响应 (7)3.6 总线仲裁 (8)四、LinuxI2C驱动--解析EEPROM的读写 (9)4.1 概述 (9)4.2 设备地址 (9)4.3 读eeprom (9)4.4 写eeprom (10)五、LinuxI2C驱动--访问eeprom (10)5.1 通过sysfs文件系统访问I2C设备 (10)5.2 通过devfs访问I2C设备 (11)5.3 总结 (11)六、LinuxI2C驱动--浅谈LinuxI2C驱动架构.. 126.1 I2C体系结构 (13)6.2 I2C重要数据结构 (13)七、LinuxI2C驱动--I2C设备驱动 (14)7.1 eeprom板级设备资源 (14)7.2 AT24C02 EEPROM 的I2C设备驱动 (14)7.2.1 at24_driver (14)7.2.3 at24_bin_read() (15)7.2.4 at24_bin_write() (15)7.3 总结 (15)八、LinuxI2C驱动--I2C总线驱动 (16)8.1 三星S3C2410 i2c适配器的硬件描述 (16)8.2 i2c总线驱动的加载/卸载 (17)8.3 i2c总线驱动的probe (17)8.4 启动i2c传输 (18)8.5 通过中断来推进i2c的传输 (18)课程设计体会 (19)参考文献 (20)附录 A (21)附录 B (29)一、LinuxI2C驱动--概述1.1 设计任务与要求1)通过软件基于I2C协议对EEPROM读写功能的实现。

单片机程序设计实践教程_第17章_EEPROM器件AT24C02读写

单片机程序设计实践教程_第17章_EEPROM器件AT24C02读写

单片机程序设计实践教程_第17章_EEPROM器件AT24C02
读写
本章主要介绍了如何使用单片机与EEPROM器件AT24C02进行读写操作。

EEPROM是一种非易失性存储器,可以在电源关闭后保持数据的存储,适用于存储一些关键的配置信息或数据。

首先,需要连接单片机与AT24C02,常见的连接方式有两根数据线(SDA和SCL),两根线分别连接到单片机的I2C总线接口上。

在进行读写操作之前,需要进行初始化,设置相关的参数,如器件地址、时钟频率等。

然后,可以使用相应的读写函数对AT24C02进行读写操作。

对于读操作,需要指定读取的地址和数据长度。

可以使用一个循环来
连续读取多个数据,也可以单独读取一些地址上的数据。

读取的数据保存
在单片机的缓存中,可以根据需要进行处理或显示。

对于写操作,同样需要指定写入的地址和数据。

可以通过循环连续写
入多个数据,也可以单独写入一些地址上的数据。

写入操作完成后,要记
得进行等待,等待数据写入完成。

需要注意的是,AT24C02有一定的写入周期,写入速度较慢。

因此,
在进行连续写入操作时,需要考虑到写入速度,避免写入过快导致数据丢
失或写入错误。

本章还介绍了一些常见的应用场景,如存储温度、湿度等传感器数据,存储用户配置信息等。

总的来说,本章介绍了如何使用单片机与EEPROM器件AT24C02进行读写操作。

通过实践这些内容,可以更好地掌握EEPROM的应用和使用方法,为后续的项目实践提供参考。

EEPROM器件读写例程设计.

EEPROM器件读写例程设计.
EEPROM数据读写操作模块则是用来实现对AT24C02进行数据读写操作的,由于设计中的数据读写操作都是通过I2C总线来实现的,所以操作过程要遵循I2C总线协议。首先要发送启动信号,然后再发送从器件地址,收到响应信号之后再开始从I2C总线上读/写数据,最后还要发送一个结束信号,表示数据操作的结束。
数据显示模块则是将每次操作的数据在LED上显示,以便测试代码的正确性,该模块的设计中不仅要包含对数据的显示功能的实现,还要实现对按键中断的功能,即时刻检测实验平台上5个按键的状态,以便对不同状态做出不同的操作。
break;
case 2:
EXA=0;
EXB=1;
break;
case 3:
EXA=1;
EXB=1;
break;
default:
EXA=0;
EXB=0;
break;
}
}
初始化芯片8255
void set_8255()
{
delay_1ms(1000);
COMM8255 = 0x82;
PA8255 = 0x80;
AT24C02支持I2C总线数据传送协议,总线协议规定任何将数据传送到总线的器件作为发送器。任何从总线接收数据的器件为接收器。数据传送是由产生串行时钟和所有起始停止信号的主器件控制的。主器件和从器件都可以作为发送器或接收器,但由主器件控制传送数据(发送或接收)的模式,通过器件地址输入端A0、A1和A2可以实现将最多8个AT24C02器件连接到总线上。其芯片引脚图如下图所示。
图3.3CH451引脚图
3.4
CD4052是一个差分4通道数字控制模拟开关,有A0、A1两个二进制控制输入端和INH输入,具有低导通阻抗和很低的截止漏电流。幅值为4.5~20V的数字信号可控制峰-峰值至20V的模拟信号。例如,若VDD=+5V,VSS=0,VEE=-13.5V,则0~5V的数字信号可控制-13.5~4.5V的模拟信号。这些开关电路在整个VDD-VSS和VDD-VEE电源范围内具有极低的静态功耗,与控制信号的逻辑状态无关。当INH输入端=“1”时,所有的通道截止。二位二进制信号选通4通道中的一通道,可连接该输入端至输出。

24C16的EEPROM的读写程序

24C16的EEPROM的读写程序

24C16规范的51读写C文件(开发板程序之一)/*I2C总线是由数据线SDA和时钟SCL构成的串行总线,可发送和接收数据。

在CPU与被控IC之间、IC与IC之间进行双向传送,最高传送速率400kbps。

各种被控制电路均并联在这条总线上,但就像电话机一样只有拨通各自的号码才能工作,所以每个电路和模块都有唯一的地址,在信息的传输过程中,I2C总线上并接的每一模块电路既是主控器(或被控器),又是发送器(或接收器),这取决于它所要完成的功能。

CPU发出的控制信号分为地址码和控制量两部分,地址码用来选址,即接通需要控制的电路,确定控制的种类;控制量决定该调整的类别(如对比度、亮度等)及需要调整的量。

这样,各控制电路虽然挂在同一条总线上,却彼此独立,互不相关。

I2C总线在传送数据过程中共有三种类型信号,它们分别是:开始信号、结束信号和应答信号。

开始信号:SCL为高电平时,SDA由高电平向低电平跳变,开始传送数据。

结束信号:SCL为低电平时,SDA由低电平向高电平跳变,结束传送数据。

应答信号:接收数据的IC在接收到8bit数据后,向发送数据的IC发出特定的低电平脉冲,表示已收到数据。

CPU向受控单元发出一个信号后,等待受控单元发出一个应答信号,CPU接收到应答信号后,根据实际情况作出是否继续传递信号的判断。

若未收到应答信号,由判断为受控单元出现故障。

目前有很多半导体集成电路上都集成了I2C接口。

*//********************************************************************** ******** (C) Copyright 2007,单片机初学者园地* All Rights reserved.***项目名称: 51单片机学习开发系统***本文件名称:IIC.c** 完成作者:单片机初学者* 当前版本: V1.0* 完成日期:* 描述:本程序结构简单、合理,有帮助于初学者养成良好的编* 程风格。

EEPROM读写实验

EEPROM读写实验

实验十、EEPROM读写实验
(一)、实验目的:
EEPROM是掉电后不丢失信息的一种数据存储器,适用于现场数据的采集和存储。

本实验给出了EEPROM记录单片机重启次数(包括上电复位重启和下载程序的过程中的复位重启),并将该次数显示在8位4联LED数码管上的例程程序。

目的是引导使用者掌握51单片机与IIC设备进行串行通讯的原理和使用方法。

(二)、实验接线和步骤:
1、将U13(上面的8位拨码开关)的“5”~“8”位打到“ON”位置,这是数码
管位码。

2、将U14(下面的8位拨码开关)的“1”~“8”位打到“ON”位置,这是数码
管段码。

3、将24C08处的两个三位跳线处,分别短接“P34”,“PC-34”跳线和“P35”,“PC-35”
跳线。

这是24C08的IIC总线的数据线和时钟线。

4、下载程序。

5、因为U17(USB旁的4位拨码开关)会对数码管显示产生影响,所以将U17的
“1”~“3”位断开。

6、按动复位键观察数码管显示数字。

(电源重启和下载复位也会增加单片机重启次
数)
说明:因程序例程篇幅过长,不方便以书面形式列出,为方便使用者,例程的原代码及工程文件所有文档均已附在电子文档“EEPROM读写实验”文件夹中。

使用者可在例程程序的基础上改变某些参数以观察不同的实验效果。

单片机EEPROM读写数据流程解析

单片机EEPROM读写数据流程解析

单片机EEPROM读写数据流程解析EEPROM 写数据流程第一步,首先是I2C 的起始信号,接着跟上首字节,也就是我们前边讲的I2C 的器件地址,并且在读写方向上选择“写”操作。

第二步,发送数据的存储地址。

24C02 一共256 个字节的存储空间,地址从0x00~0xFF,我们想把数据存储在哪个位置,此刻写的就是哪个地址。

第三步,发送要存储的数据第一个字节、第二个字节??注意在写数据的过程中,EEPROM 每个字节都会回应一个“应答位0”,来告诉我们写EEPROM 数据成功,如果没有回应答位,说明写入不成功。

在写数据的过程中,每成功写入一个字节,EEPROM 存储空间的地址就会自动加1,当加到0xFF 后,再写一个字节,地址会溢出又变成了0x00。

EEPROM 读数据流程第一步,首先是I2C 的起始信号,接着跟上首字节,也就是我们前边讲的I2C 的器件地址,并且在读写方向上选择“写”操作。

这个地方可能有同学会诧异,我们明明是读数据为何方向也要选“写”呢?刚才说过了,24C02 一共有256 个地址,我们选择写操作,是为了把所要读的数据的存储地址先写进去,告诉EEPROM 我们要读取哪个地址的数据。

这就如同我们打电话,先拨总机号码(EEPROM 器件地址),而后还要继续拨分机号码(数据地址),而拨分机号码这个动作,主机仍然是发送方,方向依然是“写”。

第二步,发送要读取的数据的地址,注意是地址而非存在EEPROM 中的数据,通知EEPROM 我要哪个分机的信息。

第三步,重新发送I2C 起始信号和器件地址,并且在方向位选择“读”操作。

这三步当中,每一个字节实际上都是在“写”,所以每一个字节EEPROM 都会回应一个“应答位0”。

第四步,读取从器件发回的数据,读一个字节,如果还想继续读下一个字节,就发送一个“应答位ACK(0)”,如果不想读了,告诉EEPROM,我不想要数据了,别再发数据了,那就发送一个“非应答位NAK(1)”。

25c04 读写例程

25c04 读写例程

25c04 读写例程
25C04是一种串行EEPROM(电可擦可编程只读存储器),其读写例程可以通过以下步骤来实现。

1. 初始化,首先,需要初始化串行EEPROM,这包括设置通信协议(如I2C或SPI)、设备地址和其他必要的参数。

2. 写入数据,要向25C04写入数据,首先需要将要写入的数据发送到串行EEPROM的特定寄存器中。

这通常涉及到发送写入命令,指定要写入的存储器地址,并将数据发送到该地址。

3. 等待写入完成,在写入数据后,需要等待串行EEPROM完成写入操作。

这通常涉及轮询串行EEPROM的状态寄存器,直到写入操作完成。

4. 读取数据,要从25C04读取数据,需要发送读取命令,并指定要读取的存储器地址。

串行EEPROM将返回存储器地址处的数据,然后可以将其读取到微控制器或其他设备中。

5. 结束通信,在完成读写操作后,需要结束与串行EEPROM的
通信,并释放相关的资源。

需要注意的是,25C04的具体读写例程可能会因使用的通信协议(如I2C或SPI)以及微控制器或处理器的不同而有所不同。

因此,在实际应用中,需要根据具体的硬件和软件平台编写相应的读写例程。

EEPROM读写程序的设计及说明(v1.1改进版)

EEPROM读写程序的设计及说明(v1.1改进版)

EEPROM读写程序的设计及说明一、I2C 总线概述I2C 总线是PHILIPS 公司推出的芯片间串行数据传输总线。

I2C 总线通过两根线(串行数据线SDA 和串行时钟线SCL)使挂接到总线上的器件相互进行信息传递,能够十分方便地地构成多机系统和外围器件扩展系统。

I2C 器件是把I2C 的协议植入器件的I/O 接口,使用时器件直接挂到I2C 总线上即可。

总线使用软件寻址来识别每个器件--微控制器、存储器、LCD、驱动器时钟芯片及其它I2C 总线器件,而无须使用片选信号,是否选中是由主器件发出的I2C 从地址决定的而I2C 器件的从地址是由I2C 总线委员会实行统一发配的。

总线上的每一次数据传送活动都是主控器先发送起始信号,然后主控器发送被控器的地址及读写位1个字节,这之后是主控器等待被控器的应答信号(接着的第九位),再接着就是主控器发送数据给被控器(写被控器)或接收被控器发出来的数据(读被控器),最后由主控器发出停止信号通知被控器结束整个数据传送过程。

I2C 总线的数据传送过程如下图所示。

I2C 总线协议规定传送的数据长度为8位,而每次传送的数据字节数由被控器所限制如24C01(128 字节EEPROM)规定一次最多可以传送8个字节,24C02(256字节EEPROM)规定一次最多可传送16个字节。

按照I2C总线协议,总线上非单片机类型的外围器件地址由器件编号地址(高4位D7~D4由器件类型决定)和器件引脚地址(D3~D1)组成,如24C01/02/03/04的器件编号地址为1010。

器件的引脚地址由A2A1A0三根硬件地址线决定,最后一位为读写控制位,1表示读,0表示写,如下图示。

二、程序框图三、EEPROM应用程序1、整体功能说明本程序利用NEC公司的9177芯片,用软件的模拟方法实现对EEPROM器件(如24C04)的读写操作。

2、变量说明EEDATA 所需读或写的EEPROM参数个数PARAADD EEPROM读写的地址变量EEWRDELAY 写EEPROM的延时时间计时变量3、标志说明_EEPRW 读写标志(0=EEPROM写,1=EEPROM读)_ACKERR EEPROM有无应答标志(1=无应答,0=有应答)_ERRORFG EEPROM出错标志(1=EEPROM出错,0=EEPROM无错)_PARAERR EEPROM参数错误(1=EEPROM参数出错,0=EEPROM参数无错)4、常量说明SLAW EQU 0A0H 表示EEPROM器件地址及EEPROM写SLAR EQU 0A1H 表示EEPROM器件地址及EEPROM读P_EESDA EQU P1.1 连接EEPROM数据线(SDA)的芯片管脚P_EESCL EQU P1.0 连接EEPROM 时钟线(SCL)的芯片管脚5、模块使用说明(1)本EEPROM读写模块可直接调用,在NEC9177调用方法为:CALL !EEPROMRW;(2)调用前需给以下几个参数进行赋值所需读写的EEPROM参数个数:EEDATA 例如:MOV EEDATA,#32所需读写的EEPROM参数初始地址:PARAADD 例如:MOV PARAADD,#0读写EEPROM数据所存放的地址:HL 例如:MOVW HL,#PARABUF程序要求为读或写EEPROM标志:_EEPRW 例如:SET1 _EEPRW6、应用范围此程序段可应用于NEC9177作为主芯片的电控中,其中外围的EEPROM器件应具有I2C总线的特性(如24C04),其他具有I2C特性的器件也可做参考。

eeprome读写程序(自己做实际项目已验证)

eeprome读写程序(自己做实际项目已验证)
}
//=============================================
//函数名称:向串口发送一个字符
//=============================================
void send_char_com(unsigned char ch)
{
SBUF=ch;
//=============================================
void Rest_WDG(void)
{
CS=0;
CS=1;
}
//=============================================
//函数名称:写数据到X5045__EEPROM
//=============================================
void Init_Com(void)
{
TMOD = 0x20; //定时器工作方式2,初值自动装入
PCON = 0x00; //波特率不增倍
SCON = 0x50; //串行工作方式设定
TH1 = 0xFd; //定时器初值高位
TL1 = 0xFd; //定时器初值低位
TR1 = 1; //启动定时器
void Write_X5045(uchar Writer_data)
{
unsigned char i;
for(i=0;i<8;i++)
{
SI=(bit)(Writer_data&0x80);
SCLK=0;
SCLK=1;
Writer_data<<=1;
}

EEPROM读写实例及说明

EEPROM读写实例及说明

;****************************************************************************
include "p16f877.inc"
ADDR EQU 20H ;写入地址寄存器
VALU EQU 21H ;写入值
REC_ EQU 22H ;读计数
WRC_ EQU 24H ;写计数
org 0
goto main
main
bcf STATUS,RP1
bcf STATUS,RP0 ;bank0
movlw 10h
movwf ADDR ;写入EEPROM初始值
movlw 90h
movwf VALU ;初始写入值
movlw 30h
movwf FSR ;间址,读出值初始存放地址
; EEPROM读写实例及说明
;****************************************************************************
; This is a program to test the function of reading&writting for EEPROM.
movlw 0Fh
movwf WRC_ ;写入次数
movwf REC_
;incf REC_ ;读出次数
wri_ ;写子程序
bsf STATUS,RP1
bsf STATUS,RP0 ;bank3
btfsc EECON1,WR
goto $-1
bcf STATUS,RP0
bcf STATUS,RP1 ;bank0

eeprom读写程序

eeprom读写程序
EECR |= (1 << EERE);
return EEDR;
}
//==========================================
//写数据到E2P中设定的地址空间中
//
//==========================================
void EEPROM_Write(unsigned int uiAddress, unsigned char ucData);
void WriteTestCounterToEEP(unsigned long XCounter,unsigned int EEPAdr);
unsigned long ReadTestCounter(unsigned char AddrH);
if(ReadData[1]!=EEPROM_Read2(EEPAdrH,0x0D))
EEPROM_Write(EEPAdr+0x0D, ReadData[1]);
if(ReadData[2]!=EEPROM_Read2(EEPAdrH,0x0E))
EEPROM_Write(EEPAdr+0x0E, ReadData[2]);
/********************************************************************/
//#include <io_define.h>
#include <iom64v.h>
//#include <macros.h>
//#include <card.h>
void EEPROM_Write(unsigned int uiAddress, unsigned char ucData)

eeprom读写项目课程设计

eeprom读写项目课程设计

eeprom读写项目课程设计一、教学目标本课程的教学目标是使学生掌握Eeprom的基本读写操作,培养学生动手实践能力和团队协作精神。

具体目标如下:知识目标:使学生了解Eeprom的定义、特点和应用场景;掌握Eeprom的基本读写方法和程序设计。

技能目标:培养学生能够独立完成Eeprom的读写项目,提高学生的动手实践能力;培养学生能够运用Eeprom技术解决实际问题的能力。

情感态度价值观目标:培养学生对新技术的敏感度和好奇心,激发学生对电子技术的热爱;培养学生团队协作、沟通交流的能力,提高学生综合素质。

二、教学内容根据课程目标,教学内容主要包括Eeprom的基本概念、读写方法和项目实践。

具体安排如下:第一课时:Eeprom概述,介绍Eeprom的定义、特点和应用场景。

第二课时:Eeprom的读写方法,讲解Eeprom的读写原理和编程方法。

第三课时:Eeprom项目实践,学生分组完成Eeprom的读写项目,培养学生的动手实践能力和团队协作精神。

三、教学方法本课程采用讲授法、讨论法和实验法相结合的教学方法,以激发学生的学习兴趣和主动性。

讲授法:用于讲解Eeprom的基本概念和读写方法,使学生掌握理论知识。

讨论法:引导学生针对实际案例进行讨论,培养学生运用Eeprom技术解决实际问题的能力。

实验法:学生进行Eeprom项目实践,培养学生动手实践能力和团队协作精神。

四、教学资源教学资源包括教材、参考书、多媒体资料和实验设备。

教材:选用权威、实用的教材,为学生提供理论知识的学习依据。

参考书:推荐学生阅读相关参考书籍,丰富学生的知识体系。

多媒体资料:制作精美的PPT、视频等多媒体资料,提高学生的学习兴趣。

实验设备:准备充足的实验设备,确保每个学生都能动手实践。

五、教学评估为了全面、公正地评估学生的学习成果,本课程采用以下评估方式:平时表现:通过观察学生在课堂上的参与程度、提问回答等情况,评估学生的学习态度和理解程度。

iap15w4k61s EEPRom 读写例程

iap15w4k61s EEPRom 读写例程

LCD_DATAPINS = com << 4; //发送低四位
Delay1ms();
//等待数据稳定
LCD_EA = 1; //写入时序
Delay1ms(); //保持时间
LCD_EA = 0;
}
#endif
/***************************************************************************** **
Delay1ms(); //保持时间 LCD_EA = 0; } #else void LCDWriteData(BYTE dat) { LCD_EA = 0; //使能清零 LCD_RS = 1; //选择写入数据 LCD_RW = 0; //选择写入
//写入数据
LCD_DATAPINS = dat; //由于4位的接线是接到P0口的高四位,所以传送高四位不用 改
switch(x) { case 1: LCDWriteCom(0x80+y); break; case 2: LCDWriteCom(0xC0+y); break; case 3: LCDWriteCom(0x94+y); break; case 4: LCDWriteCom(0xD4+y); break; }
LCD_RS = 0; //选择写入命令
LCD_RW = 0; //选择写入
LCD_DATAPINS = com; //由于4位的接线是接到P0口的高四位,所以传送高四位不用 改
Delay1ms();
//等待数据稳定
LCD_EA = 1; //写入时序
Delay2ms();
//保持时间
LCD_EA = 0;
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

学号:课程设计题目EEPROM器件读写例程设计学院计算机科学与技术专业计算机科学与技术班级姓名指导教师2012 年 6 月日课程设计任务书学生姓名:专业班级:指导教师:工作单位:题目: EEPROM器件读写例程设计初始条件:1.课程设计使用ZG211硬件综合实验平台(8051单片机),使用AT24C01接口芯片和辅助芯片以及器件;2.ZG211有程序设计集成开发环境,程序设计语言为C语言;3.ZG211硬件综合实验平台使用说明书;要求完成的主要任务:(包括课程设计工作量及技术要求,撰写说明书要求)1.学习使用ZG211硬件综合实验平台,程序设计集成开发环境;2.根据课程设计题目,进行需求分析,搞清楚课程设计需要设计需求和需要解决的设计内容。

3.查阅和学习课程设计题目需要的接口芯片资料,掌握I2C接口芯片的使用方法和编程要领。

查阅和学习课程设计题目需要的辅助芯片以及器件资料。

4.设计接口芯片和辅助芯片以及器件与8051单片机连接硬件电路原理图。

5.设计与硬件电路原理图对应的C语言程序(或8051汇编语言)。

给出程序流程图。

在集成开发环境中调试程序。

给出程序的详细注释。

能够解释使用程序模拟电路时序信号和数据。

6.撰写课程设计报告,1)详细陈述以上的设计过程;2)详细陈述电路调试过程。

时间安排:第17周:1.熟悉ZG211硬件综合实验平台,KEILC UVISION2集成开发环境;查阅接口芯片资料,熟悉接口芯片和它的使用方法。

2.设计硬件电路原理图,。

第18周:1.使用C语言或汇编语言设计和调试接口程序。

2.撰写计算机硬件综合设计报告。

指导教师签名:年月日系主任(或责任教师)签名:年月日目录1实验目的 (3)2实验设备 (3)3实验要求 (3)4实验原理 (3)5实验步骤 (7)5.1硬件连接 (7)5.2软件设计 (8)5.3编译下载 (9)6实验成功标志 (10)7源程序 (10)8调试过程 (15)8.1准备工作 (15)8.2程序调试 (16)8.3在线编程 (16)8.4运行 (18)9心得体会 (18)10参考文献 (19)EEPROM器件读写例程设计1.实验目的(1)掌握IO 口操作(2)掌握显示及键盘芯片的运用(3)掌握I2C 总线操作2.实验设备(1)PC 机一台;ZG-211 单片机系统实验板一块(2)实验连接线若干(3)并口编程线一根(4)串口通讯线一根(5)配套电源1 个(6)芯片:CH451,89S52,CD40523.实验要求1. 学习使用ZG211硬件综合实验平台,程序设计集成开发环境;2. 根据课程设计题目,进行需求分析,搞清楚课程设计需要设计需求和需要解决的设计内容。

3. 查阅和学习课程设计题目需要的接口芯片资料,掌握接口芯片的使用方法和编程要领。

查阅和学习课程设计题目需要的辅助芯片以及器件资料。

4. 设计接口芯片和辅助芯片以及器件与8051单片机连接硬件电路原理图。

5. 设计与硬件电路原理图对应的C语言程序(或8051汇编语言)。

给出程序流程图。

在集成开发环境中调试程序。

给出程序的详细注释。

能够解释使用程序模拟电路时序信号和数据。

6. 能正常操作 LED 数码显示;能通过中断方式接收按键信息;能正确读写 EEPROM 芯片4.实验原理单片机系统常用EEPROM芯片在掉电情况下保存一些重要数据。

本实验板采用的芯片是AT24C02,可存储256个字节,重复擦写1,000,000次,数据保存100年以上。

该芯片通过I2C总线接口进行操作。

管脚名称功能A0,A1,A2 器件地址选择SDA 串行数据/地址SCL 串行时钟WP 写保护VCC +1.8V~6.0V工作电压VSS 地I2C 总线用两条线(SDA 和SCL)在芯片和模块间传递信息。

SDA 为串行数据线,SCL为串行时钟线。

1.只有在总线空闲时才允许启动数据传送。

2.在数据传送过程中,当时钟线为高电平时,数据线必须保持稳定状态不允许。

有跳变时钟线为高电平时,数据线的任何电平变化将被看作总线的起始或停止信号。

图4-1:总线时序图4-2:写周期时序图4-3:起始/停止时序(1)器件寻址:主器件通过发送一个起始信号启动发送过程,然后发送它所要寻址的从器件的地址。

8位从器件地址的高4 位固定为1010。

接下来的3 位A2 A1 A0 为器件的地址位,用来定义哪个器件以及器件的哪个部分被主器件访问。

从器件8 位地址的最低位,作为读写控制位。

“1”表示对从器件进行读操作,“0”表示对从器件进行写操作。

在主器件发送起始信号和从器件地址字节后,PCF8563 监视总线并当其地址与发送的从地址相符时响应一个应答信号(通过SDA 线)。

PCF8563 再根据读写控制位(R/W)的状态进行读或写操作。

(2)应答信号I2C 总线数据传送时每成功地传送一个字节数据后,接收器都必须产生一个应答信号,应答的器件在第9 个时钟周期时将SDA 线拉低,表示其已收到一个8 位数据。

PCF8563 在接收到起始信号和从器件地址之后响应一个应答信号,如果器件已选择了写操作,则在每接收一个8 位字节之后响应一个应答信号。

当PCF8563 工作于读模式时,在发送一个8 位数据后释放SDA 线并监视一个应答信号,一旦接收到应答信号,PCF8563 继续发送数据,如主器件没有发送应答信号,器件停止传送数据并,等待一个停止信号主器件。

(3)写操作在字节写模式下,主器件发送起始命令和从器件地址信息(R/W 位置零)给从器件,在从器件产生应答信号后,主器件发送PCF8563 的字节地址,主器件在收到从器件的另一个应答信号后,再发送数据到被寻址的存储单元。

PCF8563 再次应答,并在主器件产生停止信号后开始内部数据的擦写,在内部擦写过程中PCF8563 不再应答主器件的任何请求。

(4)应答查询可以利用内部写周期时禁止数据输入这一特性,一旦主器件发送停止位指示主器件操作结束时,PCF8563 启动内部写周期,应答查询立即启动,包括发送一个起始信号和进行写操作的从器件地址。

如果PCF8563 正在进行内部写操作,不会发送应答信号。

如果PCF8563已经完成了内部自写周期,将发送一个应答信号,主器件可以继续进行下一次读写操作。

(5)写保护写保护操作特性可使用户避免由于不当操作而造成对存储区域内部数据的改写,当WP管脚接高时整个寄存器区全部被保护起来而变为只可读取。

(6)读操作PCF8563读操作的初始化方式和写操作时一样,仅把(R/W)位置为1,有三种不同的读操作方式:立即地址读、选择读和连续读。

5.实验步骤5.1 硬件连接1、将并口线插在实验板与PC 机的并口插座上;2、按图5-1连接实验线路3、CH451 与CPU 连接实验线路见图5-24、仔细检查无误后,接通电源。

图5-1连接实验线路CPU 89S52CH451 J5_89S52P34P15P33P32J23_CH451LOADDCLKDINDOUT图5-2 CH451 与CPU 连接实验线路图5-3实际接线图5.2 软件设计安装KEILC开发环境,然后进入KEILC 开发环境。

首先根据I2C 协议内容,编写I2C 函数,由于AT24C02的I2C 接口最大频率是400KHZ,所以在程序中对一个IO 口操作完后,请延时2.5us(实验板上CPU 晶振为11.0592MHZ,一个指令周期为1.08us)。

写好I2C 读写函数后,可以对AT24C02进行操作。

AT24C02 的写从地址为0XA0,写时WP 要置0(打开写保护),写完后置为1;读从地址为0XA1。

先将CD4052 的通道选为2,连接CPU 与AT24C02。

向AT24C02 中地址为0X00 到0X07 的单元,写入数据0X00,0X01, 0X02, 0X03, 0X04, 0X05, 0X06, 0X07 后,再从AT24C02 中读出,进行比较。

如果一致则显示1,错误则显示0。

5.3编译下载程序编译成功后,打开联机下载软件,将HEX文件下载到89S52中,观看程序运行结果。

如有问题则修改程序,再次下载。

在线编译软件的运行界面如下图:调试成功后,将I2C 读写程序、AT24C02 读写程序,写成函数,以供其他模块调用。

6 实验成功标志(1)按下1 号按键,显示“001”,同时向AT24C02 中指定位置写入数据。

(2)按下2 号按键,从AT24C02 中指定位置读出数据并显示,应与写入数据一致。

7 源程序(1)【Main.c】函数:#include <intrins.h>#include "reg52.h"#include "def.h"#include "sub.h"#include "beep.h"#include "func.h"#include "display.h"#include "eeprom.h"unsigned char key_data = 0;main(){unsigned char eep_temp[2];unsigned char temp = 0;InitMCU(); //MCU初始化set_8255();speak_on(); //开蜂鸣器,表示开始工作delay_1ms(50);speak_off();Display_TEST();eep_temp[0] = 0x01; //测试值这是自己可以输入的测试数值while(1){if(key_data!=0) //若有键按下{temp = key_data;key_data = 0;switch(temp){case 0x40: //按下1键将测试值写入EEPROMAT24C02Write(eep_temp, 0, 1);display_int((int)(eep_temp[0]));break;case 0x49: //按下2捡键向指定位置读出数据AT24C02Read(eep_temp, 0, 1);display_int((int)(eep_temp[0]));break;default:break;}}}}(2)【Display.c】//显示函数#include "reg52.h"#include "def.h"#include "display.h"#include "sub.h"#include "func.h"extern unsigned char key_print;extern unsigned char key_data;// 函数功能向CH451芯片发送命令void send_disp_data(unsigned char comm, unsigned char _data){unsigned char i;for(i=0;i<8;i++) //送BIT数据{DIN = (_data>>i)&0x01;DCLK = 1;DCLK = 0;DCLK = 1;}for(i=0;i<4;i++) //送BIT命令{DIN = (comm>>i)&0x01;DCLK = 1;DCLK = 0;DCLK = 1;}LOAD=1;LOAD=0;LOAD=1;}|//函数功能向CH451芯片发送命令void send_comm(unsigned char comm){unsigned char i;for(i=0;i<4;i++) //送BIT命令{DIN = (comm>>i)&0x01;DCLK = 1;DCLK = 0;DCLK = 1;}LOAD=1;LOAD=0;LOAD=1;}//函数功能向CH451芯片发送初始化命令|void disp_initialize(){chang_4052(1);DIN=0;DIN=1;DCLK=1;LOAD=1;DOUT=1;send_disp_data( CH451_SETSYS, 0x03); //设定系统参数send_disp_data( CH451_SETDIS, 0x80); //设定显示参数}//函数功能中断函数,获取当前按键状态void key() interrupt 0{unsigned char i,temp;EX0 = 0; //关中断key_data = 0;temp = 0;send_comm(CH451_KEY);for(i=0; i<7; i++){temp = DOUT;key_data = key_data|(temp<<(6-i));DCLK=1;DCLK=0;DCLK=1;}/* key_print = key_data;send_disp_data(CH451_LOAD0, 0x10);send_disp_data(CH451_LOAD1, 0x10);send_disp_data(CH451_LOAD2, key_data/10);send_disp_data(CH451_LOAD3, key_data%10); */EX0 = 1; //中断}//函数功能测试显示LED数码管void Display_TEST(){disp_initialize(); //初始化显示芯片delay_1ms(100); //延时//送显“”send_disp_data( CH451_LOAD0, 0x01);send_disp_data( CH451_LOAD1, 0x02);send_disp_data( CH451_LOAD2, 0x03);send_disp_data( CH451_LOAD3, 0x04);send_disp_data( CH451_LOAD4, 0x05);send_disp_data( CH451_LOAD5, 0x06);send_disp_data( CH451_LOAD6, 0x07);send_disp_data( CH451_LOAD7, 0x08);delay_1ms(200);delay_1ms(200);//开中断,接受按键信息EX0=1;//"--------"send_disp_data( CH451_LOAD0, 0x12);send_disp_data( CH451_LOAD1, 0x12);send_disp_data( CH451_LOAD2, 0x12);send_disp_data( CH451_LOAD3, 0x12);send_disp_data( CH451_LOAD4, 0x12);send_disp_data( CH451_LOAD5, 0x12);send_disp_data( CH451_LOAD6, 0x12);send_disp_data( CH451_LOAD7, 0x12);}//函数功能显示一个整数void display_int(unsigned int m){send_disp_data( CH451_LOAD0, 0x10);send_disp_data( CH451_LOAD1, 0x10);send_disp_data( CH451_LOAD2, 0x10);if (m/10000){send_disp_data( CH451_LOAD3, m/10000);}else{send_disp_data( CH451_LOAD3, 0x10);}if ((!(m/1000)%10)&&(!(m/10000))){send_disp_data( CH451_LOAD4, 0x10);}else{send_disp_data( CH451_LOAD4, (m/1000)%10);}send_disp_data( CH451_LOAD5, (m/100)%10);send_disp_data( CH451_LOAD6, (m/10)%10);send_disp_data( CH451_LOAD7, m%10);}(3)【EEPROM.C】#include<absacc.h>#include "reg52.h"#include "def.h"//MCU初始化void InitMCU(){TMOD = 0x21;TCON = 0x00;PCON = 0x80;SCON = 0x50;IE = 0x90;}// 毫秒级延时void delay_1ms(unsigned int _1ms){unsigned char i,j;for(; _1ms>0; _1ms--){for(i=0; i<10; i++){for(j=0; j<30; j++);}}}//选择4052的通道void chang_4052(unsigned char i) {switch(i){case 0:EXA=0;EXB=0;break;case 1:EXA=1;EXB=0;break;case 2:EXA=0;EXB=1;break;case 3:EXA=1;EXB=1;break;default:EXA=0;EXB=0;break;}}void set_8255(){delay_1ms(1000);COMM8255 = 0x82;PA8255 = 0x80;PC8255 = 0xfc;}8.调试过程8.1准备工作进行程序调试时应事先检查:电源指示灯是否正常工作;蜂鸣器是否正常工作;键盘是否正常工作;LCD 显示模块是否正常工作。

相关文档
最新文档