【手把手教会24C02】第一课24c02 是一个非挥发eeprom 存储器器件,采用的IIC 总线技术。
24c02 在许多试验中都有出现。
24c02 的应用,主要在存储一些掉电后还要保存数据的场合,在上次运行时,保存的数据,在下一次运行时还能够调出。
24c02 采用的IIC 总线,是一种2 线总线,我们在试验中用IO来模拟这种总线,至于总线的时序和原理,请参考相关资料。
如果您不想研究,也没有关系,我们在程序中已经为你写好了,现在和今后您都可以只调用就是,不必花时间和精力去研究。
一块24c02 中有256 个字节的存储空间。
我们将24c02 的两条总线接在了P26 和P27 上,因此,必须先定义:sbit SCL=P2^7;sbit SDA=P2^6;在这个试验中,我们写入了一个字节数值0x88 到24c02 的0x02 的位置。
写入完成后,P10 灯会亮起,我们再在下一颗来读出这个字节来验证结果。
―――――――――――――#define uchar unsigned char //定义一下方便使用#define uint unsigned int#define ulong unsigned long#include <reg52.h> //包括一个52 标准内核的头文件//本课试验写入一个字节到24c02 中char code dx516[3] _at_ 0x003b;//这是为了仿真设置的#define WriteDeviceAddress 0xa0 //定义器件在IIC 总线中的地址#define ReadDviceAddress 0xa1sbit SCL=P2^7;sbit SDA=P2^6;sbit P10=P1^0;//定时函数void DelayMs(uint number){uchar temp;for(;number!=0;number--){for(temp=112;temp!=0;temp--) ; }}//开始总线void Start(){SDA=1;SCL=1;SDA=0;SCL=0;}//结束总线void Stop(){SCL=0;SDA=0;SCL=1;SDA=1;}//测试ACKbit TestAck(){bit ErrorBit;SDA=1;SCL=1;ErrorBit=SDA;SCL=0;return(ErrorBit);}//写入8 个bit 到24c02Write8Bit(uchar input){uchar temp;for(temp=8;temp!=0;temp--){SDA=(bit)(input&0x80);SCL=1;SCL=0;input=input<<1;}}//写入一个字节到24c02 中void Write24c02(uchar ch,uchar address) {Start();Write8Bit(WriteDeviceAddress); TestAck();Write8Bit(address);TestAck();Write8Bit(ch);TestAck();Stop();DelayMs(10);}//本课试验写入一个字节到24c02 中void main(void) // 主程序{Write24c02(0x88,0x02);// 将0x88 写入到24c02 的第2 个地址空间P10=0; //指示运行完毕while(1); //程序挂起}―――――――――――――――――tiankai (2010-2-04 23:16:19)【手把手教会24C02】第二课本课的程序已经包含了上一颗的内容,增加了读24c02 的函数,请看程序:―――――――――――――――――――――――――――――#define uchar unsigned char //定义一下方便使用#define uint unsigned int#define ulong unsigned long#include <reg52.h> //包括一个52 标准内核的头文件char code dx516[3] _at_ 0x003b;//这是为了仿真设置的#define WriteDeviceAddress 0xa0 //定义器件在IIC 总线中的地址#define ReadDviceAddress 0xa1sbit SCL=P2^7;sbit SDA=P2^6;sbit P10=P1^0;//定时函数void DelayMs(unsigned int number){unsigned char temp;for(;number!=0;number--){for(temp=112;temp!=0;temp--) ; }}//开始总线void Start(){SDA=1;SCL=1;SDA=0;SCL=0;}//结束总线void Stop(){SCL=0;SDA=0;SCL=1;SDA=1;}//发ACK0void NoAck(){SDA=1;SCL=1;SCL=0;}//测试ACKbit TestAck(){bit ErrorBit;SDA=1;SCL=1;ErrorBit=SDA;return(ErrorBit);}//写入8 个bit 到24c02Write8Bit(unsigned char input){unsigned char temp;for(temp=8;temp!=0;temp--){SDA=(bit)(input&0x80);SCL=1;SCL=0;input=input<<1;}}//写入一个字节到24c02 中void Write24c02(uchar ch,uchar address) {Start();Write8Bit(WriteDeviceAddress);TestAck();Write8Bit(address);TestAck();Write8Bit(ch);TestAck();Stop();DelayMs(10);}//从24c02 中读出8 个bituchar Read8Bit(){unsigned char temp,rbyte=0;for(temp=8;temp!=0;temp--){rbyte=rbyte<<1;rbyte=rbyte|((unsigned char)(SDA)) SCL=0;}return(rbyte);}//从24c02 中读出1 个字节uchar Read24c02(uchar address) {uchar ch;Start();Write8Bit(WriteDeviceAddress); TestAck();Write8Bit(address);TestAck();Start();Write8Bit(ReadDviceAddress); TestAck();ch=Read8Bit();NoAck();Stop();return(ch);}//本课试验写入一个字节到24c02 并读出来void main(void) // 主程序{uchar c1,c2;c1=Read24c02(0x02);Write24c02(0x99,0x03);c2=Read24c02(0x03);P10=0;while(1); //程序挂起}――――――――――――――――在主程序中,我们将上一课写入的0x02 位置的数据读出来放在c1 中,新写了一个数据0x99 在0x03 位置中,并立即将它读出来放在c2 中。
tiankai (2010-2-04 23:16:39)【手把手教会24C02】第三课#define uchar unsigned char //定义一下方便使用#define uint unsigned int#define ulong unsigned long#include <reg52.h> //包括一个52 标准内核的头文件char code dx516[3] _at_ 0x003b;//这是为了仿真设置的#define WriteDeviceAddress 0xa0 //定义器件在IIC 总线中的地址#define ReadDviceAddress 0xa1sbit SCL=P2^7;sbit SDA=P2^6;sbit P10=P1^0;sbit K1=P3^2;//定时函数void DelayMs(unsigned int number){unsigned char temp;for(;number!=0;number--){for(temp=112;temp!=0;temp--) ;}}//开始总线void Start(){SDA=1;SCL=1;SDA=0;SCL=0;}//结束总线void Stop(){SCL=0;SDA=0;SCL=1;SDA=1;}//发ACK0void NoAck(){SDA=1;SCL=1;SCL=0;}//测试ACKbit TestAck(){bit ErrorBit;SDA=1;SCL=1;ErrorBit=SDA;SCL=0;return(ErrorBit);}//写入8 个bit 到24c02Write8Bit(unsigned char input) {unsigned char temp;for(temp=8;temp!=0;temp--){SDA=(bit)(input&0x80);SCL=1;SCL=0;input=input<<1;}}//写入一个字节到24c02 中void Write24c02(uchar ch,uchar address) {Start();Write8Bit(WriteDeviceAddress);TestAck();Write8Bit(address);TestAck();Write8Bit(ch);TestAck();Stop();DelayMs(10);}//从24c02 中读出8 个bituchar Read8Bit(){unsigned char temp,rbyte=0;for(temp=8;temp!=0;temp--){SCL=1;rbyte=rbyte<<1;rbyte=rbyte|((unsigned char)(SDA));SCL=0;}return(rbyte);}//从24c02 中读出1 个字节uchar Read24c02(uchar address){uchar ch;Start();Write8Bit(WriteDeviceAddress);TestAck();Write8Bit(address);TestAck();Start();Write8Bit(ReadDviceAddress);TestAck();ch=Read8Bit();NoAck();Stop();return(ch);}//写入按键次数到24c02,并读出来显示在4 个LED上void main(void) // 主程序{uchar c1,c2;while(1){c1=Read24c02(0x01); //读出24c02 第一个地址数据 P1=c1; //显示在P1 口的4 个LED上if(!K1) //按键处理{c1++; //值加1Write24c02(c1,0x01); //重新写入24c02while(!K1); //等待按键松开for(c2=0;c2<250;c2++); //松开按键去抖}}}tiankai (2010-2-04 23:16:59)【手把手教会24C02】第四课前面我们只学习过写入一个字节到24c02 中。