当前位置:文档之家› ATMEL 24c02使用详解(汇编及C程序都有)

ATMEL 24c02使用详解(汇编及C程序都有)

ATMEL 24c02使用详解(汇编及C程序都有)
ATMEL 24c02使用详解(汇编及C程序都有)

ATMEL 24c02使用详解

原文地址: https://www.doczj.com/doc/1618141973.html,/Blog/cns!2FEAB5F0F11F7A67!296.entry

ATMEL 24c02使用详解

I2C总线是一种用于IC器件之间连接的二线制总线。它通过SDA(串行数据线)及SCL (串行时钟线)两根线在连到总线上的器件之间传送信息,并根据地址识别每个

器件:不管是单片机、存储器、LCD驱动器还是键盘接口。

1.I2C总线的基本结构采用I2C总线标准的单片机或IC器件,其内部不仅有I2C 接口电路,而且将内部各单元电路按功能划分为若干相对独立的模块,通过软

件寻址实现片选,减少了器件片选线的连接。CPU不仅能通过指令将某个功能单元电路挂*或摘离总线,还可对该单元的工作状况进行检测,从而实现对硬件系统的

既简单又灵活的扩展与控制。I2C总线接口电路结构如图1所示。

2.双向传输的接口特性传统的单片机串行接口的发送和接收一般都各用一条线,如MCS51系列的TXD和RXD,而I2C总线则根据器件的功能通过软件程序使其可工作

于发送或接收方式。当某个器件向总线上发送信息时,它就是发送器(也叫主器件),而当其从总线上接收信息时,又成为接收器(也叫从器件)。主器件用于启动总

线上传送数据并产生时钟以开放传送的器件,此时任何被寻址的器件均被认为是从器件。I2C总线的控制完全由挂接在总线上的主器件送出的地址和数据决定。在总

线上,既没有中心机,也没有优先机。

总线上主和从(即发送和接收)的关系不是一成不变的,而是取决于此时数据传送的方向。SDA和SCL均为双向I/O线,通过上拉电阻接正电源。当总线空闲时,两

根线都是高电平。连接总线的器件的输出级必须是集电极或漏极开路,以具有线“与”功能。I2C总线的数据传送速率在标准工作方式下为100kbit/s,在快速方式

下,最高传送速率可达400kbit/s。

3.I2C总线上的时钟信号在I2C总线上传送信息时的时钟同步信号是由挂接在SCL 时钟线上的所有器件的逻辑“与”完成的。SCL线上由高电平到低电平的跳变

将影响到这些器件,一旦某个器件的时钟信号下跳为低电平,将使SCL线一直保持低电平,使SCL线上的所有器件开始低电平期。此时,低电平周期短的器件的时钟

由低至高的跳变并不能影响SCL线的状态,于是这些器件将进入高电平等待的状态。

当所有器件的时钟信号都上跳为高电平时,低电平期结束,SCL线被释放返回高电平,即所有的器件都同时开始它们的高电平期。其后,第一个结束高电平期的

器件又将SCL线拉成低电平。这样就在SCL线上产生一个同步时钟。可见,时钟低电平时间由时钟低电平期最长的器件确定,而时钟高电平时间由时钟高电平期最短

的器件确定。

4.数据的传送在数据传送过程中,必须确认数据传送的开始和结束。在I2C总线技术规范中,开始和结束信号(也称启动和停止信号)的定义如图2所示。当

时钟线SCL 为高电平时,数据线SDA由高电平跳变为低电平定义为“开始”信号;当SCL 线为高电平时,SDA线发生低电平到高电平的跳变为“结束”信号。开始和结

束信号都是由主器件产生。在开始信号以后,总线即被认为处于忙状态;在结束信号以后的一段时间内,总线被认为是空闲的。

I2C总线的数据传送格式是:在I2C总线开始信号后,送出的第一个字节数据是用来选择从器件地址的,其中前7位为地址码,第8位为方向位(R/W)。方向位为“0”

表示发送,即主器件把信息写到所选择的从器件;方向位为“1”表示主器件将从从器件读信息。开始信号后,系统中的各个器件将自己的地址和器件送到总线上的

地址进行比较,如果与主器件发送到总线上的地址一致,则该器件即为被主器件寻址的器件,其接收信息还是发送信息则由第8位(R/W)确定。

在I2C总线上每次传送的数据字节数不限,但每一个字节必须为8位,而且每个传送的字节后面必须跟一个认可位(第9位),也叫应答位(ACK)。数据的传送

过程如图3所示。每次都是先传最高位,通常从器件在接收到每个字节后都会作出响应,即释放SCL线返回高电平,准备接收下一个数据字节,主器件可继续传送。

如果从器件正在处理一个实时事件而不能接收数据时,(例如正在处理一个内部中断,在这个中断处理完之前就不能接收I2C总线上的数据字节)可以使时钟SCL线

保持低电平,从器件必须使SDA保持高电平,此时主器件产生1个结束信号,使传送异常结束,迫使主器件处于等待状态。当从器件处理完毕时将释放SCL线,主器件

继续传送。

当主器件发送完一个字节的数据后,接着发出对应于SCL线上的一个时钟(ACK)认可位,在此时钟内主器件释放SDA线,一个字节传送结束,而从器件的响应信号将

SDA线拉成低电平,使SDA在该时钟的高电平期间为稳定的低电平。从器件的响应信号结束后,SDA线返回高电平,进入下一个传送周期。

I2C总线还具有广播呼叫地址用于寻址总线上所有器件的功能。若一个器件不需要广播呼叫寻址中所提供的任何数据,则可以忽略该地址不作响应。如果该器件

需要广播呼叫寻址中提供的数据,则应对地址作出响应,其表现为一个接收器。

5.总线竞争的仲裁总线上可能挂接有多个器件,有时会发生两个或多个主器件同时想占用总线的情况。例如,多单片机系统中,可能在某一时刻有两个单片

机要同时向总线发送数据,这种情况叫做总线竞争。I2C总线具有多主控能力,可以对发生在SDA线上的总线竞争进行仲裁,其仲裁原则是这样的:当多个主器件同

时想占用总线时,如果某个主器件发送高电平,而另一个主器件发送低电平,则发送电平与此时SDA总线电平不符的那个器件将自动关闭其输出级。总线竞争的仲裁

