最好的24C02储存开机次数实验 读写程序.docx

上传人:b****5 文档编号:7502439 上传时间:2023-01-24 格式:DOCX 页数:8 大小:165.53KB
下载 相关 举报
最好的24C02储存开机次数实验 读写程序.docx_第1页
第1页 / 共8页
最好的24C02储存开机次数实验 读写程序.docx_第2页
第2页 / 共8页
最好的24C02储存开机次数实验 读写程序.docx_第3页
第3页 / 共8页
最好的24C02储存开机次数实验 读写程序.docx_第4页
第4页 / 共8页
最好的24C02储存开机次数实验 读写程序.docx_第5页
第5页 / 共8页
点击查看更多>>
下载资源
资源描述

最好的24C02储存开机次数实验 读写程序.docx

《最好的24C02储存开机次数实验 读写程序.docx》由会员分享,可在线阅读,更多相关《最好的24C02储存开机次数实验 读写程序.docx(8页珍藏版)》请在冰豆网上搜索。

最好的24C02储存开机次数实验 读写程序.docx

最好的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); 

}

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 法律文书 > 调解书

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1