24c02读写程序

合集下载

24C02读写C程序

24C02读写C程序

//选择性读操作,从 address 地址中读出 1 个字节 uchar Read24c02(uchar address) {
uchar ch; //伪写操作 Start(); Write8Bit(WriteDeviceAddress); //发送从器件地址,且方式为写。 while(TestAck()); Write8Bit(address); while(TestAck());
}
//从 24c02 中读出 8 个 bit uchar 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); }
#define WriteDeviceAddress 0xa0 #define ReadDeviceAddress 0xa1 sbit SCL=P2^7; sbit SDA=P2^6;
//定义器件在 IIC 总线中的地址,且方式为写 //定义器件在 IIC 总线中的地址,且方式为读
sbit P10=P1Stop();
//主机产
生停止信号 return(ch);
}
//本课试验写入一个字节到 24c02 并读出来
void main(void) // 主程序 {
uchar c1,c2; c1=Read24c02(0x02);
//从 24c02 中读出 1 个字节
Write24c02(0x88,0x03); c2=Read24c02(0x03); P3=c2;
24C02读写C程序

24C02读写程序

24C02读写程序

HT49 MCU系列单片机读写HT24系列的EEPROM应用范例HT49 MCU系列单片机读写HT24系列的EEPROM应用范例文件编码:HA0017s简介:HT24系列的EEPROM是通过I2C协议控制其读写的。

HT49系列单片机的接口部分是简单I/O 口,可以用来很方便地采用I2C协议控制周边器件。

HT24系列的EEPROM总共8个管脚,三个为芯片地址脚A0、A1、A2,在单片机对它进行操作时,从SDA输入A0、A1、A2数据和芯片外部A0、A1、A2所接地址需一一对应。

一个为芯片写保护脚WP,WP脚接低电平时,芯片可进行读写操作;WP脚接高时,芯片只可进行读,不可进行写。

另外两个管脚为电源脚VCC,VSS。

用单片机对HT24系列的EEPROM进行控制时,HT24系列的EEPROM的外部管脚VCC、VSS、WP、A0、A1、A2根据需要,对应接上,SDA、SCL接到单片机控制脚上。

引脚名称I/O 功能描述A0~A2 I地址输入VSS I电源负极输入SDA I/O串行数据输入/输出SCL I串行数据传送时钟信号输入WP I写保护VCC I电源正极输入HT24系列的EEPROM根据型号不同,EEPROM的容量大小不同,当EEPROM的空间大于1页(256bytes)时,即大于2048bits,则HT49 MCU需要控制A0、A1、A2来确定写HT24系列的EEPROM的第几页,HT24系列的EEPROM空间大小如下表所示:型号引脚A0、A1及A2使用方法容量大小HT24LC02 A0、A1、A2引脚作为器件地址输入,从SDA输入A0、A1、A2数据和芯片引脚A0、A1、A2所接状态需一一对应2K(256×8)HT24LC04 A1、A2引脚作为器件地址输入,从SDA输入A1、A2数据和芯片引脚A1、A2所接状态需一一对应,A0引脚浮空4K(512×8,2pages)HT24LC08 A2引脚器件地址输入,从SDA输入A2数据和芯片引脚A2所接状态需一一对应,其余引脚浮空8K(1024×8,4pages)HT24LC16 A0、A1、A2全部浮空,不必接16K(2048×8,8pages)HT49 MCU系列单片机读写HT24系列的EEPROM应用范例程式说明:本文是以HT49R30A-1控制HT24LC04为例的。

24c02读写程序大全

24c02读写程序大全