是在两个层次上进行的。首先是地址位的比较,如果主器件寻址同一个从器件,则进入数据位的比较,从而确保了竞争仲裁的可*性。由于是利用I2C总线上的信息

进行仲裁,因此不会造成信息的丢失。

6. I2C总线接口器件目前在视频处理、移动通信等领域采用I2C总线接口器件已经比较普遍。另外,通用的I2C总线接口器件,如带I2C总线的单片机、RAM、

ROM、A/D、D/A、LCD驱动器等器件,也越来越多地应用于计算机及自动控制系统中。

AT24C02是美国ATMEL公司的低功耗CMOS串行EEPROM,它是内含256×8位存储空间,具有工作电压宽(2.5~5.5V)、擦写次数多(大于10000次)、写入速度快

(小于10ms)等特点。

AT24C02的1、2、3脚是三条地址线,用于确定芯片的硬件地址。在AT89C51试验开发板上它们都接地,第8脚和第4脚分别为正、负电源。第5脚SDA为串行数据输入/

输出,数据通过这条双向I2C总线串行传送,在AT89C51试验开发板上和单片机的P3.5连接。第6脚SCL为串行时钟输入线,在AT89C51试验开发板上和单片机的P3.6连

接。SDA和SCL都需要和正电源间各接一个5.1K的电阻上拉。第7脚需要接地。

24C02中带有片内地址寄存器。每写入或读出一个数据字节后,该地址寄存器自动加1,以实现对下一个存储单元的读写。所有字节均以单一操作方式读取。为

降低总的写入时间,一次操作可写入多达8个字节的数据。

;这是将0600H地址中以下的8个数据写到24C02的01H为首址单元中去的汇编程序

ORG 0000H

SCL BIT P3.4;定义24C02的串行时钟线

SDA BIT P3.5;定义24C02的串行数据线

LJMP START

START:LCALL STAR;调用

MOV R2,#08H;一个数据有8位

MOV DPTR,#0600H;定义源数据的位置LOOP:MOV A,#00H

MOVC A,@A+DPTR

LCALL SDATA

LCALL ACK

JC LOOP

INC DPTR

DJNZ R2,LOOP

LCALL STOP;调用停止子程序

STAR:SETB SDA

SETB SCL

NOP

NOP

NOP

NOP

CLR SDA

NOP

NOP

NOP

NOP

CLR SCL

RET

SDATA:MOV R0,#08H

LOOP0:RLC A

MOV SDA,C

NOP

NOP

SETB SCL

NOP

NOP

NOP

NOP

CLR SCL

DJNZ R0,LOOP0

RET

ACK:SETB SDA

NOP

NOP

SETB SCL

NOP

NOP

NOP

NOP

MOV C,SDA

CLR SCL

RET

STOP:CLR SDA

NOP

NOP

NOP

NOP

SETB SCL

NOP

NOP

NOP

NOP

SETB SDA

NOP

NOP

NOP

NOP

RET

ORG 0600H

DB 0A0H,10H,01H,02H,03H,04H,05H,06H

END

读写子程序如下:

;写串行E2PROM子程序EEPW

; R3=10100000(命令1010+器件3位地址+读/写。器件地址一个芯片,是000); (R4)=片内字节地址

; (R1)=欲写数据存放地址指针

; (R7)=连续写字节数n

EEPW: MOV P1,#0FFH

CLR P1.0;发开始信号

MOV A,R3;送器件地址

ACALL SUBS

MOV A,R4;送片内字节地址

ACALL SUBS

AGAIN: MOV A,@R1

ACALL SUBS;调发送单字节子程序INC R1

DJNZ R7,AGAIN;连续写n个字节

CLR P1.0;SDA置0, 准备送停止信号

ACALL DELAY ;延时以满足传输速率要求

SETB P1.1;发停止信号

ACALL DELAY

SETB P1.0

RET

SUBS: MOV R0,#08H ;发送单字节子程序

LOOP: CLR P1.1

RLC A

MOV P1.0,C

NOP

SETB P1.1

ACALL DELAY

DJNZ R0,LOOP ;循环8次送8个bit

CLR P1.1

ACALL DELAY

SETB P1.1

REP: MOV C,P1.0

JC REP;判应答到否,未到则等待

CLR P1.1

RET

DELAY: NOP

NOP

RET

;读串行E2PROM子程序EEPR

;(R1)=欲读数据存放地址指针

;; R3=10100001(命令1010+器件3位地址+读/写。器件地址一个芯片,是000);(R4)=片内字节地址

;(R7)=连续读字节数

EEPR: MOV P1,#0FFH

CLR P1.0;发开始信号

MOV A,R3;送器件地址

ACALL SUBS;调发送单字节子程序

MOV A,R4;送片内字节地址

ACALL SUBS

MOV P1,#0FFH

CLR P1.0;再发开始信号

MOV A,R3

SETB ACC.0;发读命令

ACALL SUBS

MORE: ACALL SUBR

MOV@R1,A

INC R1

DJNZ R7,MORE

CLR P1.0

ACALL DELAY

SETB P1.1

ACALL DELAY

SETB P1.0 ;送停止信号

RET

SUBR: MOV R0,#08H ;接受单字节子程序

LOOP2: SETB P1.1

ACALL DELAY

MOV C,P1.0

RLC A

CLR P1.1

ACALL DELAY

DJNZ R0,LOOP2

CJNE R7,#01H,LOW

SETB P1.0;若是最后一个字节置A=1

AJMP SETOK

LOW: CLR P1.0;否则置A=0

SETOK: ACALL DELAY

SETB P1.1

ACALL DELAY

CLR P1.1

ACALL DELAY

SETB P1.0;应答毕,SDA置1

RET

程序中多处调用了DELAY子程序(仅两条NOP指令),这是为了满足I2C总线上数据传送速率的要求,只有当SDA数据线上的数据稳定下来之后才能进行读写(即SCL

线发出正脉冲)。另外,在读最后一数据字节时,置应答信号为“1”,表示读操作即将完成。下面是本人编写的源程序,已经调试成功,下载就可以使用,程序编写的不是很规范,希

望各位读者批评指正!!!

