单片机入门基础知识大全免费下载 单片机第八课(寻址方式与指令系统) 通过前面的学习,我们已经了解了单片机内部的结构,并且也已经知道,要控制单片机,让它为我们干学,要用指令,我们已学了几条指令,但很零散,从现在开始,我们将要系统地学习8051的指令部份。 一、概述 1、指令的格式 我们已知,要让计算机做事,就得给计算机以指令,并且我们已知,计算机很“笨”,只能懂得数字,如前面我们写进机器的75H,90H,00H等等,所以指令的第一种格式就是机器码格式,也说是数字的形式。但这种形式实在是为难我们人了,太难记了,于是有另一种格式,助记符格式,如MOV P1,#0FFH,这样就好记了。 这两种格式之间的关系呢,我们不难理解,本质上它们完全等价,只是形式不一样而已。 2、汇编 我们写指令使用汇编格式,而计算机只懂机器码格式,所以要将我们写的汇编格式的指令转换为机器码格式,这种转换有两种方法:手工汇编和机器汇编。手工汇编实际上就是查表,因为这两种格式纯粹是格式不同,所以是一一对应的,查一张表格就行了。不过手工查表总是嫌麻烦,所以就有了计算机软件,用计算机软件来替代手工查表,这就是机器汇编。 二、寻址 让我们先来复习一下我们学过的一些指令:MOV P1,#0FFH,MOV R7,#0FFH这些指令都是将一些数据送到相应的位置中去,为什么要送数据呢?第一个因为送入的数可以让灯全灭掉,第二个是为了要实现延时,从这里我们可以看出来,在用单片机的编程语言编程时,经常要用到数据的传递,事实上数据传递是单片机编程时的一项重要工作,一共有28条指令(单片机共111条指令)。下面我们就从数据传递类指令开始吧。 分析一下MOV P1,#0FFH这条指令,我们不难得出结论,第一个词MOV是命令动词,也就是决定做什么事情的,MOV是MOVE少写了一个E,所以就是“传递”,这就是指令,规定做什么事情,后面还有一些参数,分析一下,数据传递必须要有一个“源”也就是你要送什么数,必须要有一个“目的”,也就是你这个数要送到什么地方去,显然在上面那条指令中,要送的数(源)就是0FFH,而要送达的地方(目的地)就是P1这个寄存器。在数据传递类指令中,均将目的地写在指令的后面,而将源写在最后。 这条指令中,送给P1是这个数本身,换言之,做完这条指令后,我们可以明确地知道,P1中的值是0FFH,但是并不是任何时候都可以直接给出数本身的。例如,在我们前面给出的延时程序例是这样写的: MAIN: SETB P1.0 ;(1) LCALL DELAY ;(2) CLR P1.0 ;(3) LCALL DELAY ;(4) AJMP MAIN ;(5) ;以下子程序 DELAY: MOV R7,#250 ;(6) D1: MOV R6,#250 ;(7) D2: DJNZ R6,D2 ;(8) DJNZ R7,D1 ;(9) RET ;(10) END ;(11) 表1 MAIN: SETB P1.0 ;(1) MOV 30H,#255 LCALL DELAY ; CLR P1.0 ;(3) MOV 30H,#200 LCALL DELAY ;(4) AJMP MAIN ;(5) ;以下子程序 DELAY: MOV R7,30H ;(6) D1: MOV R6,#250 ;(7) D2: DJNZ R6,D2 ;(8) DJNZ R7,D1 ;(9) RET ;(10) END ;(11) 表2 这样一来,我每次调用延时程序延时的时间都是相同的(大致都是0.13S),如果我提出这样的要求:灯亮后延时时间为0.13S灯灭,灯灭后延时0.1秒灯亮,如此循环,这样的程序还能满足要求吗?不能,怎么办?我们可以把延时程序改成这样(见表2):调用则见表2中的主程,也就是先把一个数送入30H,在子程序中R7中的值并不固定,而是根据30H单元中传过来的数确定。这样就可以满足要求。 从这里我们可以得出结论,在数据传递中要找到被传递的数,很多时候,这个数并不能直接给出,需要变化,这就引出了一个概念:如何寻找操作数,我们把寻找操作数所在单元的地址称之为寻址。在这里我们直接使用数所在单元的地址找到了操作数,所以称这种方法为直接寻址。除了这种方法之外,还有一种,如果我们把数放在工作寄存器中,从工作寄存器中寻找数据,则称之为寄存器寻址。例:MOV A,R0就是将R0工作寄存器中的数据送到累加器A中去。提一个问题:我们知道,工作寄存器就是内存单元的一部份,如果我们选择工作寄存器组0,则R0就是RAM的00H单元,那么这样一来,MOV A,00H,和MOV A,R0不就没什么区别了吗?为什么要加以区分呢?的确,这两条指令执行的结果是完全相同的,都是将00H单元中的内容送到A中去,但是执行的过程不同,执行第一条指令需要2个周期,而第二条则只需要1个周期,第一条指令变成最终的目标码要两个字节(E5H 00H),而第二条则只要一个字节(E8h)就可以了。 这么斤斤计较!不就差了一个周期吗,如果是12M的晶振的话,也就1个微秒时间了,一个字节又能有多少? 不对,如果这条指令只执行一次,也许无所谓,但一条指令如果执行上1000次,就是1毫秒,如果要执行1000000万次,就是1S的误差,这就很可观了,单片机做的是实时控制的事,所以必须如此“斤斤计较”。字节数同样如此。 再来提一个问题,现在我们已知,寻找操作数可以通过直接给的方式(立即寻址)和直接给出数所在单元地址的方式(直接寻址),这就够了吗? 看这个问题,要求从30H单元开始,取20个数,分别送入A累加器。 就我们目前掌握的办法而言,要从30H单元取数,就用MOV A,30H,那么下一个数呢?是31H单元的,怎么取呢?还是只能用MOV A,31H,那么20个数,不是得20条指令才能写完吗?这里只有20个数,如果要送200个或2000个数,那岂不要写上200条或2000条命令?这未免太笨了吧。为什么会出现这样的状况?是因为我们只会把地址写在指令中,所以就没办法了,如果我们不是把地址直接写在指令中,而是把地址放在另外一个寄存器单元中,根据这个寄存器单元中的数值决定该到哪个单元中取数据,比如,当前这个寄存器中的值是30H,那么就到30H单元中去取,如果是31H就到31H单元中去取,就可以解决这个问题了。怎么个解决法呢?既然是看的寄存器中的值,那么我们就可以通过一定的方法让这里面的值发生变化,比如取完一个数后,将这个寄存器单元中的值加1,还是执行同一条指令,可是取数的对象却不一样了,不是吗。通过例子来说明吧。 MOV R7,#20 MOV R0,#30H LOOP:MOV A,@R0 INC R0 DJNZ R7,LOOP 这个例子中大部份指令我们是能看懂的,第一句,是将立即数20送到R7中,执行完后R7中的值应当是20。第二句是将立即数30H送入R0工作寄存器中,所以执行完后,R0单元中的值是30H,第三句,这是看一下R0单元中是什么值,把这个值作为地址,取这个地址单元的内容送入A中,此时,执行这条指令的结果就相当于MOV A,30H。第四句,没学过,就是把R0中的值加1,因此执行完后,R0中的值就是31H,第五句,学过,将R7中的值减1,看是否等于0,不等于0,则转到标号LOOP处继续执行,因此,执行完这句后,将转去执行MOV A,@R0这句话,此时相当于执行了MOV A,31H(因为此时的R0中的值已是31H了),如此,直到R7中的值逐次相减等于0,也就是循环20次为止,就实现了我们的要求:从30H单元开始将20个数据送入A中。 这也是一种寻找数据的方法,由于数据是间接地被找到的,所以就称之为间址寻址。注意,在间址寻址中,只能用R0或R1存放等寻找的数据。 二、指令 数据传递类指令 1) 以累加器为目的操作数的指令 MOV A,Rn MOV A,direct MOV A,@Ri MOV A,#data 第一条指令中,Rn代表的是R0-R7。第二条指令中,direct就是指的直接地址,而第三条指令中,就是我们刚才讲过的。第四条指令是将立即数data送到A中。 下面我们通过一些例子加以说明: MOV A,R1 ;将工作寄存器R1中的值送入A,R1中的值保持不变。 MOV A,30H ;将内存30H单元中的值送入A,30H单元中的值保持不变。 MOV A,@R1 ;先看R1中是什么值,把这个值作为地址,并将这个地址单元中的值送入A中。如执行命令前R1中的值为20H,则是将20H单元中的值送入A中。 MOV A,#34H ;将立即数34H送入A中,执行完本条指令后,A中的值是34H。 2)以寄存器Rn为目的操作的指令 MOV Rn,A MOV Rn,direct MOV Rn,#data 这组指令功能是把源地址单元中的内容送入工作寄存器,源操作数不变。
上传时间: 2013-10-13
上传用户:3294322651
DAC0832是一个8位D/A转换器芯片,单电源供电,从+5V~+15V均可正常工作,基准电压的范围为±10V,电流建立时间为1μs,CMOS工艺,低功耗20mW。其内部结构如图9.1所示,它由1个8位输入寄存器、1个8位DAC寄存器和1个8位D/A转换器组成和引脚排列如图1所示。 • DAC0832工作方式• ADC0809工作方式要求掌握:• MCS-51单片机与D/A转换器的接口连接• MCS-51单片机与A/D转换器的接口连接• 初始化编程及应用了解:• 典型D/A转换器芯片DAC0832的管脚功能• 典型A/D转换器芯片ADC0809的管脚功能
上传时间: 2014-01-14
上传用户:zl520l
TLC5510 是美国德州仪器公司生产的8位闪速结构模数转换器,采用CMOS 工艺制造,采样速率高达20MSPS。广泛用于数字TV、医学图像、视频会议、高速数据转换以及QAM解调器等方面。本文介绍了TLC5510 的性能指标、引脚功能、内部结构和操作时序,给出了TLC5510 与MCS-51 单片微机的接口应用电路设计、软件设计及参考电压的配置方法。
上传时间: 2013-11-13
上传用户:wangzhen1990
S51编程器制作包:自制AT89S51编程器教程AT89S51芯片的日渐流行,对我们单片机初学者来说是一个大好消息。因为做个AT89S51编程器非常容易,而且串行编程模式更便于做成在线编程器,给频繁烧片,调试带来了巨大的方便。 电路: 只要焊13根线就可以搞定这个电路。基本原理:RST置高电平,然后向单片机串行发送 编程命令。P1.7(SCK)输入移位脉冲,P1.6(MISO)串行输出,P1.5(MOSI)串行输入(要了解详细编程原理可以去看AT89S51的数据手册)。使用并口发出控制信号,74373只是用于信号转换,因为并口直接输出高电平的电压有点没到位,使用其他芯片也可以,还有人提出直接接电阻。并口引脚1控制P1.7,引脚14控制P1.5,引脚15读P1.6,引脚16控制RST,引脚17接74373 LE(锁存允许),18-25这些引脚都可以接地。建议在你的单片机系统板上做个6芯的接口。注意:被烧写的单片机一定是最小系统(单片机已经接好电源,晶振,可以运行),VCC,GND是给74373提供电源的。 还有一个方案:使用串口+单片机,这个方案已经用了半年了。电路稍微麻烦一点,速度比较快,而且可以烧AT89C51等等。其实许多器件编程原理差不多,由于我没太多时间研究器件手册,更没有MONEY买一堆芯片来测试,所以只实现了几个最常用单片机编程功能(AT89C51,C52,C55,AT89S51,S52,S53)。如果要烧写其他单片机,你可以直接编写底层控制子程序(例如,写一个单元,读一个单元,擦除ROM的子程序)。如果有需要,我可以在器件选择栏提供一个“X-CHIP”的选择,“X-CHIP”的编程细节将由用户自己去实现。当你仔细阅读器件手册后,会发现实现这些子程序其实好容易,这也是初学者学单片机编程的好课题。如果成功了会极大的提高你学单片机的积极性。 软件: 这个软件的通信,控制部分早在半年前就完成了,这回只是换了个界面和加入并口下载线的功能,希望你看到这个软件不会想吐。使用很简当,有一点特别,当你用鼠标右键点击按钮后,可以把相关操作设置为自动模式(只有打开文件,擦除芯片,写FLASH ROM,读FLASH ROM,效验数据 可以设置),点击‘自动完成’后会依次完成这些操作,并在开始时检测芯片。当“打开文件”设为自动后,第2次烧写同一个文件时不必再去打开文件,软件会自动刷新缓冲。软件在WIN XP,WIN 2000可以使用(管理员登陆的),在WIN 98 ,WIN ME使用并口模式时会更快些。这个软件同时支持串口编程器和并口下载线。操作正常结束后会有声音提示。如果没有声卡或声卡烂了,则声音会从机箱扬声器中发出。注意:记得在CMOS设置中把并口设为ECP模式。就这些东西,应该够详细吧,还有什么问题或遇到什么困难可以联系我,软件出现什么问题一定要通知我修正。祝你一次就搞定。
上传时间: 2014-01-24
上传用户:13162218709
PHILIPS 的P89LPC900 系列FLASH 单片机部分型号提供了8 位精度的AD 转换器,为许多控制系统带来方便,诸如温度控制、运动控制等,在MCU 发出控制指令后,常常需要将执行机构的情况反馈给MCU,从而构成一个闭环系统,达到精细控制的目的。这一检测过程一般由各种传感器完成,在某些对成本有高要求的场合,为了控制成本,也常使用一些简单的分立元件替代数字传感器,通常送到MCU 接口的都是一些经过处理的电压信号,内带ADC 的芯片能够简化设计,并使成本进一步降低。一般来说,8 位的AD 精度已经足以应对,但是在一些对精度要求比较高的场合,可能会需要10 位或者更高精度,细心的用户通过仔细研究P89LPC900 单片机的特点,发现P89LPC900 系列单片机ADC 的特点非常适合进行ADC 过采样,本文正是结合P89LPC900 的特点,介绍该单片机在高精度模数转换场合的应用,以及使用过采样技术需要满足的条件和需注意事项。使这种低成本高精度的AD技术得以应用。
上传时间: 2013-10-11
上传用户:gokk
PCA9519 是一个4 通道的I2C 总线/SMBus 中继器,可以实现将低电压两线串行总线接口的处理器与标准的I2C 总线或SMBus I/O 相连。该中继器在电平转换中保持I2C 总线系统所有的模式和特点的同时,允许通过给数据总线(SDA)和时钟总线(SCK)提供双向缓冲区来扩展I2C 总线,从而使I2C 总线或SMBus 在高电压下最大容限电容为400PF。SDA 和SCL 引脚具有耐压保护功能,当PCA9519 掉电时,均呈现出高阻抗特性。
上传时间: 2013-11-23
上传用户:brilliantchen
PCA9547 是一款通过I2C 总线控制的八进制双向转换开关。它的每对SCL/ SDA 上行通道可以扩展为八对下行通道。但在某一时刻,由可编程控制寄存器中的内容来决定只有一路SCx/SDx 被选择。由多路复用器的通门,VDD 管脚可以用来限制PCA9547 通过的最高电压,这使得每一对SCL/SDA 可以使用不同的总线电压,因此1.8V、2.5V 或3.3V 的器件都可以在无其它保护的情况下与5V 的器件进行通信。它的外部上拉电阻将总线拉高至每个通道所要求的电压电平,所有I/O 管脚都可以承受5V 的电压。设备上电时由通道0 连接,并且允许主机和下行设备进行直接的通信
上传时间: 2014-12-28
上传用户:sunshine1402
PCA9548A 是一款通过I2C 总线控制的八进制双向转换开关。它的每对SCL/ SDA 上行通道可以扩展为八对下行通道,可以通过可编程控制寄存器的内容来选择任意单一的SCx/SDx 通道或者组合通道。由多路复用器的通门,VDD 管脚可以用来限制PCA9547 通过的最高电压,这使得每一对SCL/SDA 都可以使用不同的总线电压,因此1.8V、2.5V 或3.3V的器件可以在无其它保护的情况下与5V 的器件进行通信。它的外部上拉电阻将总线拉高至每个通道所要求的电压电平,所有I/O 管脚都可以承受5V 电压。
上传时间: 2013-10-13
上传用户:hanli8870
RSM232隔离RS-232收发器具备电源隔离、电气隔离、RS-232收发器,有提高系统稳定性,简化设计等诸多优点。完全符合EIA/TIA-232E和ITU-T V.28规格,采用5V电源供电,具有2500VDC的隔离电压,波特率可高达115200bps
上传时间: 2014-02-22
上传用户:ouyangtongze
MSP430F413实现的智能遥控器设计:MSP430F413 单片机是TI 公司最近推出的超低功耗混合信号16 位单片机系列中的一种。它采用16 位精简指令系统,125ns 指令周期,大部分的指令在一个指令周期内完成,16 位寄存器和常数发生器,发挥了最高的代码效率,而且片内含有硬件乘法器,大大节省运算的时间。该芯片采用低功耗设计,具有五种低功耗模式,供电电压范围为1.8~3.6V,在工作模式下:2.2 伏工作电压1MHz 工作频率时电流为225uA;在待机模式电流为0.7uA;掉电模式(RAM 数据保持不变)电流为0.1uA。所以特别适用长期使用电池工作的场合。它采用数字控制振荡器(DCO),使得从低功耗模式到唤醒模式的转换时间小于6us。该芯片具有8KB+256B Flash Memory,256B RAM,采用串行在线编程方式,为用户编译程序和控制参数提供灵活的空间,内部的安全保密熔丝可使程序不必非法复制。此外,MSP430F413 具有强大的中断功能,48 个通用I/O 引脚,96 段LCD 驱动器,一个16 位定时器,这样提高了对外围设备的开发能力。
上传时间: 2013-11-08
上传用户:bruce5996