24c02读写程序大全2C总线的应用(24C02子程序)// 对24C02的读、写// extern void DelayMs(unsigned int);// extern void Read24c02(unsigned char *RamAddress,unsigned char Ro mAddress,unsigned char bytes);// extern void Write24c02(unsigned char *RamAddress,unsigned char Ro mAddress,unsigned char bytes);/***************************************************************************/#define WriteDeviceAddress 0xa0#define ReadDviceAddress 0xa1#include <reg52.h>#include <stdio.h>#include <absacc.h>/***************************************************************************/sbit SCL=P2^7;sbit SDA=P2^6;bit DOG;/***************************************************************************/void DelayMs(unsigned int number) {unsigned char temp;for(;number!=0;number--,DOG=!DOG) {for(temp=112;temp!=0;temp--) {}}}/***************************************************************************/void Start() {SDA=1;SCL=1;SDA=0;SCL=0;}/***************************************************************************/void Stop() {SCL=0;SDA=0;SDA=1;}/***************************************************************************/void Ack() {SDA=0;SCL=1;SCL=0;SDA=1;}/***************************************************************************/void NoAck() {SDA=1;SCL=1;SCL=0;}/***************************************************************************/bit TestAck() {bit ErrorBit;SDA=1;SCL=1;ErrorBit=SDA;SCL=0;return(ErrorBit);}/***************************************************************************/void Write8Bit(unsigned char input) {unsigned char temp;for(temp=8;temp!=0;temp--) {SDA=(bit)(input&0x80);SCL=1;SCL=0;input=input<<1;}}/***************************************************************************/void Write24c02(unsigned char *Wdata,unsigned char RomAddress,unsign ed char number) {Write8Bit(WriteDeviceAddress);TestAck();Write8Bit(RomAddress);TestAck();for(;number!=0;number--) {Write8Bit(*Wdata);TestAck();Wdata++;}Stop();DelayMs(10);}/***************************************************************************/ unsigned char 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);}/***************************************************************************/void Read24c02(unsigned char *RamAddress,unsigned char RomAddress, unsigned char bytes) {//unsigned char temp,rbyte;Start();Write8Bit(WriteDeviceAddress);TestAck();Write8Bit(RomAddress);TestAck();Start();Write8Bit(ReadDviceAddress);TestAck();while(bytes!=1) {*RamAddress=Read8Bit();RamAddress++;bytes--;}*RamAddress=Read8Bit();NoAck();Stop();}[单片机应用]24c02的读写程序电子工匠发表于2007-1-4 22:33:07;---------------从24C02整组读数据RD_INI: LCALL DELAYRD_AREA: LCALL DELAYLCALL STARTLCALL DELAYLCALL WRITE ;24C02信息的读入LCALL DELAYLCALL ACKLCALL DELAYJC RD_AREAMOV R2, #8CLR P1.7 ;起始地址为00 ADDR_0: LCALL DELAYLCALL DELAYSETB P1.6LCALL DELAYLCALL DELAYCLR P1.6LCALL DELAYDJNZ R2, ADDR_0LCALL ACKLCALL DELAYJC RD_AREALCALL DELAYLCALL STARTMOV R0, #SAVE0MOV R3, #8 ;6个字节LCALL DELAYLCALL READLCALL DELAYLCALL ACKJC RD_AREARD_R_0: LCALL DELAYLCALL DELAYLCALL RD_INFOLCALL DELAYINC R0DJNZ R3, RD_R_1lcall ack_2lcall delayLCALL STOPRETrd_r_1: lcall ack_1sjmp rd_r_0;---------------向24C02整组写数据WR_INI: LCALL DELAYLCALL STARTLCALL DELAYLCALL WRITELCALL DELAYLCALL ACKLCALL DELAYJC WR_INICLR P1.7MOV R2, #8WR_W_0: LCALL DELAY ;写地址SETB P1.6LCALL DELAYLCALL DELAYCLR P1.6LCALL DELAYDJNZ R2, WR_W_0LCALL DELAYLCALL ACKLCALL DELAYJC WR_INIMOV R0, #SAVE0MOV R3, #8 ;6个字节WR_W_1: LCALL WR_INFOLCALL DELAYLCALL ACKLCALL DELAYJC WR_INIINC R0DJNZ R3, WR_W_1LCALL DELAYLCALL STOPRET;---------------24C02启动START: SETB P1.7SETB P1.6LCALL DELAYCLR P1.7LCALL DELAYCLR P1.6RET;---------------24C02读命令字;片选为"00";---------------------------- READ: MOV A, #10100001B MOV R2, #8RD1: RLC AMOV P1.7, CSETB P1.6LCALL DELAYCLR P1.6LCALL DELAYDJNZ R2, RD1RET;---------------24C02写命令字;片选为"00";---------------------------- WRITE: MOV A, #10100000B MOV R2, #8WR1: RLC AMOV P1.7, CSETB P1.6LCALL DELAYCLR P1.6CLR P1.7LCALL DELAYDJNZ R2, WR1RET;---------------24C02结束命令字STOP: CLR P1.7LCALL DELAYSETB P1.6LCALL DELAYSETB P1.7LCALL DELAYCLR P1.6RET;---------------24C02的应答信息ACK: SETB P1.7SETB P1.6LCALL DELAYmov a, p1MOV C, a.7LCALL DELAYCLR P1.6RETack_1: CLR P1.7 ;应答SETB P1.6lcall delayCLR P1.6lcall delaySETB P1.7lcall delayRETack_2: SETB P1.7 ;非应答SETB P1.6lcall delayCLR P1.6CLR P1.7lcall delayRET;---------------24C02的读;R0:数据的存储地址;-------------------------------- RD_INFO: SETB P1.7LCALL DELAYMOV R2, #8MOV R7, #0MOV A, #0RD_I_0: SETB P1.6LCALL DELAYMOV A, P1MOV C, A.7LCALL DELAYCLR P1.6MOV A, R7RLC AMOV R7, ALCALL DELAYDJNZ R2, RD_I_0MOV @R0, ARET;---------------24C02的写;R0:数据的写数据地址;-----------------------------------WR_INFO: MOV A, @R0MOV R2, #8WR_O_0: RLC AMOV P1.7, CLCALL DELAYSETB P1.6LCALL DELAYLCALL DELAYCLR P1.6LCALL DELAYDJNZ R2, WR_O_0RET24Cxx I2C EEPROM字节读写驱动程序,芯片A0-A1-A2要接GND(24C65接VCC,具体看DataSheet)。

