手把手教会你24C02.docx
- 文档编号:11178542
- 上传时间:2023-05-29
- 格式:DOCX
- 页数:23
- 大小:19.96KB
手把手教会你24C02.docx
《手把手教会你24C02.docx》由会员分享,可在线阅读,更多相关《手把手教会你24C02.docx(23页珍藏版)》请在冰点文库上搜索。
手把手教会你24C02
简易教程
第一课
24c02是一个非挥发eeprom存储器器件,采用的IIC总线技术。
24c02在许多试验中都有出现。
24c02的应用,主要在存储一些掉电后还要保存数据的场合,在上次运行时,保存的数据,在下一次运行时还能够调出。
24c02采用的IIC总线,是一种2线总线,我们在试验中用IO来模拟这种总线,至于总线的时序和原理,请参考相关资料。
如果您不想研究,也没有关系,我们在程序中已经为你写好了,现在和今后您都可以只调用就是,不必花时间和精力去研究。
一块24c02中有256个字节的存储空间。
我们将24c02的两条总线接在了P26和P27上,因此,必须先定义:
sbitSCL=P2^7;
sbitSDA=P2^6;
在这个试验中,我们写入了一个字节数值0x88到24c02的0x02的位置。
写入完成后,P10灯会亮起,我们再在下一颗来读出这个字节来验证结果。
―――――――――――――
#defineucharunsignedchar//定义一下方便使用
#defineuintunsignedint
#defineulongunsignedlong
#include
//本课试验写入一个字节到24c02中
charcodedx516[3]_at_0x003b;//这是为了仿真设置的
#defineWriteDeviceAddress0xa0//定义器件在IIC总线中的地址
#defineReadDviceAddress0xa1
sbitSCL=P2^7;
sbitSDA=P2^6;
sbitP10=P1^0;
//定时函数
voidDelayMs(uintnumber)
{
uchartemp;
for(;number!
=0;number--)
{
for(temp=112;temp!
=0;temp--);
}
}
//开始总线
voidStart()
{
SDA=1;
SCL=1;
SDA=0;
SCL=0;
}
//结束总线
voidStop()
{
SCL=0;
SDA=0;
SCL=1;
SDA=1;
}
//测试ACK
bitTestAck()
{
bitErrorBit;
SDA=1;
SCL=1;
ErrorBit=SDA;
SCL=0;
return(ErrorBit);
}
//写入8个bit到24c02
Write8Bit(ucharinput)
{
uchartemp;
for(temp=8;temp!
=0;temp--)
{
SDA=(bit)(input&0x80);
SCL=1;
SCL=0;
input=input<<1;
}
}
//写入一个字节到24c02中
voidWrite24c02(ucharch,ucharaddress)
{
Start();
Write8Bit(WriteDeviceAddress);
TestAck();
Write8Bit(address);
TestAck();
Write8Bit(ch);
TestAck();
Stop();
DelayMs(10);
}
//本课试验写入一个字节到24c02中
voidmain(void)//主程序
{
Write24c02(0x88,0x02);//将0x88写入到24c02的第2个地址空间
P10=0;//指示运行完毕
while
(1);//程序挂起
}
―――――――――――――――――
tiankai(2010-2-0423:
16:
19)
【手把手教会24C02】
第二课
本课的程序已经包含了上一颗的内容,增加了读24c02的函数,请看程序:
―――――――――――――――――――――――――――――
#defineucharunsignedchar//定义一下方便使用
#defineuint unsignedint
#defineulongunsignedlong
#include
charcodedx516[3]_at_0x003b;//这是为了仿真设置的
#defineWriteDeviceAddress0xa0 //定义器件在IIC总线中的地址
#defineReadDviceAddress0xa1
sbitSCL=P2^7;
sbitSDA=P2^6;
sbit P10=P1^0;
//定时函数
voidDelayMs(unsignedintnumber)
{
unsignedchartemp;
for(;number!
=0;number--)
{
for(temp=112;temp!
=0;temp--);
}
}
//开始总线
voidStart()
{
SDA=1;
SCL=1;
SDA=0;
SCL=0;
}
//结束总线
voidStop()
{
SCL=0;
SDA=0;
SCL=1;
SDA=1;
}
//发ACK0
voidNoAck()
{
SDA=1;
SCL=1;
SCL=0;
}
//测试ACK
bitTestAck()
{
bitErrorBit;
SDA=1;
SCL=1;
ErrorBit=SDA;
SCL=0;
return(ErrorBit);
}
//写入8个bit到24c02
Write8Bit(unsignedcharinput)
{
unsignedchartemp;
for(temp=8;temp!
=0;temp--)
{
SDA=(bit)(input&0x80);
SCL=1;
SCL=0;
input=input<<1;
}
}
//写入一个字节到24c02中
voidWrite24c02(ucharch,ucharaddress)
{
Start();
Write8Bit(WriteDeviceAddress);
TestAck();
Write8Bit(address);
TestAck();
Write8Bit(ch);
TestAck();
Stop();
DelayMs(10);
}
//从24c02中读出8个bit
ucharRead8Bit()
{
unsignedchartemp,rbyte=0;
for(temp=8;temp!
=0;temp--)
{
SCL=1;
rbyte=rbyte<<1;
rbyte=rbyte|((unsignedchar)(SDA))
SCL=0;
}
return(rbyte);
}
//从24c02中读出1个字节
ucharRead24c02(ucharaddress)
{
ucharch;
Start();
Write8Bit(WriteDeviceAddress);
TestAck();
Write8Bit(address);
TestAck();
Start();
Write8Bit(ReadDviceAddress);
TestAck();
ch=Read8Bit();
NoAck();
Stop();
return(ch);
}
//本课试验写入一个字节到24c02并读出来
voidmain(void)//主程序
{
ucharc1,c2;
c1=Read24c02(0x02);
Write24c02(0x99,0x03);
c2=Read24c02(0x03);
P10=0;
while
(1); //程序挂起
}
――――――――――――――――
在主程序中,我们将上一课写入的0x02位置的数据读出来放在c1中,新写了一个数
据0x99在0x03位置中,并立即将它读出来放在c2中。
tiankai(2010-2-0423:
16:
39)
【手把手教会24C02】
第三课
#defineucharunsignedchar//定义一下方便使用
#defineuint unsignedint
#defineulongunsignedlong
#include
charcodedx516[3]_at_0x003b;//这是为了仿真设置的
#defineWriteDeviceAddress0xa0 //定义器件在IIC总线中的地址
#defineReadDviceAddress0xa1
sbitSCL=P2^7;
sbitSDA=P2^6;
sbit P10=P1^0;
sbitK1=P3^2;
//定时函数
voidDelayMs(unsignedintnumber)
{
unsignedchartemp;
for(;number!
=0;number--)
{
for(temp=112;temp!
=0;temp--);
}
}
//开始总线
voidStart()
{
SDA=1;
SCL=1;
SDA=0;
SCL=0;
}
//结束总线
voidStop()
{
SCL=0;
SDA=0;
SCL=1;
SDA=1;
}
//发ACK0
voidNoAck()
{
SDA=1;
SCL=1;
SCL=0;
}
//测试ACK
bitTestAck()
{
bitErrorBit;
SDA=1;
SCL=1;
ErrorBit=SDA;
SCL=0;
return(ErrorBit);
}
//写入8个bit到24c02
Write8Bit(unsignedcharinput)
{
unsignedchartemp;
for(temp=8;temp!
=0;temp--)
{
SDA=(bit)(input&0x80);
SCL=1;
SCL=0;
input=input<<1;
}
}
//写入一个字节到24c02中
voidWrite24c02(ucharch,ucharaddress)
{
Start();
Write8Bit(WriteDeviceAddress);
TestAck();
Write8Bit(address);
TestAck();
Write8Bit(ch);
TestAck();
Stop();
DelayMs(10);
}
//从24c02中读出8个bit
ucharRead8Bit()
{
unsignedchartemp,rbyte=0;
for(temp=8;temp!
=0;temp--)
{
SCL=1;
rbyte=rbyte<<1;
rbyte=rbyte|((unsignedchar)(SDA));
SCL=0;
}
return(rbyte);
}
//从24c02中读出1个字节
ucharRead24c02(ucharaddress)
{
ucharch;
Start();
Write8Bit(WriteDeviceAddress);
TestAck();
Write8Bit(address);
TestAck();
Start();
Write8Bit(ReadDviceAddress);
TestAck();
ch=Read8Bit();
NoAck();
Stop();
return(ch);
}
//写入按键次数到24c02,并读出来显示在4个LED上
voidmain(void)//主程序
{
ucharc1,c2;
while
(1)
{
c1=Read24c02(0x01); //读出24c02第一个地址数据
P1=c1; //显示在P1口的4个LED上
if(!
K1) //按键处理
{
c1++; //值加1
Write24c02(c1,0x01);//重新写入24c02
while(!
K1); //等待按键松开
for(c2=0;c2<250;c2++);//松开按键去抖
}
}
}
tiankai(2010-2-0423:
16:
59)
【手把手教会24C02】
第四课
前面我们只学习过写入一个字节到24c02中。
在这一课中,我们将一首乐谱全部写入
到24c02中。
在下一课时,我们将会读出24c02中的乐谱播放。
这种工作方式,可以比作一个简单的mp3,将乐曲写在可以重复写入的存储器中,播
放时,读出来再播放。
这样,只要换一个存有新的音乐的存储器,或者从外部将新的乐曲写
入到存储器中,就可以播放新的乐曲,而单片机的程序并没有改变。
――――――――――――――――――――――――――――
#defineucharunsignedchar//定义一下方便使用
#defineuint unsignedint
#defineulongunsignedlong
#include
//本课试验写入一个字节到24c02中
charcodedx516[3]_at_0x003b;//这是为了仿真设置的
#defineWriteDeviceAddress0xa0 //定义器件在IIC总线中的地址
#defineReadDviceAddress0xa1
sbitSCL=P2^7;
sbitSDA=P2^6;
sbit P10=P1^0;
//定时函数
voidDelayMs(uintnumber)
{
uchartemp;
for(;number!
=0;number--)
{
for(temp=112;temp!
=0;temp--);
}
}
//开始总线
voidStart()
{
SDA=1;
SCL=1;
SDA=0;
SCL=0;
}
//结束总线
voidStop()
{
SCL=0;
SDA=0;
SCL=1;
SDA=1;
}
//测试ACK
bitTestAck()
{
bitErrorBit;
SDA=1;
SCL=1;
ErrorBit=SDA;
SCL=0;
return(ErrorBit);
}
//写入8个bit到24c02
Write8Bit(ucharinput)
{
uchartemp;
for(temp=8;temp!
=0;temp--)
{
SDA=(bit)(input&0x80);
SCL=1;
SCL=0;
input=input<<1;
}
}
//写入一个字节到24c02中
voidWrite24c02(ucharch,ucharaddress)
{
Start();
Write8Bit(WriteDeviceAddress);
TestAck();
Write8Bit(address);
TestAck();
Write8Bit(ch);
TestAck();
Stop();
DelayMs(10);
}
//老鼠爱大米
ucharcodedami[]={
"321-|3.2_1-|3231|3_6.5-|3_5_665|65-3_2_|122_3_2|12--|"
};
//本课试验写老鼠爱大米的乐谱到24c02中
voidmain(void)//主程序
{
uchari;
for(i=0;dami!
=0;i++)
{
Write24c02(dami,i);// 逐个写入到24c02的中
}
Write24c02(0x00,i);//写入最后一个0
P10=0;//指示运行完毕
while
(1); //程序挂起
}
――――――――――――――――――――――――
通过一个for循环,我们就把乐谱全部写入到了24c02中。
看到for循环的条件是
dami!
=0,这是因为字符串的最后一个字符是0,可以作为结束的判断,这个方法在前面
的音乐播放等例子中已经见到。
tiankai(2010-2-0423:
17:
17)
【手把手教会24C02】
第五课
这一课,我们学会从24C02中读出音乐,并实现单片机播放音乐。
main.c
―――――――――――――――――――――――
#defineucharunsignedchar//定义一下方便使用
#defineuint unsignedint
#defineulongunsignedlong
#include
externucharRead24c02(ucharaddress);//声明外部的读24c02函数
externvoidplay(uchar*songdata); //声明外部的音乐播放函数
charcodedx516[3]_at_0x003b;//这是为了仿真设置的
sbit P10=P1^0;
sbitK1=P3^2;
sbitK2=P3^5;
sbitK3=P2^4;
sbitK4=P2^5;
//从24c02中读出音乐来并播放音乐
voidmain(void)//主程序
{
uchari;
ucharxdatayinyue[256];//设立一个缓冲区
TMOD=0x01; //使用定时器0的16位工作模式
TR0=0;
ET0=1; //定时器0中断
EA=1; //打开总中断
for(i=0;yinyue!
=0;i++)//读出音乐来放到缓冲中
{
yinyue=Read24c02(i);
}
yinyue=0;
while
(1)
{
play(yinyue);//播放音乐
}
}
――――――――――――――――――――――――――
24c02.c
―――――――――――――――――――――――
#defineucharunsignedchar//定义一下方便使用
#defineuint unsignedint
#defineulongunsignedlong
#include
#defineWriteDeviceAddress0xa0 //定义器件在IIC总线中的地址
#defineReadDviceAddress0xa1
sbitSCL=P2^7;
sbitSDA=P2^6;
sbit P10=P1^0;
/*
//定时函数
voidDelayMs(unsignedintnumber)
{
unsignedchartemp;
for(;number!
=0;number--)
{
for(temp=112;temp!
=0;temp--);
}
}
*/
//开始总线
voidStart()
{
SDA=1;
SCL=1;
SDA=0;
SCL=0;
}
//结束总线
voidStop()
{
SCL=0;
SDA=0;
SCL=1;
SDA=1;
}
//发ACK0
voidNoAck()
{
SDA=1;
SCL=1;
SCL=0;
}
//测试ACK
bitTestAck()
{
bitErrorBit;
SDA=1;
SCL=1;
ErrorBit=SDA;
SCL=0;
return(ErrorBit);
}
//写入8个bit到24c02
Write8Bit(unsignedcharinput)
{
unsignedchartemp;
for(temp=8;temp!
=0;temp--)
{
SDA=(bit)(input&0x80);
SCL=1;
SCL=0;
input=input<<1;
}
}
/*
//写入一个字节到24c02中
voidWrite24c02(ucharch,ucharaddress)
{
Start();
Write8Bit(WriteDeviceAddress);
TestAck();
Write8Bit(ad
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 手把手 教会 24 C02