/***********************************************************

**模块名称:24C02的读写

**编写人:bradley 日期2005-5-1

**修改人:bradley

**功能描述:将8字节数据写入24C02中,然后再读出来送P1口显示

**其他说明:本程序是采用24C02的页面写入连续读写8字节数据

**版本:keil 7.0

**********************************************************/

#include

#include

//#define uchar unsigned char

#define uint unsigned int

#define WC24C02 0x0a0;//器件地址

#define R24C02 0x00;//写数据地址

#define W24C02 0x00;//读数据地址

sbit SDA=P3^7;//定义数据线

sbit SCL=P3^6;//定义时钟线

bit flag;

uint idata ucSendBuffer[8]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80}; uint idata ucReceData;

uint idata ucReceiveBuffer[8];//从器件中读出的多字节数据暂存区

void delay();

void delay_10ms();

void ACK();

void NoACK();

/*********************************************************

**名称:I2C_Start

**功能:启动I2C

**输入:无

**返回:无

*********************************************************/

void I2C_Start()

{

SDA=1;

delay();

SCL=1;

delay();

SDA=0;

delay();

SCL=0;//钳位I2C总线,准备发送数据

}

/**********************************************************

**名称:I2C_Stop

**功能:停止I2C

**输入:无

**返回:无

**********************************************************/ void I2C_Stop()

{

SDA=0;

delay();

SCL=1;

delay();

SDA=1;

delay();

}

/********************************************************** **名称:Ack

**功能:应答信号

**输入:无

**返回:无

**********************************************************/ void Ack()

{

SDA=0;

delay();

SCL=1;

delay();

SCL=0;

delay();

SDA=1;

delay();

}

/******************************************************** **名称:NoAck

**功能:发送非应答信号

**输入:无

**返回:无

********************************************************/ void NoAck()

{

SDA=1;

delay();

SCL=1;

delay();

SCL=0;

delay();

delay();

}

/********************************************************

**名称:Test_Ack()

**功能:检测应答位

*********************************************************/

bit Test_Ack()

{

SCL=0;

SDA=1;//读入数据

_nop_();_nop_();_nop_();_nop_();

SCL=1;

_nop_();_nop_();_nop_();_nop_();

if(SDA==0)

flag=1;

else flag=0;

SCL=0;

return(flag);

}

/********************************************************

**名称:SendData()

**功能:发送一字节数据

**输入:buffer

**返回:

*******************************************************/ void SendData(uint buffer)

{

uint BitCnt=8;//一字节8位

uint temp=0;

do

{

temp=buffer;

SCL=0;

delay();

if((temp&0x80)==0) //判断最高位是0还是1

SDA=0;

else

SDA=1;

delay();

SCL=1;

temp=_crol_(buffer,1);//将buffer中的数据左移一位buffer=temp;

}

while(BitCnt);

SCL=0;

}

/************************************************************** **名称:uint ReceiveData()

**功能:接收一字节数据

**输入:

**返回:ucReceData

**说明:将接收的数据存放在ucReceData中

**************************************************************/ uint ReceiveData()

{

uint BitCnt=8;

uint temp=0;

SDA=1;//读入数据

do

{

SCL=0;

delay();

SCL=1;

delay();

if(SDA==1)

ucReceData=ucReceData|0x01;//低位置1

else

ucReceData=ucReceData&0x0fe;//低位清0

if(BitCnt-1)

{

temp=_crol_(ucReceData,1);//数据左移一位ucReceData=temp;

}

BitCnt--;

}

while(BitCnt);

SCL=0;

return(ucReceData);

}

/************************************************************* **名称:bit WriteNByte()

**功能:向24C02中写入多字节数据

**输入:

**说明:sla-器件地址suba-数据地址,*s-写入的数据,n-写入的字节数(n<=8)

**************************************************************/

bit WriteNByte(uint sla,uint suba,uint s[],uint n)

