最好的24C02储存开机次数实验 读写程序.docx
- 文档编号:7502439
- 上传时间:2023-01-24
- 格式:DOCX
- 页数:8
- 大小:165.53KB
最好的24C02储存开机次数实验 读写程序.docx
《最好的24C02储存开机次数实验 读写程序.docx》由会员分享,可在线阅读,更多相关《最好的24C02储存开机次数实验 读写程序.docx(8页珍藏版)》请在冰豆网上搜索。
最好的24C02储存开机次数实验读写程序
24C02储存开机次数实验
24C02是2K字节的串行EEPROM,内部含有256个8位字节,该器件通过总线操作,并有专门的写保护功能。
串行EEPROM简称I2C总线式串行器件。
串行器件不仅占用很少的资源和I/O线,而且体积大大缩小,同时具有工作电源宽、抗干扰能力强、功耗低、数据不易丢失和支持在线编程等特点。
I2C总线是一种用于IC器件之间连接的二线制总线。
它通过SDA(串行数据线)及SCL(串行时钟线)两根线在连到总线上的器件之间传送信息,并根据地址识别每个器件:
不管是单片机、存储器、LCD驱动器还是键盘接口。
我们通过一个实验来了解24C02的读写操作过程:
该实验功能是单片机复位一次,自动从24C02中读取数据,然后加1,最终数码管中的数据就是开机的次数,具有一定的实用意义。
相关原理:
程序运行的照片:
接线方法:
1、接8位数码管的数据线。
将数码管部份的数据口JP5接到CPU部份的P0口JP51.
2、接8位数码管的显示位线。
将数码管部份的显示位口JP8接到CPU部份的P2口JP52.
3、用一根2PIN数据线一端插入CPU部份JP53(P3口)的P3.6,P3.7另外一端插入24C02部份的控制端JP38。
烧写后用手按复位键可以看到数码管每按一下加一。
程序流程图:
汇编语言参考程序:
SDA24EQUP3.7
SCLK24EQUP3.6
ORG0000H
AJMPMAIN
ORG0080H
MAIN:
CLRP3.7;打开写保护
MOVDPTR,#TAB
MOVA,#00H;读地址
LCALLRD24
CJNEA,#10,TT
TT:
JNCTT1
AJMPTT2
TT1:
MOVA,#00
TT2:
MOV30H,A
MOVCA,@A+DPTR
CLRP2.6;开数码管
MOVP0,A;送显示
MOVA,30H
INCA
MOVB,A
MOVA,#00H
LCALLWT24
AJMP$
TAB:
DB28H,7EH,0A2H,62H,74H,61H,21H,7AH,20H,60H
RD24:
PUSHACC;读24C02子程序。
SETBSDA24
CLRSCLK24
CALLSTART24;启动
MOVA,#0A0H
CALLSHIFT8;移位
CALLACK;响应
POPACC
CALLSHIFT8
CALLACK
CALLSTART24
MOVA,#0A1H
CALLSHIFT8
CALLACK
SETBSDA24
MOVR7,#8
CLRA
SETBSDA24
RD000:
RLA;8个位
SETBSCLK24
MOVC,SDA24
MOVACC.0,C
CLRSCLK24
DJNZR7,RD000
RET
;-------------------------------
;写入24C02程序:
WT24:
PUSHACC
SETBSDA24
CLRSCLK24
CALLSTART24
MOVA,#0A0H
CALLSHIFT8
CALLACK
POPACC
CALLSHIFT8
CALLACK
MOVA,B
CALLSHIFT8
CALLACK
CALLSTOP
CALLDELAY2
RET
;-------------------------------
;开始条件
START24:
CLRSDA24
SETBSDA24
SETBSCLK24
CLRSDA24
CLRSCLK24
RET
;停止条件
STOP:
CLRSDA24
SETBSCLK24
SETBSDA24
RET
;应答信号
ACK:
SETBSCLK24
CLRSCLK24
RET
;读、写数据
SHIFT8:
MOVR7,#8
SH01:
RLCA
MOVSDA24,C
SETBSCLK24
CLRSCLK24
DJNZR7,SH01
RET
DELAY2:
;延时
NOP
NOP
NOP
NOP
RET
END
c语言参考程序:
#include
#include
#defineucharunsignedchar//宏定义,为方便编程
#defineuintunsignedint
#defineDIGIP0//宏定义,将P0口定义为ad7-ad0
#defineSELECTP2//宏定义,将P2口定义为数码管选择位
sbitSDA=P3^7;//定义数据线
sbitSCL=P3^6;//定义时钟线
uintvalue=0;
uchardigivalue[]={0x28,0x7e,0x0a2,0x62,0x74,0x61,0x21,0x7a,0x20,0x60};
//数字数组,依次为0-9
#definedelayNOP();{_nop_();_nop_();_nop_();_nop_();};
#defineOP_WRITE0xa0//器件地址以及写入操作
#defineOP_READ0xa1//器件地址以及读取操作
voidstart();
voidstop();
ucharshin();
bitshout(ucharwrite_data);
voidwrite_byte(ucharaddr,ucharwrite_data);
voiddelayms(uintms);
ucharread_current();
ucharread_random(ucharrandom_addr);
/**********************************************************/
voidstart()//I2C启动函数
//开始位
{
SDA=1;//使能SDA
SCL=1;
delayNOP();
SDA=0;
delayNOP();
SCL=0;
}
/**********************************************************/
voidstop()//I2C停止函数
//停止位
{
SDA=0;
delayNOP();
SCL=1;
delayNOP();
SDA=1;
}
/**********************************************************/
ucharshin()
//从AT24C02移出数据到MCU
{
uchari,read_data;
for(i=0;i<8;i++)
{
SCL=1;
read_data<<=1;//数据左移一位
read_data|=SDA;
SCL=0;
}
return(read_data);
}
/**********************************************************/
bitshout(ucharwrite_data)
//从MCU移出数据到AT24C02
{
uchari;
bitack_bit;
for(i=0;i<8;i++)//循环移入8个位
{
SDA=(bit)(write_data&0x80);
_nop_();
SCL=1;
delayNOP();
SCL=0;
write_data<<=1;
}
SDA=1;//读取应答
delayNOP();
SCL=1;
delayNOP();
ack_bit=SDA;
SCL=0;
returnack_bit;//返回AT24C02应答位
}
/**********************************************************/
voidwrite_byte(ucharaddr,ucharwrite_data)
//在指定地址addr处写入数据write_data
{
start();
shout(OP_WRITE);
shout(addr);
shout(write_data);
stop();
delayms(10);//写入周期
}
/**********************************************************/
ucharread_current()
//在当前地址读取
{
ucharread_data;
start();
shout(OP_READ);
read_data=shin();
stop();
returnread_data;
}
/**********************************************************/
ucharread_random(ucharrandom_addr)
//在指定地址读取
{
start();
shout(OP_WRITE);
shout(random_addr);
return(read_current());
}
/**********************************************************/
voiddelayms(uintms)
//延时子程序
{
uchark;
while(ms--)
{
for(k=0;k<120;k++);
}
}
/**********************************************************/
voiddelay()//复位消抖动函数
{
ucharii=0,jj=0,kk=0;
for(ii=0;ii<200;ii++)
for(jj=0;jj<200;jj++);
}
charcodeSST516[3]_at_0x003b;//仿真器保留
main()
{
SCL=0;
delay();
value=read_random(0);//读取单片机复位次数
value=value+1;//读到的次数加一
if(value>9)value=0;
write_byte(0,value);
P2=0xdf;//选择第二个数码管
DIGI=digivalue[value];//显示次数
while
(1);
}
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 最好的24C02储存开机次数实验 读写程序 最好 24 C02 储存 开机 次数 实验 读写 程序