24c02的连续读写

24c02的连续读写

it(list[i]);
respons_24c02(1);
}
else
{
stop_24c02(); //写完一页,则进入启动内部写周期
do
{
start_24c02();
write_8bit(W24C02);
void respons_24c02(bit ack) //ak为1则单片机接收24c02的应答信号;ak为0则24c02接收单片机的应答信号
{
uchar i=0;
SDA=ack;
while(i&lt;250&amp;&amp;SDA==1)i++;
SCL=1;
_nop_();
_nop_();
{
dat=dat&lt;&lt;1;
SDA=CY;
SCL=1;
_nop_();
_nop_();
SCL=0;
_nop_();
_nop_();
}
}
/********************
从24c02读取一字节(8位)
的数据
********************/
uchar read_8bit()
{
uchar i,k;
for(i=0;i&lt;8;i++)
{
SCL=1;
_nop_();
_nop_();
k=(k&lt;&lt;1)|SDA;
SCL=0;
_nop_();
_nop_();
}
return k;

24c02读写程序大全

24c02读写程序大全
SETB SDA24
CLR SCLK24
CALL START24;启动
MOV A,#0A0H
CALL SHIFT8;移位
CALL ACK;响应
POP ACC
>SETB;应答毕,SDA置1
>RET
>程序中多处调用了DELAY子程序(仅两条NOP指令),这是为了满足I2C总线上数据传
送速率的要求,只有当SDA数据线上的数据稳定下来之后才能进行读写(即SCL线发出正
脉冲)。另外,在读最后一数据字节时,置应答信号为“1”,表示读操作即将完成。
>
>下面是本人编写的源程序,已经调试成功,下载就可以使用,程序编写的不是很规范
>ACALL SUBS
>MORE: ACALL SUBR
>MOV@R1,A
>INCR1
>DJNZ R7,MORE
>CLR
>ACALL DELAY
>SETB
>ACALL DELAY
>SETB;送停止信号
>RET
>SUBR: MOVR0,#08H ;接受单字节子程序
>LOOP2: SETB
>ACALL DELAY
TT2:MOV30H,A
MOVCA,@A+DPTR
CLR;开数码管
MOVP0,A;送显示
MOVA,30H
INCA
MOVB,A
MOVA,#00H
LCALLWT24
AJMP$
TAB:DB28H,7EH,0A2H,62H,74H,61H,21H,7AH,20H,60H
RD24: PUSH ACC;读24C02子程序。

24c02读写程序

24c02读写程序
}
//===================================================================//
//==========================================================
i=readx(); stop();
delay1(10);
return(i);
}
void x24c02_write(uchar address,uchar info)
{
EA=0;
start(); writex(0xa0);
clock(); writex(address);
clock(); writex(info);
clock(); stop();
EA=1;
delay1(50);
}
//====================================================================//
main (){
}
uchar readx()
{
uchar i,j,k=0;
scl=0; flash(); sda=1;
for (i=0;i<8;i++){
flash(); scl=1; flash();
if (sda==1) j=1;
else j=0;
uchar x24c02_read(uchar address); //从24c02的地址address中读取一个字节数据
void x24c02_write(uchar address,uchar info);

AT24C02EEPROM读写程序

AT24C02EEPROM读写程序

;--------------------------------------------------------------------------------------------------------------------- ;本程序是针对AT89S52单片机编制的EEPROM读写程序(2013.8.4测试通过);本程序在4MHZ、12MHZ和24MHZ分别测试通过;AT24C02的A0、A1、A2均接GND,设备地址高7位为(1010)000;WP接GND,充许对EEPROM正常读写;本程序仅作学习交流之用。

;--------------------------------------------------------------------------------------------------------------------- SCl equ P2.0 ;SCL接A T89S52的P2.0端口,作为EEPROM的串行输入时钟SDA equ P2.1 ;SDA接AT89S52的P2.1端口,作为主机与EEPROM之间信息串行传输总线WRITEDATA equ 08H;拟写入EEPROM的数据在主机中的存贮单元地址READDATA equ 09H ;从EEPROM读取的数据存放到主机存贮单元地址EPROMADDRESS equ 0AH;拟随机读写EEPROM的存贮单元地址;------------------------------------------------ORG 00HLJMP MAIN;------------------------------------------------ORG 50HMAIN: MOV SP,#20H;防止堆栈影响已用内存数据;以下为写EEPROM过程mov EPROMADDRESS,#09H;该地址可以随意输入(00H~FFH),但读和写的地址须相同MOV WRITEDA TA,#01010010B;该数字可以随意输入,并将读和写的数据进行比较;如读数正确则按将读出数据在P1口输出,可在P1口各位分别接LED灯直观显示出来。

24c02读写实验c程序

24c02读写实验c程序
{ucharRomDat[4];
Init();//初始化
DispBuf[2]=Hidden;
DispBuf[3]=Hidden;
for(;;)
{
Calc(RecBuf[1],RomDat[0]);//分别显示地址和数据
if(Rec)//接收到数据
{Rec=0;//清除标志
if(RecBuf[0]==0)//第一种功能,写入
TR1=1;
}
void Calc(uchar Dat1,uchar Dat2)//第一个参数放在第1、2位,第二个参数放入第5、6位
{DispBuf[0]=Dat1/16;
DispBuf[1]=Dat1%16;
DispBuf[4]=Dat2/16;
DispBuf[5]=Dat2%16;
}
void main()
/**************************************************
24C02.C
功能描述:
PC端发送3个数据n0,n1,n2.
n0=0,写,将n1写入n2地址中
n0=1,读,读出n1地址中的数据,n2不起作用,但必须有
收到一个字节后,将其地址值显示在数码管第1、2位上,数值显示在第5、6位上
sbit we=P2^7;
sbit du=P2^6;
uchar code dispbit[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf};
uchar code disptab[]={0x3f,0x6,0x5b,0x4f,0x66,
0x6d,0x7d,0x27,0x7f,0x6f,0x77,0x7c,0x39,0x5e,
Rec=1;//置位标志
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

E2PROM芯片24C02的读写程序一、实验目的:给24C02的内部RAM写入一组数据,数据从24C02内部RAM的01h开始存放。

然后再把这组数据读出来,检验写入和读出是否正确。

在这里我们给24C02中写入0、1、2的段码,然后把它读出来,送到数码管显示。

二、理论知识准备:上面两个实验主要学习的是利用单片机的串口进行通讯,本实验要介绍的是基于I2C总线的串行通讯方法,下面我们先介绍一下I2C总线的相关理论知识。

(一)、I2C总线概念I2C总线是一种双向二线制总线,它的结构简单,可靠性和抗干扰性能好。

目前很多公司都推出了基于I2C总线的外围器件,例如我们学习板上的24C02芯片,就是一个带有I2C总线接口的E2PROM存储器,具有掉电记忆的功能,方便进行数据的长期保存。

(二)、I2C总线结构I2C总线结构很简单,只有两条线,包括一条数据线(SDA)和一条串行时钟线(SCL)。

具有I2C接口的器件可以通过这两根线接到总线上,进行相互之间的信息传递。

连接到总线的器件具有不同的地址,CPU根据不同的地址进行识别,从而实现对硬件系统简单灵活的控制。

一个典型的I2C总线应用系统的组成结构如下图所示(假设图中的微控制器、LCD驱动、E2PROM、ADC各器件都是具有I2C总线接口的器件):我们知道单片机串行通讯的发送和接收一般都各用一条线TXD和RXD,而I2C总线的数据线既可以发送也可以接受,工作方式可以通过软件设置。

所以,I2C总线结构的硬件结构非常简洁。

当某器件向总线上发送信息时,它就是发送器,而当其从总线上接收信息时,又成为接收器。

(三)、I2C总线上的数据传送下面我们看看I2C总线是如何进行数据传送的。

我们知道,在一根数据线上传送数据时必须一位一位的进行,所以我们首先研究位传送。

1、位传输I2C总线每传送一位数据必须有一个时钟脉冲。

被传送的数据在时钟SCL的高电平期间保持稳定,只有在SCL低电平期间才能够改变,示意图如下图所示,在标准模式下,高低电平宽度必须不小于4.7us。

那么是不是所有I2C总线中的信号都必须符合上述的有效性呢?只有两个例外,就是开始和停止信号。

开始信号:当SCL为高电平时,SDA发生从高到低的跳变,就定义为开始信号。

停止信号:当SCL为高电平时,SDA发生从低到高的跳变,就定义为结束信号。

开始和结束信号的时序图如下图所示:2、数据传输的字节格式SDA传送数据是以字节为单位进行的。

每个字节必须是8位,但是传输的字节数量不受限制,首先传送的是数据的最高位。

每次传送一个字节完毕,必须接收到从机发出的一个应答位,才能开始下一个字节的传输。

如果没有接受到应答位,主机则产生一个停止条件结束本次的传送。

那么从机应该发出什么信号算是产生了应答呢?这个过程是这样的。

当主器件传送一个字节后,在第9个SCL时钟内置高SDA线,而从器件的响应信号将SDA拉低,从而给出一个应答位。

好啦,了解了I2C传输数据的格式,现在来研究双方传送的协议问题。

3、 I2C数据传输协议I2C总线的数据传输协议如下:(1)、主器件发出开始信号(2)、主器件发出第一个字节,用来选通相应的从器件。

其中前7位为地址码,第8位为方向位(R/W)。

方向位为“0”表示发送,方向位为“1”表示接受。

(3)、从机产生应答信号,进入下一个传送周期,如果从器件没有给出应答信号,此时主器件产生一个结束信号使得传送结束,传送数据无效。

(4)、接下来主、从器件正式进行数据的传送,这时在I2C总线上每次传送的数据字节数不限,但每一个字节必须为8位(传送的时候先送高位,再送低位)。

当一个字节传送完毕时,再发送一个应答位(第9位),如上一条所述,这样每次传送一个字节都需要9个时钟脉冲。

数据的传送过程如下图所示:(四)、24C02芯片相关介绍AT24C02是带有I2C总线接口的E2PROM存储器,具有掉电记忆的功能,并且可以象普通RAM 一样用程序改写。

它的容量是256个字节(00h~0ffh),有A2、A1、A0三位地址,可见I2C总线上可以连接8片AT24C02,它的寻址字节是1010 A2A1A0 R/W。

板上面24C02的电路连接如图所示:我们对引脚的功能作一个简单的解释:VCC,GND:电源、地引脚A2A1A0:地址引脚SCLK、SDA:通信引脚WP:写保护引脚从上面的电路连接知:A2A1A0=000,可见如果要对24C02进行写操作,寻址字节是1010 000 0;如果对24C02进行读操作,寻址字节是1010 000 1。

用单片机的P1.6脚作为串行时钟线,用P1.7脚作串行数据线。

(五)、程序分析写过程:(1)、主机首先发出开始信号(2)、发出写24C02的寻址字节1010 000 0,即0A0H(3)、发数据写入24C02的地址,本例中为01H(4)、往24C02中写入数据,这里是3个字节,分别为48h,0ebh,52h。

(5)、写完毕发出停止信号读过程:(1)、主机发出start信号(2)、发写24C02的寻址字节1010 000 0(大家可能要问:我们是读数据,为什么要发写信号呢?这是因为你首先要送出一个信号,说明从24C02中的哪个地址读取数据。

)(3)、发要读取的数据在24C02中的地址,即01h(4)、主机发start信号(5)、发读24C02的寻址字节1010 000 1(5)、从24 C02中读取数据(6)、读取完毕发出停止信号在这个程序中,我们把开始信号,结束信号、写一个字节数据、读一个字节数据都编制成为通用的子程序,便于在程序中随时调用。

发送和接受应答位的过程放到子程序中,这样可以使得程序结构简化。

具体的程序如下所示,希望大家认真理解。

三、实验程序Org 0000hI2cdata equ 30h ;发送数据缓冲区的首址2402data equ 01h ;接受缓冲区首址numdata equ 03h ;传送的字节数,传送3个字节Sda bit p1.7Scl bit p1.6Ajmp mainMain: Lcall init ;初始化给30h,31h,32h中存入0,1,2的段码Mainwr:Lcall start ;启动Mov r7,#0a0hLcall send ;发送写24C02的寻址字节Mov r7,#2402dataLcall send ;发送数据存入24C02的地址Mov r5,#Numdata ;欲发送的字节数Mov r0,#i2cdata ;发送缓冲区的首址wrloop:Mov a,@r0Mov r7,aInc r0Lcall sendDjnz r5, wrloop ;把3个字节的数据发送出去lcall stop ;停止lcall d1smov r5,#Numdata ; 要读取的字节数重新赋值Mainre:lcall start ;启动Mov r7,#0a0hLcall send ;发送写24C02的寻址字节Mov r7,#2402dataLcall send ;发接受缓冲区首址Lcall start ; 再次启动Mov r7,#0a1hLcall send ;发送读24C02的寻址字节Reloop: Lcall read ;调用读取一个字节数据的子程序 mov p0,r7 ;把读进来的数送到p0口显示lcall d1slcall d1sDjnz r5,reloopLcall stop ;3字节读取完毕发出停止信号Ajmp $init: mov p2,#0ffh ;初始化,30h、31h、32h中存入0、1、2的段码mov 30h,#48hmov 31h,#0ebhmov 32h,#52hretstart: setb sda ;启动信号子程序,大家可以参考开始信号的时序图setb scllcall d5uclr sdalcall d5uclr sclretstop: clr sda ;停止信号子程序setb scllcall d5usetb sdalcall d5uclr sdaclr sclret;send是发送一个字节子程序send: mov r6,#08hmov a,r7 ;要发送的数在r7中sendlop1 : rlc a ;左环移,把A的最高位移入cymov sda,c ;把cy的值通过sda发送出去setb scl ;在scl上产生一个时钟lcall d5uclr scldjnz r6, sendlop1 ;重复8次,发送一个字节;cack是检查应答信号的子程序cack: setb sda ;主机首先拉高sdasetb scl ;发出一个时钟lcall d5usendlop2:mov c,sda ;读入sda的状态,如果是0表示接受到了应答jc sendlop2clr scl ;接受到应答位,结束时钟retread: mov r6,#08h ;读取一个字节子程序readlop1: setb sda ;置sda为输入方式setb scl ;发出一个时钟lcall d5umov c,sda ;读入sda状态rlc a ;把该位的状态移入A中clr scl ;结束时钟djnz r6,readlop1 ;重复8次,读入一个字节mov r7,a ;读进来的数放在r7中;sack是发送应答位子程序sack: clr sda ;拉低sda线setb scl ;发出时钟信号lcall d5uclr sclsetb sdaretd5u: nop ;延时5us子程序nopnopnopnopretd1s: mov r1,#100 ;延时1s子程序del1: mov r4,#20del2: mov r3,#0ffhdel3: djnz r3,del3djnz r4,del2djnz r1,del1retend大家把这个程序下载到测试板上面,发现数码管依次显示数字0、1、2;简洁的24C02读写汇编程序;--------------------------------------------I2C_SDA EQU P1.6 ; PIN 5I2C_SCL EQU P1.7 ; PIN 6;======================================== =====I2C_WRITE: ; WRITE 8 BYTES TO EEROM ; INPUT: A - A*8 = EEROM START ADDR; R0 - RAN START ADDR; USE: C, A, R0, R6, R7ACALL I2C_STARTACALL OUTMOV R6, #8WR_LP:MOV A, @R0ACALL OUTINC R0DJNZ R6, WR_LPAJMP I2C_STOP;======================================== ==I2C_READ: ; READ 8 BYTES FROM EEROM ; INPUT: A - A*8 = EEROM START ADDR; R0 - RAN START ADDR; USE: C, A, R0, R6, R7ACALL I2C_STARTACALL OUTMOV R6, #8MOV A, #0A1H; #RDCMDACALL OUTSBRDLP:MOV R7, #8SETB I2C_SDAINLP: CLR I2C_SCLACALL DELAY6SETB I2C_SCLNOPMOV C, I2C_SDARLC ADJNZ R7, INLPCLR I2C_SCLMOV @R0, AINC R0DJNZ R6, ACKLP ;;;;---------------------------- I2C_STOP:CLR I2C_SDAACALL DELAY5SETB I2C_SCLACALL DELAY5SETB I2C_SDA DELAY6:NOPDELAY5:NOPRET;;----------------------------- I2C_START:SW AP ARR AMOV R6, AMOV A, #0A0H; #WTCMDACALL OUTSMOV A, R6RET;------------------------------- ACKLP:CLR I2C_SDASETB I2C_SCLACALL DELAY5CLR I2C_SCLAJMP BRDLP;======================= OUTS:SETB I2C_SDASETB I2C_SCLACALL DELAY5CLR I2C_SDAACALL DELAY5CLR I2C_SCL;========================OUT:SETB CMOV R7, #9OTLP: RLC ANOPMOV I2C_SDA, CNOPNOPSETB I2C_SCLACALL DELAY5CLR I2C_SCLDJNZ R7, OTLPRET;======================== END;SDA EQU P1.6 ;(你可以根据你的情况变更引脚);SCL EQU P1.7;D15US,D1MS子程序分别为15uS和1mS延时程序,请根据你的晶体自行编写。

相关文档
最新文档