{

uint i;

I2C_Start();//启动I2C

SendData(sla);//发送器件地址

Test_Ack();

if(flag==0) return(0);

SendData(suba);

Test_Ack();

if(flag==0) return(0);

for(i=0;i

{

SendData(s);

Test_Ack();

if(flag==0) return(0);

}

I2C_Stop();

return(1);

}

/*************************************************************

**名称:bit ReadNByte()

**功能:从24C02中读出N字节数据(n<=8)

**输入:

**返回:

**说明:

**************************************************************/

bit ReadNByte(uint sla,uint suba,uint p[],uint n)

{

uint i;

I2C_Start();//启动I2C

SendData(sla);//发送器件地址

Test_Ack();

if(flag==0) return(0);

SendData(suba);//发送器件内部地址

Test_Ack();

if(flag==0) return(0);

I2C_Start();

SendData(sla+1);

Test_Ack();

if(flag==0) return(0);

for(i=0;i

{

p=ReceiveData();//读取数据

ACK();

}

p[n-1]=ReceiveData();

NoACK();

I2C_Stop();

return(1);

}

/***************************************************************

**名称:main()

**功能:

**输入:

**返回:

**说明:

****************************************************************/

void main()

{ uint j;

bit bp;

P1=0x00;//上电时点亮LED

do

{

bp=WriteNByte(0xa0,0x00,ucSendBuffer,8);//写入数据

}

while(~bp);

delay_10ms();

do

{

bp=ReadNByte(0xa0,0x00,ucReceiveBuffer,8);//读出数据

}

while(~bp);

while(1)

{

for(j=0;j<8;j++)

{

P1=ucReceiveBuffer[j];//将从24C02中读出的数据送LED显示delay_10ms();

}

}

}

/**************************************************************/

void delay()

{

uint i;

for(i=100;i>0;i--)

_nop_();

}

void delay_10ms()

{

uint i,j;

for(i=100;i>0;i--)

{ for(j=250;j>0;j--)

_nop_();

}

}

本程序采用软件延时的方法产生SCL脉冲,为保证有足够的延时,特延时100us,在使用时可根据要求适当调整。(如12M晶振时,只要>4.7us即可)

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)

实现存储器EEPROM AT24C02的数据读写操作 采用IIC总线读写 C程序

/*************************************************************** 功能:11:32 2008-6-27 作者:SG 时间:2004-03-15 版本:V1.0 ***************************************************************/ #include "INTRINS.H" #include "reg52.h" #define WriteDeviceAddress 0xa0 //写驱动地址指令 #define ReadDeviceAddress 0xa1 //读驱动地址指令 sbit AT24C02_SCL = 0xa4; sbit AT24C02_SDA = 0xa5; /*------------------------------------------------------------- 功能:发起始信号 ------------------------------------------------------------*/ void Start_Cond() { AT24C02_SCL = 0; _nop_(); AT24C02_SDA = 1; _nop_(); AT24C02_SCL = 1; _nop_(); AT24C02_SDA = 0; _nop_(); } /*------------------------------------------------------------- 功能:发停止信号 ------------------------------------------------------------*/ void Stop_Cond() { AT24C02_SCL = 0; _nop_(); AT24C02_SDA = 0; _nop_(); AT24C02_SCL = 1; _nop_(); AT24C02_SDA = 1; _nop_();

汇编语言程序设计报告

实验一: 一、实验目的: 1. 学习汇编语言源程序的编辑、汇编、连接、运行全过程。 2. 了解汇编程序、连接程序、DOS系统装入和返回功能。掌握MASM、LINK的应用。 3. 掌握汇编语言程序结构,熟悉汇编语言的一些常用语法规则,初步掌握汇编语言的开发过程。 4. 掌握DOS系统功能调用的基本方法。 二、实验原理 通过调用(INT 21H)表中的01h号功能号从键盘输入一个字符并回显到视频显示器上 三、实验内容及算法流程、源程序清单 实验内容:编写程序,从键盘输入一个字符并回显到视频显示器上。 源程序清单: 实验1.asm 实验1.obj 实验1.exe code segment assume cs:code start: mov ah,1 int 21h mov ah,4ch int 21h code ends end start 实验二:编写程序,显示一个字符Q 一、实验目的 1、学习汇编语言源程序的编辑、汇编、连接、运行全过程。 2、了解汇编程序、连接程序、DOS系统装入和返回功能。掌握MASM、LINK的应用。 3、掌握汇编语言程序结构,熟悉汇编语言的一些常用语法规则,初步掌握汇编语言的开发过程。 4、掌握DOS系统功能调用的基本方法。 二、实验原理 通过调用(INT 21H)表中的02h号功能显示输出一个字符Y。

三、实验内容及算法流程(流程框图)、源程序清单(要求在重要语句后写出注释) 实验内容: 编写程序,显示输出一个字符Q。 源程序清单: 实验2.asm 实验2.obj 实验2.exe code segment assume cs:code start: mov ah,02 mov dl,'Q' int 21h mov ah,4ch int 21h code ends end start 实验三:编写程序,在屏幕上显示输出“I love DOTA” 一、实验目的 1、学习汇编语言源程序的编辑、汇编、连接、运行全过程。 2、了解汇编程序、连接程序、DOS系统装入和返回功能。掌握MASM、LINK的应用。 3、掌握汇编语言程序结构,熟悉汇编语言的一些常用语法规则,初步掌握汇编语言的开发过程。 4、掌握DOS系统功能调用的基本方法。 二、实验原理 考察通过调用(INT 21H)表中的0ah号功能显示输出字符串 三、实验内容及算法流程(流程框图)、源程序清单(要求在重要语句后写出注释) 实验内容: 编写程序,在屏幕上显示输出‘I love DOTA。 源程序清单: 实验3.asm 实验3.obj 实验3.exe data segment buf db 'I love DOTA.$'

24c02读写程序教学资料

24c02读写程序

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发生从低到高的跳变,就定义为结束信号。 开始和结束信号的时序图如下图所示:

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 #include #include /***************************************************************************/ 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;

2位数计算器程序-汇编语言课程设计

信息学院课程设计题目:2位数计算器程序设计 __ 姓名: __ _____ 学号: ____ ___ 班级: 课程:汇编语言 ________ 任课教师:侯艳艳 ____ 2011年12月

课程设计任务书及成绩评定

目录 摘要 (2) 1.设计目的………………………………………………………………………………………………?2 2.概要设计………………………………………………………………………………………………?3 2.1系统总体分析…………………………………………………………………………?3 2.2程序流程图 (3) 3.详细设计......................................................................................................? (4) 3.1主程序及子程序说明 (4) 3.2程序代码编写 (4) 4.程序调试 (6) 4.1运行界面分析 (6) 4.2算法的分析 (6) 4.3调试过程及分析 (6) 5.心得体会 (7) 5.1设计体会...................................................................................................? (7) 5.2系统改进...................................................................................................? (7) 参考文献 (8)

AT24C02串行E2PROM的读写

AT24C02串行E2PROM的读写 I2C总线是一种用于IC器件之间连接的二线制总线。它通过SDA(串行数据线)及SCL(串行时钟线)两根线在连到总线上的器件之间传送信息,并根据地址识别每个器件:不管是单片机、存储器、LCD驱动器还是键盘接口。 1.I2C总线的基本结构采用I2C总线标准的单片机或IC器件,其内部不仅有I2C接口电路,而且将内部各单元电路按功能划分为若干相对独立的模块,通过软件寻址实现片选,减少了器件片选线的连接。CPU不仅能通过指令将某个功能单元电路挂靠或摘离总线,还可对该单元的工作状况进行检测,从而实现对硬件系统的既简单又灵活的扩展与控制。I2C总线接口电路结构如图1所示。 2.双向传输的接口特性传统的单片机串行接口的发送和接收一般都各用一条线,如MCS51系列的TXD和RXD,而I2C总线则根据器件的功能通过软件程序使其可工作于发送或接收方式。当某个器件向总线上发送信息时,它就是发送器(也叫主器件),而当其从总线上接收信息时,又成为接收器(也叫从器件)。主器件用于启动总线上传送数据并产生时钟以开放传送的器件,此时任何被寻址的器件均被认为是从器件。I2C总线的控制完全由挂接在总线上的主器件送出的地址和数据决定。在总线上,既没有中心机,也没有优先机。 总线上主和从(即发送和接收)的关系不是一成不变的,而是取决于此时数据传送的方向。SDA和SCL均为双向I/O线,通过上拉电阻接正电源。当总线空闲时,两根线都是高电平。连接总线的器件的输出级必须是集电极或漏极开路,以具有线“与”功能。I2C总线的数据传送速率在标准工作方式下为100kbit/s,在快速方式下,最高传送速率可达400kbit/s。 3.I2C总线上的时钟信号在I2C总线上传送信息时的时钟同步信号是由挂接在SCL时钟线上的所有器件的逻辑“与”完成的。SCL线上由高电平到低电平的跳变将影响到这些器件,一旦某个器件的时钟信号下跳为低电平,将使SCL线一直保持低电平,使SCL线上的所有器件开始低电平期。此时,低电平周期短的器件的时钟由低至高的跳变并不能影响SCL线的状态,于是这些器件将进入高电平等待的状态。 当所有器件的时钟信号都上跳为高电平时,低电平期结束,SCL线被释放返回高电平,即所有的器件都同时开始它们的高电平期。其后,第一个结束高电平期的器件又将SCL线拉成低电平。这样就在SCL线上产生一个同步时钟。可见,时钟低电平时间由时钟低电平期最长的器件确定,而时钟高电平时间由时钟高电平期最短的器件确定。 4.数据的传送在数据传送过程中,必须确认数据传送的开始和结束。在I2C总线技术规范中,开始和结束信号(也称启动和停止信号)的定义如图2所示。当时钟线SCL为高电平时,数据线SDA由高电平跳变为低电平定义为“开始”信号;当SCL线为高电平时,SDA线发生低电平到高电平的跳变为“结束”信号。开始和结束信号都是由主器件产生。在开始信号以后,总线即被认为处于忙状态;在结束信号以后的一段时间内,总线被认为是空闲的。

汇编语言程序设计报告模板总结模板计划模板.docx

《汇编语言》课程设 计报告 专业计算机科学与技术 学生姓名张竹青 班级Z计算机 151 学号1560704132 任课老师王志宏 完成日期2017年12月29日

目录 1 概述 (1) 1.1 设计目的 (1) 1.2 设计内容 (1) 2 系统需求分析 (1) 2.1 系统目标 (1) 2.2 主体功能 (1) 2.3 开发环境 (2) 3 系统概要设计 (2) 3.1 系统的功能模块划分 (2) 3.2 系统流程图 (3) 4 系统详细设计 (4) 4.1 界面设置 (4) 4.2 选择算法设置 (4) 4.3 十进制转换设置 (4) 5 测试 (5) 5.1 测试方案 (5) 5.2 测试结果 (5) 6 小结 (6) 参考文献 (7)

实现加减乘除四则运算的计算器 1 概述 1.1 设计目的 使用汇编语言,通过实现简单计算器的一般功能,如加、减、乘、除的计算来 了解并掌握 DOS系统功能的调试方法,学会画出编程的具体流程图,同时在程序 设 计过程中熟悉各种指令的应用和意义,以及如何进行上机编辑、汇编、连接和调试。 本课程设计也是对课堂上所学的基本理论知识和程序设计方法的巩固和深化, 提高我们的编程思想、分析问题和解决问题的综合应用能力,能够编写较复杂的应 用程序,最终达到熟练地掌握结构化程序设计技术和编写汇编源程序的基本方法的 目的。 1.2 设计内容 设计一个能实现加、减、乘、除计算的程序,要求该程序接受从键盘输入的十 六进制数,当程序执行时需在文件名后直接跟上计算表达式,每当读到一个有效的 表达式时对表达式进行相应的运算后,输出用十进制数或十六进制数表示的运算结果,如在命令提示符下执行结果如下: c:\tasm>js 3+2 5 2系统需求分析 2.1 系统目标 本次汇编语言课程设计的最终目的是要实现一个简单的加减乘除四则运算的 计算器,要求编写一个程序,每运行一次可执行程序,可以实现数的加减乘除四则 运算。具体功能如下: (1)调用中断把要做运算的两个数输入到屏幕上并用程序将他们存储起来 (2)判断用户所输入的运算是四则运算中的哪一种运算 (3)判断运算过程中是进位还是借位 (4)选择用何种输出方式 (5)实现清屏 2.2 主体功能 要求该程序接受的是十六进制数,执行相应的计算后,计算结果以十六进制数 或十进制数输出。本设计的使用说明如下: (1)按照提示选择数字 1,2,3,4 (2) 1: ADD 加法 (3) 2: SUB 减法 (4) 3: MUL 乘法

ATMEGA16读写iic(TWI)(24c02) C语言程序

ATMEGA16读写iic(24c02) C语言程序测试通过 #include #include "I2C.h" #include "1602.h" #include "delay.h" /*通过AVR往I IC写数据,并通过串口把数据读出显示出来*/ //=============================================================== void UART_init(void) //UART初始化 { DDRD = 0x02; PORTD = 0x00; UCSRA = 0x02; /*无倍速*/ UCSRB = 0x18; /*允许接收和发送*/ UC SRC = 0x06; /*8位数据,1位停止位,无校验*/ UBRRH = 0x00; UBRRL = 12; /*9600*/ } //=============================================================== void USART_TXD(float data) //发送采用查询方式 { while( !(UCSRA & BIT(UDRE)) ); UDR=data; while( !(UCSRA & BIT(TXC )) ); UCSRA|=BIT(TXC); } void main(void) { unsigned char i; //LCD_init(); uart_init();//TART初始化 SEI(); //全局中断使能

while(1) {/* I2C_Write('n',0x00); I2C_Write('c',0x01); I2C_Write('e',0x02); I2C_Write('p',0x03); I2C_Write('u',0x04); */ i=I2C_Read(0x00); //LCD_write_char(0,0,i); USART_TXD(i); i=I2C_Read(0x01); //LCD_write_data(i); USART_TXD(i); i=I2C_Read(0x02); //LCD_write_data(i); USART_TXD(i); i=I2C_Read(0x03); //LCD_write_data(i); USART_TXD(i); i=I2C_Read(0x04); //LCD_write_data(i); USART_TXD(i); } } /*上面上主函数部分*/ #include #include "delay.h" //I2C 状态定义 //MT 主方式传输 MR 主方式接受#define START 0x08 #define RE_START 0x10 #define MT_SLA_ACK 0x18 #define MT_SLA_NOACK 0x20 #define MT_DATA_ACK 0x28 #define MT_DATA_NOACK 0x30 #define MR_SLA_ACK 0x40 #define MR_SLA_NOACK 0x48 #define MR_DATA_ACK 0x50 #define MR_DATA_NOACK 0x58

汇编语言程序设计大纲

《汇编语言程序设计》课程教学大纲 课程编号: 0910218 课程名称:汇编语言程序设计 英文名称:Assemble Language Programming 课程类型: 专业基础课 总学时:48 讲课学时:48 实验学时:0 学分:3 适用对象: 计算机科学与技术、网络工程、信息安全及相关专业 先修课程:数字逻辑与数字系统设计、数据结构 一、课程性质、目的和任务 汇编语言程序设计是计算机科学与技术、网络工程、信息安全等专业的必修课,是进一步学习操作系统、编译、接口与通信等专业课的基础。通过本门课程的学习,学生可以加深对计算机工作原理的理解,有助于促进后续课程的学习。同时,汇编语言作为一种计算机语言工具,对于学生将来从事计算机的研究与应用是必需的,有助于提高学生的程序设计能力。 二、教学基本要求 通过本课程的学习,要求学生了解或掌握:模型机的基本结构、工作原理、寻址方式及指令系统,用汇编语言编写顺序、分支、循环、子程序、宏汇编语言程序等各种程序的技术。学会编写输入/输出程序和中断服务程序,掌握利用系统的功能调用进行程序设计的方法。掌握汇编过程和汇编程序的原理,能够正确熟练地使用编辑、汇编、链接和调试等各种软件工具。 三、教学内容及要求 1. 模型机结构。模型机系统的概述,存储器、中央处理器及外部设备与接口的基本概念、工作原理及编程方法。 2. 指令系统与寻址方式。模型机的寻址方式,机器语言指令格式,汇编语言指令系统。 3. 汇编语言程序格式。汇编程序的功能,伪操作,汇编语言程序格式。 4. 循环与分支程序设计。程序流程图的画法;分支与循环程序的设计思想与方法,重点介绍双重循环的程序设计和通过比较——判断、跳转表等方法进行分支程序设计。 5. 系统功能调用。介绍操作系统提供的BIOS、DOS等系统功能调用,学习通过功能调用进行程序设计的方法。 6. 子程序设计。子程序的设计方法,嵌套与递归子程序,堆栈在其中的应用。 7. 高级汇编语言技术。宏汇编、重复汇编、条件汇编的基本概念及其程序设计。 8. 输入输出及中断程序设计。I/O设备的数据传送方式,程序直接控制I/O方式和中断程序设计。 9. 软件工具。汇编程序、文本编辑程序、链接程序、调试程序的基本功能及汇编语言程序编写、调试、运行中的使用方法。 四、实践环节 见“汇编语言程序设计综合实验”。

汇编语言程序设计课程教学大纲.

《汇编语言程序设计》课程教学大纲 二、课程性质与教学目标 《汇编语言程序设计》是计算机科学与技术专业一门重要的基础课,是必修的核心课程之一,是"操作系统"和"微机原理和接口技术"等其它核心课程必要的先修课,而且对于训练学生掌握程序设计技术,熟悉上机操作和程序调试技术都有重要作用。因此该课程在整个教学计划中占有重要地位。 本课程的目的和要求是: 1、应使学生掌握8086/8088宏汇编语言程序设计的基本方法和技巧,能够运用8086/8088宏汇编语言编写应用程序。提高学生分析问题、解决问题的能力以及实际动手能力。 2、应使学生基本掌握汇编语言程序设计的基本理论,方法和技巧,正确地使用结构化、模块程序设计技术。注意培养学生良好的程序设计风格。 3、应使学生比较熟练地使用调试工具DEBUG调试8086/8088汇编语言程序。注意提高学生的调试能力。 4、注意与前后相关课程的关系。使学生对前导课程有进一步的理解,同时为学习后继课程打好基础。 三、教学内容及基本要求 第一单元基础知识 [知识点] 汇编语言的基本概念、数据的表示和类型、几种基本的逻辑运算、Intel 8088/8086微处理器基本概念、存储器分段和地址的形成、

[教学内容] 1.以二进制存在的机器语言。计算机内部数的存储及运算也都是采用二进制。 2.制数的值由1所在位置的权来确定。 3.进制是一种很重要的短格式记数法,它把二进制数每4位分成一组,分别用0-9和 A-F来表示0000-1111。反之,16进制数的每一位用四位二进制表示,就是相应的二进制数。 4.十进制转换为二进制的方法主要有降幂法和除法。计算机十化二程序中采取下面的算法: 5.标志位OF=1表示带符号数的运算结果无效。CF=1表示无符号数运算结果无效。 6.计算机中的字符数据用ASCⅡ码表示,一个字符在存储器中占用一个字节(8位二进制码)。 7.BCD码是一种用二进制编码的十进制数,又称二-十进制数或8421码,它用4位二进制数表示一个十进制数码。BCD码有压缩和非压缩两种格式,压缩的BCD码用4位二进制数表示一个十进制数位,如95 表示为1001,0101。非压缩的BCD码用地位二进制数表示一个十进制数位。如95 表示为00001001 00000101。 8.两种类型的内部存储器是ROM(只读存储器)和RAM(随机存储器)。存储器按字节编址,存储器地址一般用16进制的无符号数表示。 9.字数据在存储器中存放的顺序为高地址字节放高8位,低地址字节放低8位。 10.AX、BA、CA、和DX是通用寄存器,每个通用寄存器可作两个8位寄存器使用(如AH和AL)。 11.一个20位的物理地址可表示成段地址:偏移地址。计算存储器单元的物理地址,可将段地址乘以10H,再加上偏移地址。 物理地址=(段地址×10H)+偏移地址 12.段寄存器CS、SS、DS和ES分别寄存代码段、堆栈段、数据段和附加段的段地址。 13.变址寄存器SI和DI一般指示数据段内单元的地址,有时也可作为数据寄存器用。 14.16位的标志寄存器个包括6个状态标志(SF、ZF、PF、CF、AF、OF)和3个控制标志(DF、IF、TF)。(CF、AF、SF、ZF和OF反映了算术运算以及移位、循环、逻辑等操作的结果状态。 [重难点] 1.教学重点 1.汇编语言的基本概念 (1)机器语言,汇编语言,汇编程序,汇编语言源程序,目标程序,目标代码,可执行程序。 (2)汇编语言的特点 (3)为什么要学习汇编语言,汇编语言的应用场合。 2.数据的表示和类型 (1)数值数据的表示,符号扩展,数值数据的表示范围,BCD码,不同数据之间的转换。 (2)非数值数据类型:字节、字、双字等。 3.几种基本的罗辑运算 “与”、“或”、“非”、“异或” 4.Intel 8088/8086微处理器基本概念 (1)8086/8088基本结构:执行单元EU,总线接口单元BIU,指令的执行次序。

STM32F103读写24C02程序使用过肯定能用

//实验24C02连接在PF口 //WP、A0、A1、A2都接地 #include "stm32f10x_flash.h" #include "stm32f10x_gpio.h" #include "stm32f10x_rcc.h" #define AT24C02 0xa0 //AT24C02 地址 /******************************** 变量定义---------------------------------------------------------*/ GPIO_InitTypeDef GPIO_InitStructure; //GPIO ErrorStatus HSEStartUpStatus; unsigned char Count1 , Count2; unsigned int USEC; static vu32 TimingDelay; unsigned char Readzfc; unsigned char pDat[8] = {0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55}; unsigned char R_Dat[8]; /*********************************声明函数-----------------------------------------------*/ void RCC_Configuration(void); void SysTick_Configuration(void); void Delay_us_24C02(u32 nTime); /************************************24C02硬件接口******************************/ #define SData GPIO_Pin_6 //I2C 时钟 #define SCLK GPIO_Pin_7 //I2C 数据 /********************************宏定义*******************************************/ #define SCL(x) x ? GPIO_SetBits(GPIOF , SCLK) : GPIO_ResetBits(GPIOF , SCLK) #define SDA(x) x ? GPIO_SetBits(GPIOF , SData) : GPIO_ResetBits(GPIOF , SData) /********************************变量*******************************************/ u8 ack; /******************************************************************* 起动总线函数 函数原型: void Start_I2c(); 功能: 启动I2C总线,即发送I2C起始条件. ********************************************************************/ void Start_I2c() { SDA(1); //SDA=1; 发送起始条件的数据信号 Delay_us_24C02(1); SCL(1); //SCL=1; Delay_us_24C02(5); //起始条件建立时间大于4.7us,延时 SDA(0); //SDA=0; /*发送起始信号*/ Delay_us_24C02(5); // 起始条件锁定时间大于4μs

应广单片机读写24C02程序代码

应广单片机读写24C02程序代码 #include "extern.h" #include "main.h" //*************************************************** //*************************************************** //??ò?I2C?ó?ú I2C_SDA equ pb.2 I2C_SCL equ pb.0 I2C_SDA_DIR equ pbc.2 I2C_SCL_DIR equ pbc.0 I2C_LONG_DLY equ 50 I2C_SHORT_DLY equ 20 I2C_SDA_HIGH equ set1 I2C_SDA I2C_SDA_LOW equ set0 I2C_SDA I2C_SCL_HIGH equ set1 I2C_SCL I2C_SCL_LOW equ set0 I2C_SCL I2C_SDA_OUTPUT equ set1 I2C_SDA_DIR I2C_SDA_INPUT equ set0 I2C_SDA_DIR I2C_SCL_OUTPUT equ set1 I2C_SCL_DIR I2C_SCL_INPUT equ set0 I2C_SCL_DIR //??ò?I2C??á? uchar i2c_rw_addr; //?áD?μ??? uchar i2c_rw_byte; //?áD?êy?Y uchar i2c_rw_cmd; //?áD?μ????tμ??? uchar i2c_rw_temp; //?áD??y?ì?D????á? uchar i2c_rw_cnt; //?áD??y?ì?D????á? //---------------------------- //?úéúSTARTD?o? //---------------------------- i2c_start: I2C_SDA_OUTPUT

怎么实现对存储器24C02程序的读写

决 怎么实现24C02程序的读写 我是个新手,对24C02 一窍不通,请问怎么给24C02写程序。是不是要像给单片机写程序那样需要一个编程器,或是需要其他的什么软硬件。另外再给我介绍一些24C02的入门知识,谢谢。 问题补充: 24C02是不是只是一个存储器?使用它时需不需要专门给它写段程序再烧进去? 我们将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 //包括一个52 标准内核的头文件 //本课试验写入一个字节到24c02 中 char code dx516[3] _at_ 0x003b;//这是为了仿真设置的 #define WriteDeviceAddress 0xa0 //定义器件在IIC 总线中的地址 #define ReadDviceAddress 0xa1 sbit 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--) ; } } //开始总线

《汇编语言程序设计》教案

授课题目第七章更灵活地定位内存地址的方法课时安排4学时一、教学目的 通过本次课程学习,让学生 1.掌握and与or指令 2.掌握大小写之母的转换 3.掌握SI和DI寄存器 4.掌握内存地址的多种定位方法 二、教学重点 1.and与or指令 2.定位内存地址的多种方法 三、教学难点 1.灵活运用and与or指令 2.灵活运用地址定位方法 四、教学方法(请打√):讲授√□ 讨论□ 课堂练习√□ 实验□ 其他□ 五、教学手段(请打√):多媒体√□ 模型□ 实物□ 挂图□ 音像□ 其他□ 六、教学内容及过程 1. 课程引入 (约 5 分钟) 我们已经学过了用bx来保存内存的偏移地址,也可以用cs:[idata]的方法来访问内存单元,还有没其他的内存地址定位方法? 我们已知一组由英文字母组成的字符串,如何将这些字符进行大小写的转换? 2. and和or指令 (约15分钟) (1)and指令 and指令是逻辑与指令,按位进行与运算。 (2)or指令 or指令是逻辑或指令,按位进行或运算。 3. 关于ASCII码 (约10分钟) 编码方案,就是一套规则,它约定了用什么样的信息来表示现实对象。ASCII码就是一种编码方案。 4. 以字符形式给出的数据 (约10分钟) 汇编程序中,用 ‘……’的方式指明数据是以字符的形式给出的,编译器将把它们转化为相对应的ASCII码。

Db表示定义字节型数据,即define byte。 例题分析。 5 大小写转换的问题 (约25分钟) 大写字母与小写字母的ASCII码相差20H,因此可以利用这个规律进行大小写转换。但是前提条件是需要知道该字母是大写字母还是小写字母。 例题分析。 目前我们尚未学习判断字母是大小写的问题,那么如何应用学过的知识进行大小写字母的转换。 就ASCII码的二进制形式来看,除第5位(位数从0开始计算)外,大写字母和小写字母的其他各位都一样。大写字母ASCII码的第5位(位数从0开始计算)为0,小写字母的第5位为1。因此就可以利用大小写字母的这个特点以及or指令和and指令进行大小写转换。 6 [bx+idata] (约10分钟) [bx]指明一个内存单元。 [bx+idata]也指明一个内存单元,它的偏移地址为(bx)+idata。 mov ax,[bx+200]也可以写成mov ax,[200+bx]、 mov ax,200[bx]、mov ax,[bx].200问题7.1。 7 用[bx+idata]处理数组 (约15分钟) (1)利用[bx+idata]的方式,就可以用更简化的方法来编写代码。 (2)例题分析。 (3)[bx+idata]与高级语言的比较。 [bx+idata]的方式为高级语言实现数组提供了便利机制 8 SI和DI (约15分钟) (1) SI和DI寄存器 SI和DI与bx功能相近的寄存器,SI和DI不能够分成两个8 位寄存器来使用。 (2)例题分析。 (3)问题7.2分析 用ds:si指向源字符串的地址,ds:di 指向复制的目的地址。 问题7.2的简化。利用[bx(si或di)+idata]可以进一步简化代码。 9 [bx+si]和[bx+di] (约15分钟) (1)[bx+si]和[bx+di]的含义 [bx+si]和[bx+di]的含义相似,[bx+si](或[bx+di])表示一个内存单元,它的偏移地址为(bx)+(si)(即bx中的数值加上si中的数值)。 (2)问题分析 10 [bx+si+idata]和[bx+di+idata] (约20分钟)

E2PROM芯片24C02的读写程序

E2PR0M 芯片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总线接口的器件): SDA SCL|| || || || 微控制器LCD驱动ADC E2PR0M 我们知道单片机串行通讯的发送和接收一般都各用一条线TXD和RXD,而I2C总线的数据 线既可以发送也可以接受,工作方式可以通过软件设置。所以,I2C总线结构的硬件结构非 常简洁。 当某器件向总线上发送信息时,它就是发送器,而当其从总线上接收信息时,又成为接收器。(三)、I2C总线上的数据传送 下面我们看看I2C总线是如何进行数据传送的。我们知道,在一根数据线上传送数据时必须 一位一位的进行,所以我们首先研究位传送。 1、位传输 I2C总线每传送一位数据必须有一个时钟脉冲。被传送的数据在时钟SCL的高电平期间保 持稳定,只有在SCL低电平期间才能够改变,示意图如下图所示,在标准模式下,高低电平宽度必须不小于 4.7us。

《汇编语言程序设计》学习总结与心得

《汇编语言程序设计》学习总结与心得 其实说实话在学这门课之前自己对汇编语言一点都不了解,只知道它也是一种语言,而且是一门很少用的语言,可能很多人都是这么想的,或许在学这门课之前不少同学也有和我当初一样的思想,大概学学就好,反正以后很少能用到,毕竟现在高级语言这么发达,而且运用起来灵活易懂,像汇编这种低级语言又难又不易学。或许老师是知道我们之前有这种想法,所以第一节课就跟我们讲解了一下了汇编语言在当今这种高速发展的社会的作用和地位,让我们能够正确的认识汇编语言的精华,正确对待这么课。而且还在课堂了百度了汇编语言的招聘信息,或许这才是使我们正确对待汇编的最直接的原因,关系到我们以后的出路,或许我们学好了一门汇编,以后出去找工作的机会不就更广了吗?正是在这种动力的驱使下我才对汇编语言有了一个新的认识,而且决定要把它学好。 在后来的学习中我发现其实汇编不是很难学,其实学汇编就像学其他的高级语言一样,高级语言要求对语言非常了解。在学汇编的过程中,我们最重要的就是要掌握汇编语言中的指令的一些基本用法。当然要能够真正的了解其中的内涵,这样我们在实际的编程中也能够像运用高级语言一样灵活的变通。汇编语言作为一种低级程序设计语言,既然是低级所以应该是最底层的,与我们计算机内部的结构联系应该联系很密切,而且在我们学习中也深刻的了解到了这一点。比如说后来学到的寄存器、中断、还要各种寻址方式以及进栈出栈,好多的就是设计到计算机硬件。前面几章都是对计算机内部结构和一些常用的指令以及寻址方式的寻址方式。到后面学到子程序以及宏的作用才真正发现到其实跟高级语言差别不大。以C语言为例,C语言不也是由一个一个的函数组成的吗?没想到想汇编这样的低级语言也可以这样。在汇编语言的子程序和宏中,我个人更感觉宏的运用更像我们高级语言的子函数,通过定义好的宏,我们在后面直接调用就可以了。尤其是宏带参数的宏跟C语言中带参数的函数真的很像,根据参数的不同调用宏就能得到不同的结果。而汇编中的子程序没有这个传递参数这个功能。在调用子程序的时候要注意各寄存器中的内容。子程序是在程序执行期间由主程序调用的,它只占有它自身大小的一个空间,他不仅是源程序级别简化,形成的目标代码较短;而宏调用则是在汇编期间展开的,每调用依次进把宏定义体展开一次,它是源程序级的简化。因而它占有的存储空间与调用次数有关,调用次数越多则占有的存储空间越大。如果宏调用次数较多的话,则其空间上的开销也是应该考虑的因素 汇编程序给人感觉最烦的就是好多程序的结果不能直接通过运行EXE文件显示出来,而更多的是经过DEBUG单步调试才能看到其内在变化,看是否正确。在初次接触汇编的几个汇编工具时,有一种神奇的感觉,因为汇编程序不像其他的高级语言一样需要编译器,而是直接的就能在记事本上编写,然后进行汇编和

相关主题
文本预览
相关文档 最新文档