c51单片机汇编


51 单片机汇编语言教程-慧净电子会员收集整理 (全部 28课) 推荐使用慧净 51实验板。推荐 51学习网 WWW.HLMCU.COM 淘宝网:http://shop37031453.taobao.com/ 51单片机汇编语言教程:第1课:单片机简叙 (基于 HJ-1G、HJ-3G 实验板) 1、什么是单片机 一台能够工作的计算机要有这样几个部份构成:CPU(进行运算、控制)、 RAM(数据存储)、ROM(程序存储)、输入/输出设备(例如:串行口、并行输出口等)。 在个人计算机上这些部份被分成若干块芯片,安装一个称之为主板的印刷线路板上。而在单 片机中,这些部份,全部被做到一块集成电路芯片中了,所以就称为单片(单芯片)机,而 且有一些单片机中除了上述部份外,还集成了其它部份如 A/D,D/A 等。 单片机是一种控制芯片,一个微型的计算机,而加上晶振,存储器,地址锁存器,逻辑 门,七段译码器(显示器),按钮(类似键盘),扩展芯片,接口等那是单片机系统。 PC 中的CPU 一块就要卖几千块钱,这么多东西做在一起,还不得买个天价!再说这块 芯片也得非常大了。 不,价格并不高,从几元人民币到几十元人民币,体积也不大,一般 用40脚封装,当然功能多一些单片机也有引脚比较多的,如 68引脚,功能少的只有 10多 个或20多个引脚,有的甚至只 8只引脚。 为什么会这样呢? 功能有强弱,打个比方,市场上面有的组合音响一套才卖几百块钱,可是有的一台功放 机就要卖好几千。另外这种芯片的生产量很大,技术也很成熟,51系列的单片机已经做了 十几年,所以价格就低了。 既然如此,单片机的功能肯定不强,干吗要学它呢? 话不能这样说,实际工作中并不是任何需要计算机的场合都要求计算机有很高的性能,一个 控制电冰箱温度的计算机难道要用 PIII?应用的关键是看是否够用,是否有很好的性能价格 比。所以 8051 出来十多年,依然没有被淘汰,还在不断的发展中。 2、MCS51 单片机和 8051、8031、89C51 等的关系 我们平常老是讲 8051,又有什么 8031,现在又有 89C51、89s51、STC89C52 它们之间究竟 是什么关系? MCS51 是指由美国 INTEL 公司(对了,就是大名鼎鼎的 INTEL)生产的一系列单片机 的总称,这一系列单片机包括了好些品种,如 8031,8051,8751,8032,8052,8752 等, 其中8051 是最早最典型的产品,该系列其它单片机都是在 8051 的基础上进行功能的增、减、 改变而来的,所以人们习惯于用 8051 来称呼 MCS51 系列单片机,而8031 是前些年在我国 最流行的单片机,所以很多场合会看到 8031 的名称。INTEL 公司将 MCS51 的核心技术授 权给了很多其它公司,所以有很多公司在做以 8051 为核心的单片机,当然,功能或多或少 有些改变,以满足不同的需求,其中 89C51 就是这几年在我国非常流行的单片机,它是由 美国ATMEL 公司开发生产的。以后我们将用 STC89C52 单片机来完成一系列的实验。 51实验板推荐(点击下面的图片可以进入下载资料链接) HJ-1G HJ-3G 51 单片机汇编语言教程-慧净电子会员收集整理 (全部 28课) 推荐使用慧净 51实验板。推荐 51学习网 WWW.HLMCU.COM 淘宝网:http://shop37031453.taobao.com/ 重要说明 1111、本教程是《共享人》网上收整理,版权归互联网,全部免费 共享,为了支持慧净免费助学加上了慧净 51515151实验板的链接。 2222、教程中的实验不保证 100%100%100%100%正确,当你能认真学习时你会有 能力修正实验中的小错误。 3333、请不要再问如何学单片机,如何写程序,为什么这样写程序 的问题,共享人不提供源码分析,如果你有心学单片机的,全部 由你自己自学完成,推荐你用慧净电子的 HJ-3G HJ-3G HJ-3G HJ-3G 实验板配套学 习。 4444、祝你学业有成,以后多点共享各种单片机资料,使中国电子 技术更强。 共享人 2009 2009 2009 2009 年1111月1111日 51单片机汇编语言教程-由慧净助学会员收集整理 (全部 28课) 推荐使用慧净 51实验板。推荐 51学习网 WWW.HLMCU.COM 淘宝网:http://shop37031453.taobao.com/ 51单片机汇编语言教程:第 2课-单片机引脚介绍 (基于 HJ-1G、HJ-3G 实验板) STC89C52 单片机引脚功能介绍 首先我们来认识一下 51单片机芯片的引脚图,具体功能在下面介绍。 单片机的 40个引脚大致可分为 4类:电源、时钟、控制和 IO引脚。 ⒈ 电源 ⑴ VCC- 芯片电源,接+5V;当然也有 3.3V 供电的芯片。 ⑵ VSS- 接地端; ⒉ 时钟XTAL1、XTAL2 - 晶体振荡电路反相输入端和输出端。 ⒊ 控制线控制线共有 4根, ⑴ ALEPROG 地址锁存允许片内 EPROM 编程脉冲(旧的AT89C51 用到,最新的 51芯片可以在 线编程,一条 USB 线搞定单片机,下面的说明不理解的可以不用看,因为最新的 51芯片都 没有了 VPP功能了。) ① ALE功能:用来锁存 P0口送出的低 8位地址 ② PROG功能:片内有 EPROM 的芯片,在 EPROM 编程期间,此引脚输入编程脉冲。 ⑵ PSEN外ROM 读选通信号。 ⑶ RSTVPD 复位备用电源。 ① RST(Reset)功能:复位信号输入端。 ② VPD功能:在 Vcc 掉电情况下,接备用电源。 ⑷ EAVpp 内外ROM选择片内 EPROM 编程电源。 ① EA功能:内外 ROM选择端。 ② Vpp 功能:片内有 EPROM 的芯片,在 EPROM 编程期间,施加编程电源 Vpp。 ⒋ IO线 STC89C52 共有4个8位并行 IO端口:P0、P1、P2、P3口,共32个引脚。P3口还具有第二 功能,用于特殊信号输入输出和控制信号(属控制总线)。 〈51单片机引脚图及引脚功能〉 51单片机汇编语言教程-由慧净助学会员收集整理 (全部 28课) 推荐使用慧净 51实验板。推荐 51学习网 WWW.HLMCU.COM 淘宝网:http://shop37031453.taobao.com/ 拿到一块芯片,想要使用它,首先必须要知道怎样连线,我们用的一块称之为 STC89C52 的芯片,下面我们就看一下如何给它连线。 1、 电源:这当然是必不可少的了。单片机使用的是 5V电源,其中正极接 40管脚,负极(地) 接20管脚。 2、 振蒎电路:单片机是一种时序电路,必须供给脉冲信号才能正常工作,在单片机内部已 集成了振荡器,使用晶体振荡器,接18、19脚。只要买来晶体震荡器,电容,连上就能了, 按图1接上即可。 3、 复位管脚:按图1中画法连好,至于复位是何含义及为何需要复要复位,在单片机功能 中介绍。 4、EA管脚:EA管脚接到正电源端。 至此,一个单片机就接好,通上电,单片机就开始工 作了。 我们的第一个任务是要用单片机点亮一只发光二极管 LED,显然,这个LED必须要和单 片机的某个管脚相连,不然单片机就没法控制它了,那么和哪个管脚相连呢?单片机上除了 刚才用掉的 5个管脚,还有 35个, 我们将这个 LED和1脚相连。(见图 1,其中 R1是限流电阻) 〈单片机接线图〉图 1 按照这个图的接法,当1脚是高电平时,LED不亮,只有1脚是低电平时,LED才发亮。 因此要 1脚我们要能够控制,也就是说,我们要能够让 1管脚按要求变为高或低电平。即然 我们要控制 1脚,就得给它起个名字,总不能就叫它一脚吧?叫它什么名字呢?设计 51芯 片的INTEL 公司已经起好了,就叫它 P1.0,这是规定,不能由我们来更改。 名字有了,我们又怎样让它变'高'或变'低'呢?叫人做事,说一声就能,这叫发布命令,要 计算机做事,也得要向计算机发命令,计算机能听得懂的命令称之为计算机的指令。让一个 管脚输出高电平的指令是 SETB,让一个管脚输出低电平的指令是 CLR。因此,我们要 P1.0 51单片机汇编语言教程-由慧净助学会员收集整理 (全部 28课) 推荐使用慧净 51实验板。推荐 51学习网 WWW.HLMCU.COM 淘宝网:http://shop37031453.taobao.com/ 输出高电平,只要写 SETB P1.0,要P1.0 输出低电平,只要写 CLR P1.0 就能了。 现在我们已经有办法让计算机去将 P10 输出高或低电平了,但是我们怎样才能计算机执 行这条指令呢?总不能也对计算机也说一声了事吧。要解决这个问题,还得有几步要走。第 一,计算机看不懂 SETBCLR之类的指令,我们得把指令翻译成计算机能懂的方式,再让计 算机去读。计算机能懂什么呢?它只懂一样东西——数字0、1。因此我们得把 SETB P1.0 变为(D2H,90H ),把CLR P1.0 变为 (C2H,90H ),至于为什么是这两个数字,这也是由 51芯片的设计者--INTEL 规定的,我们暂不去研究。第二步,在得到这两个数字后,怎样让 这两个数字进入单片机的内部呢?这要借助于一个硬件工具编程器。如果你还不知道是什么 是编程器,我来介绍一下,就是把你在电脑上写出来来的代码用汇编器等编译器生成的一个 目标烧写到单片机的 eprom 里面去的工具,80c51 这种类型的单片机编程是一件很麻烦的事 情,必要要先装到编程器上编程后才能在设备上使用,而目前最新的 STC89C52 单片机居然 在线编程(isp)功能,不用拔出来利用简单的电路就可以实现把代码写入单片机内部,我 们将编程器与电脑连好(实验板内部已集成编程器),运行编程器的软件,然后在编缉区内写 入(D2H,90H)。 (图2) 写入程序后,我们看什么灯都不亮?这就对了,因为我们写进去的指令就是让 P10 输出高电 平,灯当然不亮,要是亮就错了。现在我们重新回到编程软件上,将编缉区的内容改为 (C2H,90H),也就是 CLR P1.0,写入单片机内,现在好了,灯亮了。因为我们写入的() 就是让 P10 输出低电平的指令。这样我们看到,硬件电路的连线没有做任何改变,只要改变 写入单片机中的内容,就能改变电路的输出效果。 总结:我们收集这个资料主要是讲解用汇编语言来学单片机的,这是最基础的教程,学 校教学也是用汇编语言上课的,学了这个课程,你不但学会了单片机硬件知识,同时你也无 意中学会了汇编语言,现在淘宝上出售的 51实验板,都是基于 C语言学习的,慧净实验板 具有汇编与 C语言实验,一个正真的单片机高手,一会要学会汇编语言,在这里,请有机会 看到的同学,都能认真的把汇编学好,用好。同时可以配套慧净的 HJ-1G、HJ-3G 实验板, 使用你学习单片机更容易上手,也可以到单片机学习网 WWW.HLMCU.COM 免费下载配套的 HJ-3G 仿真电路。 51实验板推荐(点击下面的图片可以进入下载资料链接) HJ-1G HJ-3G 51单片机汇编语言教程-由慧净助学会员收集整理 (全部 28课) 推荐使用慧净 51实验板。推荐 51学习网 WWW.HLMCU.COM 淘宝网:http://shop37031453.taobao.com/ 51单片机汇编语言教程:第 3课-单片机存储器结构 (基于 HJ-1G、HJ-3G 实验板) 单片机内部存储结构分析 我们来思考一个问题,当我们在编程器中把一条指令写进单片要内部,通电后,单片机 就可以执行这条指令,那么这条指令一定保存在单片机的某个地方,并且这个地方在单片机 掉电后依然可以保持这条指令不会丢失,这是个什么地方呢?这个地方就是单片机内部的只 读存储器即 ROM(READONLYMEMORY)。为什么称它为只读存储器呢?刚才我们不是明明把 两个数字写进去了吗?原来在 STC89C52 中的ROM是一种电可擦除的 ROM,称为 FLASHROM, 刚才我们是用编程器,在特殊的条件下由外部设备对 ROM进行写的操作,在单片机正常工作 条件下,只能从那里面读,不能把数据写进去,所以我们还是把它称为 ROM。 数的本质和物理现象:我们知道,计算机能进行数学运算,这可令我们非常的难以理解, 计算机吗, 我们虽不了解它的组成,但它总只是一些电子元器件,怎么能进行数学运算呢?我们做数学 题如37+45 是这样做的,先在纸上写 37,然后在下面写 45,然后大脑运算,最后写出结果, 运算的原材料:37、45和结果:82都是写在纸上的,计算机中又是放在什么地方呢?为了 解决这个问题,先让我们做一个实验:这里有一盏灯,我们知道灯要么亮,要么不亮,就有 两种状态,我们能用‘0’和‘1’来代替这两种状态,规定亮为‘1’,不亮,为‘0’。现在 放上两盏灯,一共有几种状态呢?我们列表来看一下: 请大家自已写上 3盏灯的情况 000 001 010 011 100 101 110 111 我们来看,这个 000,001,101 不就是我们学过的的二进制数吗?本来,灯的亮和灭只是 一种物理现象,可当我们把它们按一定的次序排好后,灯的亮和灭就代表数字了。让我们再 抽象一步,灯为什么会亮呢? 是因为输出电路输出高电平,给灯通了电。因此,灯亮和灭就能用电路的输出是高电平还是 低电平来替代了。这样,数字就和电平的高、低联系上了。 什么是位: 通过上面的实验我们已经知道:一盏灯亮或者说一根线的电平的高低,能代表两种状态:0 和1。实际上这就是一个二进制位,因此我们就把一根线称之为一个“位”,用BIT表示。 什么是字节: 一根线能表达 0和1,两根线能表达 00,01,10,11四种状态,也就是能表达 0到3的数, 而三根能表达 0-7 的数,计算机中常常用 8根线放在一起,同时计数,就能表过到 0-255 一共256 种状态。这 8根线或者 8位就称之为一个字节(BYTE)。不要问为什么是 8根而不 是其它数,因为我也不知道。(计算机世界是一本人造的世界,不是自然界,很多事情你无 法问为什么,只能说:它是一种规定,大家在以后的学习过程中也要注意这个问题) 存储器的工作原理: 1、存储器构造 存储器就是用来存放数据的地方。它是利用电平的高低来存放数据的,也就是说,它存放的 实际上是电平的高、低,而不是我们所习惯认为的 1234 这样的数字,这样,我们的一个谜 团就解开了,计算机也没什么神秘的吗。 51单片机汇编语言教程-由慧净助学会员收集整理 (全部 28课) 推荐使用慧净 51实验板。推荐 51学习网 WWW.HLMCU.COM 淘宝网:http://shop37031453.taobao.com/ 让我们看图 2。单片机里面都有这样的存储器,这是一个存储器的示意图:一个存储器就象 一个个的小抽屉,一个小抽屉里有八个小格子,每个小格子就是用来存放“电荷”的,电荷 通过与它相连的电线传进来或释放掉,至于电荷在小格子里是怎样存的,就不用我们操心了, 你能把电线想象成水管,小格子里的电荷就象是水,那就好理解了。存储器中的每个小抽屉 就是一个放数据的地方,我们称之为一个“单元”。 有了这么一个构造,我们就能开始存放数据了,想要放进一个数据 12,也就是 00001100, 我们只要把第二号和第三号小格子里存满电荷,而其它小格子里的电荷给放掉就行了(看图 3)。可是问题出来了,看图 2,一个存储器有好多单元,线是并联的,在放入电荷的时候, 会将电荷放入所有的单元中,而释放电荷的时候,会把每个单元中的电荷都放掉,这样的话, 不管存储器有多少个单元,都只能放同一个数,这当然不是我们所希望的,因此,要在结构 上稍作变化,看图2,在每个单元上有个控制线,我想要把数据放进哪个单元,就给一个信 号这个单元的控制线,这个控制线就把开关打开,这样电荷就能自由流动了,而其它单元控 制线上没有信号,所以开关不打开,不会受到影响,这样,只要控制不一样单元的控制线, 就能向各单元写入不一样的数据了,同样,如果要某个单元中取数据,也只要打开对应的控 制开关就行了。 2、存储器译码 那么,我们怎样来控制各个单元的控制线呢?这个还不简单,把每个单元元的控制线都引到 集成电路的外面不就行了吗?事情可没那么简单,一片 27512 存储器中有 65536 个单元,把 每根线都引出来,这个集成电路就得有 6万多个脚?不行,怎么办?要想法减少线的数量。 我们有一种办法称这为译码,简单介绍一下:一根线能代表 2种状态,2根线能代表 4种状 态,3根线能代表几种,256 种状态又需要几根线代表?8种,8根线,所以65536 种状态我 们只需要 16根线就能代表了。 3、存储器的选片及总线的概念 至此,译码的问题解决了,让我们再来关注另外一个问题。送入每个单元的八根线是用 从什么地方来的呢?它就是从计算机上接过来的,一般地,这八根线除了接一个存储器之外, 还要接其它的器件,如图4所示。这样问题就出来了,这八根线既然不是存储器和计算机之 间专用的,如果总是将某个单元接在这八根线上,就不好了,比如这个存储器单元中的数值 是0FFH 另一个存储器的单元是 00H,那么这根线到底是处于高电平,还是低电平?岂非要 打架看谁历害了?所以我们要让它们分离。办法当然很简单,当外面的线接到集成电路的管 脚进来后,不直接接到各单元去,中间再加一组开关(参考图 4)就行了。平时我们让开关 打开着,如果确实是要向这个存储器中写入数据,或要从存储器中读出数据,再让开关接通 就行了。这组开关由三根引线选择:读控制端、写控制端和片选端。要将数据写入片中,先 选中该片,然后发出写信号,开关就合上了,并将传过来的数据(电荷)写入片中。如果要 51单片机汇编语言教程-由慧净助学会员收集整理 (全部 28课) 推荐使用慧净 51实验板。推荐 51学习网 WWW.HLMCU.COM 淘宝网:http://shop37031453.taobao.com/ 读,先选中该片,然后发出读信号,开关合上,数据就被送出去了。注意图 4,读和写信号 同时还接入到另一个存储器,但是由于片选端不一样,所以虽有读或写信号,但没有片选信 号,所以另一个存储器不会“误会”而开门,造成冲突。那么会不一样时选中两片芯片呢? 只要是设计好的系统就不会,因为它是由计算控制的,而不是我们人来控制的,如果真的出 现同时出现选中两片的情况,那就是电路出了故障了,这不在我们的讨论之列。 从上面的介绍中我们已经看到,用来传递数据的八根线并不是专用的,而是很多器件大 家共用的,所以我们称之为数据总线,总线英文名为 BUS,总即公交车道,谁者能走。而十 六根地址线也是连在一起的,称之为地址总线。 半导体存储器的分类 按功能能分为只读和随机存取存储器两大类。所谓只读,从字面上理解就是只能从里面读, 不能写进去,它类似于我们的书本,发到我们手回之后,我们只能读里面的内容,不能随意 更改书本上的内容。只读存储器的英文缩写为 ROM(READONLYMEMORY) 所谓随机存取存储器,即随时能改写,也能读出里面的数据,它类似于我们的黑板,我能随 时写东西上去,也能用黑板擦擦掉重写。随机存储器的英文缩写为 RAM(READRANDOMMEMORY) 这两种存储器的英文缩写一定要记牢。 注意:所谓的只读和随机存取都是指在正常工作情况下而言,也就是在使用这块存储器的时 候,而不是指制造这块芯片的时候。不然,只读存储器中的数据是怎么来的呢?其实这个道 理也很好理解,书本拿到我们手里是不能改了,能当它还是原材料——白纸的时候,当然能 由印刷厂印上去了。 顺便解释一下其它几个常见的概念。 PROM,称之为可编程存储器。这就象我们的练习本,买来的时候是空白的,能写东西上去, 可一旦写上去,就擦不掉了,所以它只能用写一次,要是写错了,就报销了。 EPROM,称之为紫外线擦除的可编程只读存储器。它里面的内容写上去之后,如果觉得不满 意,能用一种特殊的办法去掉后重写,这就是用紫外线照射,紫外线就象“消字灵”,能把 字去掉,然后再重写。当然消的次数多了,也就不灵光了,所以这种芯片能擦除的次数也是 有限的——几百次吧。FLASH,称之为闪速存储器,它和 EPROM 类似,写上去的东西也能擦 掉重写,但它要方便一些,不需要光照了,只要用电学办法就能擦除,所以就方便许多,而 且寿面也很长(几万到几十万次不等)。 再次强调,这里的所有的写都不是指在正常工作条件下。不管是 PROM、EPROM 还是FLASHROM, 它们的写都要有特殊的条件,一般我们用一种称之为“编程器”的设备来做这项工作,一旦 把它装到它的工作位置,就不能随便改写了。 总结:没有学过模数的同学看到这一课可能觉得学单片机这么难呀,要记这么多东西, 其实,上面的我们不需要记住,你只要能看一次,理解一次就可以了,有时间我们用实验 板多做实验,加深对单片机的硬件认识。内部存储结构到时你自然就会明白,单片机内部 是如何工作的,对我们来说不重要,最重要的是我们如何写程序来控制单片机的输入,输 出,实现我们需要的功能。 51实验板推荐(点击右边的图片可以进入下载资料链接 51单片机汇编语言教程-由慧净助学会员收集整理 (全部 28课) 推荐使用慧净 51实验板。推荐 51学习网 WWW.HLMCU.COM 淘宝网:http://shop37031453.taobao.com/ 51单片机汇编语言教程:第4课-第一个单片机小程序 (基于 HJ-1G、HJ-3G 实验板) 上一次我们的程序实在是没什么用,要灯亮还要重写一下片子,下面我们要让灯持续地 闪烁,这就有一定的实用价值了,比如能把它当成汽车上的一个信号灯用了。怎样才能让灯 持续地闪烁呢?实际上就是要灯亮一段时间,再灭一段时间,也就是说要 P10 持续地输出高 和低电平。怎样实现这个要求呢?请考虑用下面的指令是否可行: SETB P10 CLR P10 …… 这是不行的,有两个问题,第一,计算机执行指令的时间很快,执行完 SETB P10 后,灯是 灭了,但在极短时间(微秒级)后,计算机又执行了 CLR P10 指令,灯又亮了,所以根本分 辨不出灯曾灭过。第二,在执行完 CLR P10 后,不会再去执行 SETB P10 指令,所以以后再 也没有机会让灭了。 为了解决这两个问题,我们能做如下设想,第一,在执行完 SETB P10 后,延时一段时 间(几秒或零点几秒)再执行第二条指令,就能分辨出灯曾灭过了。第二在执行完第二条指 令后,让计算机再去执行第一条指令,持续地在原地兜圈,我们称之为循环,这样就能完成 任务了。 以下先给出程序(后面括号中的数字是为了便于讲解而写的,实际不用输入): ;主程序: LOOP:SETB P10 ;(1) LCALLDELAY;(2) CLR P10 ;(3) LCALLDELAY;(4) AJMPLOOP;(5) ;以下子程序 DELAY:MOV R7,#250 ;(6) D1:MOV R6,#250 ;(7) D2:DJNZ R6,D2 ;(8) DJNZ R7,D1 ;(9) RET;(10) END;(11) 按上面的设想分析一下前面的五条指令。 第一条是让灯灭,第二条应当是延时,第三条是让灯亮,第四条和第二条一模一样,也 是延时,第五条应当是转去执行第一条指令。第二和第四条实现的原理稍后谈,先看第五条, LJMP是一条指令,意思是转移,往什么地方转移呢?后面跟的是 LOOP,看一下,什么地方 还有LOOP,对了,在第一条指令的前面有一个 LOOP,所以很直观地,我们能认识到,它要 转到第一条指令处。这个第一条指令前面的 LOOP 被称之为标号,它的用途就是给这一行起 一个名字,便于使用。是否一定要给它起名叫 LOOP呢?当然不是,起什么名字,完全由编 程序的人决定,能称它为 A,X等等,当然,这个时候,第五条指令 LJMP 后面的名字也得跟 着改了。 第二条和第四条指令的用途是延时,它是怎样实现的呢?指令的形式是 LCALL,这条指 令称为调用子程序指令,看一下指令后面跟的是什么,DELAY,找一下 DELAY,在第六条指 令的前面,显然,这也是一个标号。这条指令的作用是这样的:当执行 LCALL 指令时,程序 就转到 LCALL 后面的标号所标定的程序处执行,如果在执行指令的过程中遇到 RET指令,则 51单片机汇编语言教程-由慧净助学会员收集整理 (全部 28课) 推荐使用慧净 51实验板。推荐 51学习网 WWW.HLMCU.COM 淘宝网:http://shop37031453.taobao.com/ 程序就返回到 LCALL 指令的下面的一条指令继续执行,从第六行开始的指令中,能看到确实 有RET指令。在执行第二条指令后,将转去执行第6条指令,而在执行完6,7,8,9条 指令后将遇到第10条令:RET,执行该条指令后,程序将回来执行第三条指令,即将 P10 清零,使灯亮,然后又是第四条指令,执行第四条指令就是转去执行第 6,7,8,9,10条 指令,然后回来执行第 5条指令,第5条指令就是让程序回到第 1条开始执行,如此周而复 始,灯就在持续地亮、灭了。 在标号 DELAY 标志的这一行到 RET这一行中的所有程序,这是一段延时程序,大概延时 零点几秒,至于具体的时间,以后我们再学习如何计算。 程序的最后一行是 END,这不是 一条指令,它只是告诉我们程序到此结束,它被称为伪指令。 单片机内部结构分析:为了知道延时程序是如何工作的,我们必需首先了解延时程序中出现 的一些符号,就从R1开始,R1被称之为工作寄存器。什么是工作寄存器呢?让我们从现实 生活中来找找答案。如果出一道数学题:123+567,让你回答结果是多少,你会马上答出是 690,再看下面一道题:123+567+562,要让你要上回答,就不这么不难了吧?我们会怎样做 呢?如果有张纸,就不难了,我们先算出 123+567=690,把690 写在纸上,然后再算 690+562 得到结果是 1552。这其中 1552 是我们想要的结果,而690 并非我们所要的结果,但是为了 得到最终结果,我们又不得不先算出 690,并记下来,这其实是一个中间结果,计算机中做 运算和这个类似,为了要得到最终结果,一般要做很多步的中间结果,这些中间结果要有个 地方放才行,把它们放哪呢?放在前面提到过的 ROM中能吗?显然不行,因为计算机要将结 果写进去,而ROM是不能写的,所以在单片机中另有一个区域称为 RAM区(RAM是随机存取 存储器的英文缩写),它能将数据写进去。 特别地,在MCS-51 单片机中,将RAM中分出一 块区域,称为工作寄存器区。 51实验板推荐(点击下面的图片可以进入下载资料链接) HJ-1G HJ-3G 51单片机汇编语言教程-由慧净助学会员收集整理 (全部 28课) 推荐使用慧净 51实验板。推荐 51学习网 WWW.HLMCU.COM 淘宝网:http://shop37031453.taobao.com/ 51单片机汇编语言教程:第5课-单片机延时程序分析 (基于 HJ-1G、HJ-3G 实验板) 上一次课中,我们已经知道,程序中的符号 R7、R6是代表了一个个的 RAM单元,是用来放 一些数据的,下面我们再来看一下其它符号的含义。 DELAY:MOV R7,#250 ;(6) D1:MOV R6,#250 ;(7) D2:DJNZ R6,D2 ;(8) DJNZ R7,D1 ;(9) RET;(10) 〈单片机延时程序〉 MOV:这是一条指令,意思是传递数据。说到传递,我们都很清楚,传东西要从一本人的手 上传到另一本人的手上,也就是说要有一个接受者,一个传递者和一样东西。从指令 MOV R7, #250 中来分析,R7是一个接受者,250 是被传递的数,传递者在这条指令中被省略了(注 意:并不是每一条传递指令都会省的,事实上大部份数据传递指令都会有传递者)。它的意 义也很明显:将数据 250 送到R7中去,因此执行完这条指令后,R7单元中的值就应当是 250。 在250 前面有个#号,这又是什么意思呢?这个#就是用来说明 250 就是一个被传递的东西本 身,而不是传递者。那么 MOV R6,#250 是什么意思,应当不用分析了吧。 DJNZ:这是另一条指令,我们来看一下这条指令后面跟着的两个东西,一个是 R6,一个是 D2,R6我们当然已知是什么了,查一下 D2是什么。D2在本行的前面,我们已学过,这称之 为标号。标号的用途是什么呢?就是给本行起一个名字。DJNZ指令的执行过程是这样的, 它将其后面的第一个参数中的值减 1,然后看一下,这个值是否等于 0,如果等于 0,就往 下执行,如果不等于 0,就转移,转到什么地方去呢?可能大家已猜到了,转到第二个参数 所指定的地方去(请大家用自已的话讲一下这条语句是怎样执行的)。本条指令的最终执行 结果就是,在原地转圈 250 次。 执行完了 DJNZ R6,D2之后(也就是 R6的值等于 0之后),就会去执行下面一行,也就是 DJNZ R7,D1,请大家自行分析一下这句话执行的结果。(转去执行 MOV R6,#250,同时 R7 中的值减 1),最终 DJNZ R6,D2这句话将被执行 250250=62500 次,执行这么多次同一条指 令干吗?就是为了延时。 一个问题:如果在 R6中放入 0,会有什么样的结果。 二、时序分析: 前面我们介绍了延时程序,但这还不完善,因为,我们只知道 DJNZ R6,D2这句话会被执行 62500 次,但是执行这么多次需要多长时间呢?是否满足我们的要求呢?我们还不知道,所 以下面要来解决这个问题。 先提一个问题:我们学校里什么是最重要的。(铃声)校长能出差,老师能休息,但学校一 日无铃声必定大乱。整个学校就是在铃声的统一指挥下,步调一致,统一协调地工作着。这 个铃是按一定的时间安排来响的,我们能称之为“时序��时间的次序”。一个由人组 成的单位尚且要有一定的时序,计算机当然更要有严格的时序。事实上,计算机更象一个大 钟,什么时候分针动,什么时候秒针动,什么时候时针动,都有严格的规定,一点也不能乱。 计算机要完成的事更复杂,所以它的时序也更复杂。 51单片机汇编语言教程-由慧净助学会员收集整理 (全部 28课) 推荐使用慧净 51实验板。推荐 51学习网 WWW.HLMCU.COM 淘宝网:http://shop37031453.taobao.com/ 我们已知,计算机工作时,是一条一条地从 ROM中取指令,然后一步一步地执行,我们规定: 计算机访问一次存储器的时间,称之为一个机器周期。这是一个时间基准,好象我们人用“秒” 作为我们的时间基准一样,为什么不干脆用“秒”,多好,很习惯,学下去我们就会知道用 “秒”反而不习惯。 一个机器周期包括 12个时钟周期。下面让我们算一下一个机器周期是多长时间吧。设一个 单片机工作于 12M 晶体震荡器,它的时钟周期是 112(微秒)。它的一个机器周期是 12(112) 也就是 1微秒。(请计算一个工作于 6M晶体震荡器的单片机,它的机器周期是多少)。 MCS-51 单片机的所有指令中,有一些完成得比较快,只要一个机器周期就行了,有一些完 成得比较慢,得要2个机器周期,还有两条指令要 4个机器周期才行。这也不难再解,不是 吗?我让你扫地的执行要完成总得比要你完成擦黑板的指令时间要长。为了恒量指令执行时 间的长短,又引入一个新的概念:指令周期。所谓指令周期就是指执行一条指令的时间。INTEL 对每一条指令都给出了它的指令周期数,这些数据,大部份不需要我们去记忆,但是有一些 指令是需要记住的,如 DJNZ 指令是双周期指令。 下面让我们来计算刚才的延时。首先必须要知道晶体震荡器的频率,我们设所用晶体震荡器 为12M,则一个机器周期就是 1微秒。而 DJNZ指令是双周期指令,所以执行一次要 2个微 秒。一共执行 62500 次,正好 125000 微秒,也就是 125 毫秒。 练习:设计一个延时 100 毫秒的延时程序。 要点分析:1、一个单元中的数是否能超过 255。2、如何分配两个数。 三、复位电路 一、复位方式 ⒈ 复位条件 RST引脚保持 2个机器周期以上的高电平。 ⒉ 复位电路 〈单片机复位电路〉 ⒊ 复位后 CPU状态 PC: 0000H TMOD: 00H Acc: 00H TCON: 00H B: 00H TH0: 00H PSW: 00H TL0: 00H 51单片机汇编语言教程-由慧净助学会员收集整理 (全部 28课) 推荐使用慧净 51实验板。推荐 51学习网 WWW.HLMCU.COM 淘宝网:http://shop37031453.taobao.com/ SP: 07H TH1: 00H DPTR:0000H TL1: 00H P0~P3:FFHSCON: 00H IP:×××00000B SBUF: 不定 IE:0××00000B PCON: 0×××0000B 任何单片机在工作之前都要有个复位的过程,复位是什么意思呢?它就象是我们上课之前打 的预备铃。预备铃一响,大家就自动地从操场、其它地方进入教室了,在这一段时间里,是 没有老师干预的,对单片机来说,是程序还没有开始执行,是在做准备工作。显然,准备工 作不需要太长的时间,复位只需要 5ms 的时间就能了。如何进行复位呢?只要在单片机的 RST管脚上加上高电平,就能了,按上面所说,时间不少于 5ms。为了达到这个要求,能用 很多种办法,这里供给一种供参考,见图1。实际上,我们在上一次实验的图中已见到过了。 这种复位电路的工作原理是:通电时,电容两端相当于是短路,于是 RST管脚上为高电平, 然后电源通过电阻对电容充电,RST端电压慢慢下降,降到一定程序,即为低电平,单片机 开始正常工作。 51实验板推荐(点击下面的图片可以进入下载资料链接) HJ-1G HJ-3G 51单片机汇编语言教程-由慧净助学会员收集整理 (全部 28课) 推荐使用慧净 51实验板。推荐 51学习网 WWW.HLMCU.COM 淘宝网:http://shop37031453.taobao.com/ 51单片机汇编语言教程:第6课--单片机并行口结构 (基于HJ-1G、HJ-3G 实验板) 上两次我们做过两个实验,都是让 P1.0 这个管脚使灯亮,我们能设想:既然P1.0 能让 灯亮,那么其它的管脚可不能呢?看一下图 1,它是8031 单片机管脚的说明,在P1.0 旁边 有P1.1,P1.2….P1.7,它们是否都能让灯亮呢?除了以 P1开头的外,还有以 P0,P2,P3 开头的,数一下,一共是 32个管脚,前面我们以学过 7个管脚,加上这 32个这39个了。 它们都以 P字开头,只是后面的数字不一样,它们是否有什么联系呢?它们能不能都让灯亮 呢?在我们的实验板上,除了 P10 之外,还有 P11��P17 都与LED相连,下面让我们 来做一个实验,程序如下: MAIN:MOV P1,#0FFH LCALLDELAY MOV P1,#00H LCALLDELAY LJMPMAIN DELAY:MOV R7,#250 D1:MOV R6,#250 D2:DJNZ R6,D2 DJNZ R7,D1 RET END 将这段程序转为机器码,用编程器写入单片机中,结果如何?通电以后我们能看到 8只LED 全部在闪动。因此,P10��P17 是全部能点亮灯的。事实上,凡以P开头的这 32个管 脚都是能点亮灯的,也就是说:这 32个管脚都能作为输出使用,如果不用来点亮 LED,能 用来控制继电器,能用来控制其它的执行机构。 程序分析:这段程序和前面做过的程序比较,只有两处不一样:第一句:原来是 SETB P1.0, 现在改为 MOV P1,#0FFH,第三句:原来是 CLR P1.0,现在改为 MOV P1.0,#00H。从中能 看出,P1是P1.0��P1.7 的全体的代表,一个 P1就表示了所有的这八个管脚了。当 然用的指令也不一样了,是用 MOV指令。为什么用这条指令?看图 2,我们把 P1作为一个 整体,就把它当作是一个存储器的单元,对一个单元送进一个数能用 MOV指令。 二、第四个实验 除了能作为输出外,这32个管脚还能做什么呢?下面再来做一个单片机实验,源程序如下: MAIN:MOV P3,#0FFH LOOP:MOVA,P3 MOV P1,A LJMPLOOP 先看一下这个实验的结果:所有灯全部不亮,然后我按下一个按钮,第()个灯亮了,再按 下另一个按钮,第()个灯亮了,松开按钮灯就灭了。从这个实验现象结合电路来分析一下 程序。 从硬件电路的连线能看出,有四个按钮被接入到 P3口的P32,P33,P34,P35。第一条指令 的用途我们能猜到:使 P3口全部为高电平。第二条指令是 MOVA,P3,其中 MOV已经见, 是送数的意思,这条指令的意思就是将 P3口的数送到 A中去,我们能把 A当成是一个中间 单元(看图3),第三句话是将 A中的数又送到 P1口去,第四句话是循环,就是持续地重复 51单片机汇编语言教程-由慧净助学会员收集整理 (全部 28课) 推荐使用慧净 51实验板。推荐 51学习网 WWW.HLMCU.COM 淘宝网:http://shop37031453.taobao.com/ 这个过程,这我们已见过。当我们按下第一个按钮时,第(3)只灯亮了,所以 P12 口应当 输出是低电平,为什么 P12 口会输出低电平呢?我们看一下有什么被送到了 P1口,只有从 P3口进来的数送到 A,又被送到了 P1口,所以,肯定是 P3口进来的数使得 P12 位输出电平 的。P3口的P32 位的按钮被按下,使得 P32 位的电平为低,通过程序,又使 P12 口输出低 电平,所以 P3口起来了一个输入的作用。验证:按第二、三、四个按钮,同时按下 2个、 3个、4个按钮都能得到同样的结论,所以 P3口确实起到了输入作用,这样,我们能看到, 以P字开头的管脚,不仅能用作输出,还能用作输入,其它的管脚是否能呢?是的,都能。 这32个管脚就称之为并行口,下面我们就对并行口的结构作一个分析,看一下它是怎样实 现输入和输出的。 并行口结构分析: 1、 输出结构 并行口结构图 先看P1口的一位的结构示意图(只画出了输出部份):从图中能看出,开关的打开和合上代 表了管脚输出的高和低,如果开关合上了,则管脚输出就是低,如果开关打开了,则输出高 电平,这个开关是由一根线来控制的,这根数据总线是出自于 CPU,让我们回想一下,数据 总线是一根大家公用的线,很多的器件和它连在一起,在不一样的时候,不一样的器件当然 需要不一样的信号,如某一时刻我们让这个管脚输出高电平,并要求保持若干时间,在这段 时间里,计算机当然在忙个不停,在与其它器件进行联络,这根控制线上的电平未必能保持 原来的值不变,输出就会发生变化了。怎么解决这个问题呢?我们在存储器一节中学过,存 储器中是能存放电荷的,我们不妨也加一个小的存储器的单元,并在它的前面加一个开关, 要让这一位输出时,就把开关打开,信号就进入存储器的单元,然后马上关闭开关,这样这 一位的状态就被保存下来,直到下一次命令让它把开关再打开为止。这样就能使这一位的状 态与别的器件无关了,这么一个小单元,我们给它一个很形象的名字,称之为“锁存器”。 2、输入结构 51单片机汇编语言教程-由慧净助学会员收集整理 (全部 28课) 推荐使用慧净 51实验板。推荐 51学习网 WWW.HLMCU.COM 淘宝网:http://shop37031453.taobao.com/ 这是并行口的一位的输出结构示意图,再看,除了输出之外,还有两根线,一根从外部管脚 接入,另一根从锁存器的输出接出,分别标明读管脚和读锁存器。这两根线是用于从外部接 收信号的,为什么要两根呢?原来,在 51单片机中输入有两种方式,分别称为‘读管脚’ 和‘读锁存器’,第一种方式是将管脚作为输入,那是真正地从外部管脚读进输入的值,第 二种方式是该管脚处于输出状态时,有时需要改变这一位的状态,则并不需要真正地读管脚 状态,而只是读入锁存器的状态,然后作某种变换后再输出。 请注意输入结构图,如果将这一根引线作为输入口使用,我们并不能保证在任何时刻都能得 到正确的结果(为什么?)参考图 2输入示意图。接在外部的开关如果打开,则应当是输入 1,而如果闭合开关,则输入 0,但是,如果单片机内部的开关是闭合的,那么不管外部的 开关是开还是闭,单片机接受到的数据都是 0。可见,要让这一端口作为输入使用,要先做 一个‘准备工作’,就是先让内部的开关断开,也就是让端口输出‘1’才行。正因为要先做 这么一个准备工作,所以我们称之为“准双向 IO口”。 以上是 P1口的一位的结构,P1口其它各位的结构与之相同,而其它三个口:P0、P2、P3 则除入作为输入输出口之外还有其它用途,所以结构要稍复杂一些,但其用于输入、输出的 结构是相同的。看图()。对我们来说,这些附加的功能不必由我们来控制,所以我们就不 去关心它了。 51实验板推荐(点击下面的图片可以进入下载资料链接) HJ-1G HJ-3G 单片机助学淘宝店:http://shop37031453.taobao.com/ 单片机助学有呀店:http://youa.baidu.com/shop/90e1ffeb5e960cbbce2b6ab6 单片机助学拍拍店:http://shop.paipai.com/121350852 51单片机汇编语言教程-由慧净助学会员收集整理 (全部 28课) 推荐使用慧净 51实验板。推荐 51学习网 WWW.HLMCU.COM 淘宝网:http://shop37031453.taobao.com/ 51单片机汇编语言教程:第7课--单片机的特殊功能寄存器 (基于HJ-1G、HJ-3G 实验板) 通过前面的学习,我们已知单片机的内部有 ROM、有RAM、有并行 IO口,那么,除了这 些东西之外,单片机内部究竟还有些什么,这些个零碎的东西怎么连在一起的,让我们来对 单片机内部的寄存器作一个完整的功能分析吧! 下图中我们能看出,在 51单片机内部有一个 CPU用来运算、控制,有四个并行 IO口, 分别是 P0、P1、P2、P3,有ROM,用来存放程序,有RAM,用来存放中间结果,此外还有定 时计数器,串行IO口,中断系统,以及一个内部的时钟电路。在一个 51单片机的内部包含 了这么多的东西。 单片机内部结构图 对上面的图进行进一步的分析,我们已知,对并行 IO口的读写只要将数据送入到对应 IO 口的锁存器就能了,那么对于定时计数器,串行 IO口等怎么用呢?在单片机中有一些独立 的存储单元是用来控制这些器件的,被称之为特殊功能寄存器(SFR)。事实上,我们已接触 过P1这个特殊功能寄存器了,还有哪些呢?看下表 1 51单片机汇编语言教程-由慧净助学会员收集整理 (全部 28课) 推荐使用慧净 51实验板。推荐 51学习网 WWW.HLMCU.COM 淘宝网:http://shop37031453.taobao.com/ 表1 51单片机汇编语言教程-由慧净助学会员收集整理 (全部 28课) 推荐使用慧净 51实验板。推荐 51学习网 WWW.HLMCU.COM 淘宝网:http://shop37031453.taobao.com/ 特殊功能寄存器地址映象表(一) 特殊功能寄存器地址映象表(二) 特殊功能寄存器地址映象表(三) 下面,我们介绍一下几个常用的 SFR,看图 2。 ACC:累加器,常常用 A表示。这是个什么东西,可不能从名字上理解,它是一个寄存器, 而不是一个做加法的东西,为什么给它这么一个名字呢?或许是因为在运算器做运算时其中 一个数一定是在 ACC中的缘故吧。它的名字特殊,身份也特殊,稍后我们将学到指令,能发 51单片机汇编语言教程-由慧净助学会员收集整理 (全部 28课) 推荐使用慧净 51实验板。推荐 51学习网 WWW.HLMCU.COM 淘宝网:http://shop37031453.taobao.com/ 现,所有的运算类指令都离不开它。 2、B:一个寄存器。在做乘、除法时放乘数或除数,不做乘除法时,随你怎么用。 3、PSW:程序状态字。这是一个很重要的东西,里面放了 CPU工作时的很多状态,借此,我 们能了解 CPU的当前状态,并作出对应的处理。它的各位功能请看表 2 表2 PSW也称为标志寄存器,了解这个对于了解单片机原理非常的重要,存放各有关标志。其结 构和定义如下: 下面我们逐一介绍 sfr 各位的用途 (1)CY:进位标志。用于表示 Acc.7 有否向更高位进位。8051 中的运算器是一种 8位的运 算器,我们知道,8位运算器只能表示到 0-255,如果做加法的话,两数相加可能会超过 255, 这样最高位就会丢失,造成运算的错误,怎么办?最高位就进到这里来。这样就没事了。 例:78H+97H(01111000+10010111) (2)AC:辅助进位标志也叫半进位标志。 用于表示 Acc.3 有否向 Acc.4 进位 例:57H+3AH(01010111+00111010) (3)F0:用户标志位,由我们(编程人员)决定什么时候用,什么时候不用。 (4)RS1、RS0:工作寄存器组选择位。这个我们已知了。 RS1、RS0 = 00 —— 0区(00H~07H) RS1、RS0 = 01 —— 1区(08H~0FH) RS1、RS0 = 10 —— 2区(10H~17H) RS1、RS0 = 11 —— 3区(18H~1FH) (5)0V:溢出标志位。 表示Acc 在有符号数算术运算中的溢出,什么是溢出我们稍后再谈 吧。 (6)P:奇偶校验位:它用来表示 ALU运算结果中二进制数位“1”的个数的奇偶性。若为 奇数,则 P=1,不然为 0。 例:某运算结果是 78H(01111000),显然 1的个数为偶数,所以 P=0。 4、DPTR(DPH、DPL):数据指针,能用它来访问外部数据存储器中的任一单元,如果不用, 也能作为通用寄存器来用,由我们自已决定如何使用。16位,由两个 8位寄存器 DPH、DPL 组成。主要用于存放一个 16位地址,作为访问外部存储器(外 RAM和ROM)的地址指针。 5、P0、P1、P2、P3:这个我们已经知道,是四个并行输入输出口的寄存器。它里面的内容 对应着管脚的输出。 6、SP:堆栈指针。(专用于指出堆栈顶部数据的地址。) 堆栈介绍:日常生活中,我们都注意到过这样的现象,家里洗的碗,一只一只摞起来, 51单片机汇编语言教程-由慧净助学会员收集整理 (全部 28课) 推荐使用慧净 51实验板。推荐 51学习网 WWW.HLMCU.COM 淘宝网:http://shop37031453.taobao.com/ 最晚放上去的放在最上面,而最早放上去的则放在最下面,在取的时候正好相反,先从最上 面取,这种现象我们用一句话来概括:“先进后出,后进先出”。请大家想想,还有什么地方 有这种现象?其实比比皆是,建筑工地上堆放的砖头、材料,仓库里放的货物,都是“先进 后出,后进先出”,这实际是一种存取物品的规则,我们称之为“堆栈”。 在单片机中,我们也能在 RAM中构造这样一个区域,用来存放数据,这个区域存放数据 的规则就是“先进后出,后进先出”,我们称之为“堆栈”。为什么需要这样来存放数据呢? 存储器本身不是能按地址来存放数据吗?对,知道了地址的确就能知道里面的内容,但如果 我们需要存放的是一批数据,每一个数据都需要知道地址那不是麻烦吗?如果我们让数据一 个接一个地放置,那么我们只要知道第一个数据所在地址单元就能了(看图2)如果第一个 数据在 27H,那么第二、三个就在 28H、29H 了。所以利用堆栈这种办法来放数据能简化操 作。 那么51中堆栈什么地方呢?单片机中能存放数据的区域有限,我们不能够专门分配一块 地方做堆栈,所以就在内存(RAM)中开辟一块地方,用于堆栈,但是用内存的哪一块呢? 还是不好定,因为 51是一种通用的单片机,各人的实际需求各不相同,有人需要多一些堆 栈,而有人则不需要那么多,所以怎么分配都不合适,怎样来解决这个问题分不好干脆就不 分了,把分的权利给用户(编程者),根据自已的需要去定吧,所以51单片机中堆栈的位置 是能变化的。而这种变化就体现在 SP中值的变化,看图 2,SP中的值等于 27H 不就相当于 是一个指针指向 27H 单元吗?当然在真正的 51机中,开始指针所指的位置并非就是数据存 放的位置,而是数据存放的前一个位置,比如一开始指针是指向 27H 单元的,那么第一个数 据的位置是 28H 单元,而不是 27H 单元,为什么会这样,我们在学堆栈命令时再说明。其它 的SFR,我们在用到时再介绍。 51实验板推荐(点击下面的图片可以进入下载资料链接) HJ-1G HJ-3G 51 单片机汇编语言教程-慧净电子会员收集整理 (全部 28课) 推荐使用慧净 51实验板。推荐 51学习网 WWW.HLMCU.COM 淘宝网:http://shop37031453.taobao.com/ 51单片机汇编语言教程:8课单片机寻址方式与指令系统 (基于HJ-1G、HJ-3G 实验板) 通过前面的学习,我们已经了解了单片机内部的结构,并且也已经知道,要控制单片机, 让它为我们干活,要用指令,我们已学了几条指令,但很零散,从现在开始,我们将要系统 地学习 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) LCALLDELAY;(2) CLR P1.0 ;(3) LCALLDELAY;(4) AJMPMAIN;(5) ;以下子程序 DELAY:MOV R7,#250 ;(6) D1:MOV R6,#250 ;(7) D2:DJNZ R6,D2 ;(8) DJNZ R7,D1 ;(9) 51 单片机汇编语言教程-慧净电子会员收集整理 (全部 28课) 推荐使用慧净 51实验板。推荐 51学习网 WWW.HLMCU.COM 淘宝网:http://shop37031453.taobao.com/ RET;(10) END;(11) 表1 ----------------------------------------------------- MAIN:SETB P1.0 ;(1) MOV 30H,#255 LCALLDELAY; CLR P1.0 ;(3) MOV 30H,#200 LCALLDELAY;(4) AJMPMAIN;(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 单元 中传过来的数确定。这样就能满足要求。 从这里我们能得出结论,在数据传递中要找到被传递的数,很多时候,这个数并不能直 接给出,需要变化,这就引出了一个概念:如何寻找操作数,我们把寻找操作数所在单元的 地址称之为寻址。在这里我们直接使用数所在单元的地址找到了操作数,所以称这种办法为 直接寻址。除了这种办法之外,还有一种,如果我们把数放在工作寄存器中,从工作寄存器 中寻找数据,则称之为寄存器寻址。例:MOVA,R0就是将 R0工作寄存器中的数据送到累 加器A中去。提一个问题:我们知道,工作寄存器就是内存单元的一部份,如果我们选择工 作寄存器组 0,则R0就是RAM的00H 单元,那么这样一来,MOVA,00H,和MOVA,R0不 就没什么区别了吗?为什么要加以区别呢?的确,这两条指令执行的结果是完全相同的,都 是将00H 单元中的内容送到 A中去,但是执行的过程不一样,执行第一条指令需要 2个周期, 而第二条则只需要 1个周期,第一条指令变成最终的目标码要两个字节(E5H 00H),而第二 条则只要一个字节(E8h)就能了。 这么斤斤计较!不就差了一个周期吗,如果是 12M 的晶体震荡器的话,也就1个微秒时 间了,一个字节又能有多少? 不对,如果这条指令只执行一次,也许无所谓,但一条指令如果执行上 1000 次,就是1 毫秒,如果要执行 1000000 万次,就是 1S的误差,这就很可观了,单片机做的是实时控制 的事,所以必须如此“斤斤计较”。字节数同样如此。 再来提一个问题,现在我们已知,寻找操作数能通过直接给的方式(立即寻址)和直接 给出数所在单元地址的方式(直接寻址),这就够了吗? 看这个问题,要求从 30H 单元开始,取 20个数,分别送入 A累加器。 51 单片机汇编语言教程-慧净电子会员收集整理 (全部 28课) 推荐使用慧净 51实验板。推荐 51学习网 WWW.HLMCU.COM 淘宝网:http://shop37031453.taobao.com/ 就我们目前掌握的办法而言,要从30H 单元取数,就用MOVA,30H,那么下一个数呢? 是31H 单元的,怎么取呢?还是只能用 MOVA,31H,那么 20个数,不是得 20条指令才能 写完吗?这里只有 20个数,如果要送 200 个或2000 个数,那岂不要写上 200 条或2000 条 命令这未免太笨了吧。为什么会出现这样的状况?是因为我们只会把地址写在指令中,所以 就没办法了,如果我们不是把地址直接写在指令中,而是把地址放在另外一个寄存器单元中, 根据这个寄存器单元中的数值决定该到哪个单元中取数据,比如,当前这个寄存器中的值是 30H,那么就到 30H 单元中去取,如果是 31H 就到31H 单元中去取,就能解决这个问题了。 怎么个解决法呢?既然是看的寄存器中的值,那么我们就能通过一定的办法让这里面的值发 生变化,比如取完一个数后,将这个寄存器单元中的值加 1,还是执行同一条指令,可是取 数的对象却不一样了,不是吗。通过例程来说明吧。 MOV R7,#20 MOV R0,#30H LOOP:MOVA,@R0 INC R0 DJNZ R7,LOOP 这个例程中大部份指令我们是能看懂的,第一句,是将立即数 20送到R7中,执行完后 R7中的值应当是 20。第二句是将立即数 30H 送入R0工作寄存器中,所以执行完后,R0单 元中的值是 30H,第三句,这是看一下 R0单元中是什么值,把这个值作为地址,取这个地 址单元的内容送入 A中,此时,执行这条指令的结果就相当于 MOVA,30H。第四句,没学 过,就是把 R0中的值加 1,因此执行完后,R0中的值就是 31H,第五句,学过,将R7中的 值减1,看是否等于 0,不等于 0,则转到标号 LOOP处继续执行,因此,执行完这句后,将 转去执行 MOVA,@R0 这句话,此时相当于执行了 MOVA,31H(因为此时的 R0中的值已是 31H 了),如此,直到R7中的值逐次相减等于 0,也就是循环 20次为止,就实现了我们的要 求:从 30H 单元开始将 20个数据送入 A中。 这也是一种寻找数据的办法,由于数据是间接地被找到的,所以就称之为间址寻址。注 意,在间址寻址中,只能用 R0或R1存放等寻找的数据。 51实验板推荐(点击下面的图片可以进入下载资料链接) HJ-1G HJ-3G 51单片机汇编语言教程-慧净电子会员收集整理 (全部 28课) 推荐使用慧净 51实验板。推荐 51学习网 WWW.HLMCU.COM 淘宝网:http://shop37031453.taobao.com/ 51单片机汇编语言教程:9课单片机数据传递类指令 (基于HJ-1G、HJ-3G 实验板) 单片机数据传递类指令 (1)以直接地址为目的操作数的指令 MOV direct,A 例: MOV 20H,A MOV direct,Rn MOV 20H,R1 MOV direct1,direct2 MOV 20H,30H MOV direct,@Ri MOV 20H,@R1 MOV direct,#data MOV 20H,#34H (2)以间接地址为目的操作数的指令 MOV@Ri,A 例:MOV@R0,A MOV@Ri,direct MOV@R1,20H MOV@Ri,#data MOV@R0,#34H (3)十六位数的传递指令 MOVDPTR,#data16 8051是一种8位机,这是唯一的一条16位立即数传递指令,其功能是将一个16位的立即数送 入DPTR中去。其中高8位送入 DPH,低8位送入 DPL。例:MOVDPTR,#1234H,则执行完了之 后DPH中的值为12H,DPL中的值为34H。反之,如果我们分别向 DPH,DPL送数,则结果也 一样。如有下面两条指令:MOVDPH,#35H,MOVDPL,#12H。则就相当于执行了 MOVDPTR, #3512H。 数据传递类指令综合练习: 1 给出每条指令执行后的结果 2 上机练习: MOV 23H,#30H MOV 12H,#34H MOV R0,#23H MOV R7,#22H MOV R1,12H MOV A,@R0 MOV 34H,@R1 (23h)=30h (12h)=34h (R0)=23H (R7)=22H (R1)=12H (A)=30H (34H)=34H MOV 45H,34H MOV DPTR,#6712H MOV 12H,DPH MOV R0,DPL MOV A,@R0 (45H)=34H (DPTR)=6712H (12H)=67H (R0)=12H (A)=67H 51单片机汇编语言教程-慧净电子会员收集整理 (全部 28课) 推荐使用慧净 51实验板。推荐 51学习网 WWW.HLMCU.COM 淘宝网:http://shop37031453.taobao.com/ 说明:用括号括起来代表内容,如(23H)则代表内部 RAM23H 单元中的值,(A)则代表累加 器A单元中的值。 进入DOS状态,进入 WAVE所在的目录,例 D:\WAVE 键入MCS51,出现如下画面 <单片机数据传递指令>图1 按File->Open,出现对话框后,在Name 处输入一个文件名(见图2),如果是下面列表中已 存在的,则打开这个文件,如果不存在这个文件,则新建一个文件(见图3) 51单片机汇编语言教程-慧净电子会员收集整理 (全部 28课) 推荐使用慧净 51实验板。推荐 51学习网 WWW.HLMCU.COM 淘宝网:http://shop37031453.taobao.com/ 图2 在空白处将上面的程序输入。见图4。用ALT+A 汇编通过。用F8即可单步执行,在执行过程 中注意观察屏幕左边的工作寄存器及 A累加器中的值的变化。 图4 内存中值的变化在此是看不到的,可以用如下方法观察(看图5):将鼠标移到 DATA,双击, 则光标进入此行,此时可以键盘上的上下光标键上下翻动来观察内存值的变化。本行的最前 面DATA后面的数据代表的是“一段”的开始地址,如现在为20H,再看屏幕的最上方,数字 从0到F,显示两者相加就等于真正的地址值,如现在图上所示的内存20H、21H、22H、23H 中的值分别是 FBH、0EH、E8H、30H。 51单片机汇编语言教程-慧净电子会员收集整理 (全部 28课) 推荐使用慧净 51实验板。推荐 51学习网 WWW.HLMCU.COM 淘宝网:http://shop37031453.taobao.com/ 图5 当运行完程序后,即进入它的反汇编区,不是我们想要的东西。为了再从头开始,可以 用CTRL+F2功能键复位 PC值。注意此时不会看到原来的窗口,为看到原来的窗口,请用ALT+4 或ALT+5等来切换。当然以上操作也可以菜单进行。CTRL+F2是程序复位,用 RUN菜单。窗 口用WINDOWS 菜单。 此次大家就用用熟这个软件吧,说实话,我并不很喜欢它,操作起来不方便,但给我 的机器只能上这个,没办法,下次再给网友单独介绍一个好一点的吧。 总结:上面用到的 DOS软件,各位也不用找了在哪里有下载了,请你用学习板配套光碟 里的KEIL 软件吧,有专门的使用方法,请自己在光碟中查看,当大家学 C语言时,我们有 详细介绍。这一课,大家只要能认识单片机数据传递类指令是什么就可以了。 51实验板推荐(点击下面的图片可以进入下载资料链接) HJ-1G HJ-3G 51 单片机汇编语言教程-慧净电子会员收集整理 (全部 28课) 推荐使用慧净 51实验板。推荐 51学习网 WWW.HLMCU.COM 淘宝网:http://shop37031453.taobao.com/ 51单片机汇编语言教程:第10课-数据传送类指令 (基于HJ-1G、HJ-3G 实验板) 单片机的累加器 A与片外 RAM之间的数据传递类指令 MOVX A,@Ri MOVX@Ri,A MOVXA,@DPTR MOVX@DPTR,A 说明: 1)在51系列单片机中,与外部存储器 RAM打交道的只能是 A累加器。所有需要传送入外部 RAM的数据必需要通过 A送去,而所有要读入的外部 RAM中的数据也必需通过 A读入。在此 我们能看出内外部 RAM的区别了,内部RAM间能直接进行数据的传递,而外部则不行,比如, 要将外部 RAM中某一单元(设为0100H 单元的数据)送入另一个单元(设为0200H 单元),也 必须先将0100H 单元中的内容读入 A,然后再传送到0200H 单元中去。 要读或写外部的 RAM,当然也必须要知道 RAM的地址,在后两条单片机指令中,地址是被直 接放在 DPTR中的。而前两条指令,由于Ri(即R0或R1)只是一个8位的寄存器,所以只供 给低8位地址。因为有时扩展的外部 RAM的数量比较少,少于或等于256个,就只需要供给8 位地址就够了。 使用时应当首先将要读或写的地址送入 DPTR或Ri中,然后再用读写命令。 例:将单片机外部 RAM中100H 单元中的内容送入外部 RAM中200H 单元中。 MOVDPTR,#0100H MOVXA,@DPTR MOV DPTR,#0200H MOVX@DPTR,A 程序存储器向累加器 A传送指令 MOVCA,@A+DPTR 本指令是将 ROM中的数送入 A中。本指令也被称为单片机查表指令, 常用此指令来查一个已做好在 ROM中的表格 说明: 此条指令引出一个新的寻址办法:变址寻址。本指令是要在 ROM的一个地址单元中找出数据, 显然必须知道这个单元的地址,这个单元的地址是这样确定的:在执行本指令立脚点 DPTR 中有一个数,A中有一个数,执行指令时,将 A和DPTR中的数加起为,就成为要查找的单 元的地址。 51 单片机汇编语言教程-慧净电子会员收集整理 (全部 28课) 推荐使用慧净 51实验板。推荐 51学习网 WWW.HLMCU.COM 淘宝网:http://shop37031453.taobao.com/ 查找到的结果被放在 A中,因此,本条指令执行前后,A中的值不一定相同。 例:有一个数在 R0中,要求用查表的办法确定它的平方值(此数的取值范围是0-5) MOVDPTR,#TABLE MOVA,R0 MOVCA,@A+DPTR TABLE:DB 0,1,4,9,16,25 设R0中的值为2,送入A中,而DPTR 中的值则为 TABLE,则最终确定的 ROM单元的地址就是 TABLE+2,也就是到这个单元中去取数,取到的是4,显然它正是2的平方。其它数据也能类 推。 标号的真实含义:从这个地方也能看到另一个问题,我们使用了标号来替代具体的单元地址。 事实上,标号的真实含义就是地址数值。在这里它代表了,0,1,4,9,16,25这几个数据 在ROM中存放的起点位置。而在以前我们学过的如 LCALL DELAY 单片机指令中,DELAY 则代 表了以 DELAY 为标号的那段程序在 ROM中存放的起始地址。事实上,CPU正是通过这个地址 才找到这段程序的。 能通过以下的例程再来看一看标号的含义: MOVDPTR,#100H MOVA,R0 MOVCA,@A+DPTR ORG 0100H. DB 0,1,4,9,16,25 如果R0中的值为2,则最终地址为100H+2为102H,到102H 单元中找到的是4。这个能看懂了 吧? 那为什么不这样写程序,要用标号呢?不是增加疑惑吗? 如果这样写程序的话,在写程序时,我们就必须确定这张表格在 ROM中的具体的位置,如果 写完程序后,又想在这段程序前插入一段程序,那么这张表格的位置就又要变了,要改ORG 100H 这句话了,我们是经常需要修改程序的,那多麻烦,所以就用标号来替代,只要一编 译程序,位置就自动发生变化,我们把这个麻烦事交给计算机��指我们用的电脑去做 了。 堆栈操作 PUSH direct 51 单片机汇编语言教程-慧净电子会员收集整理 (全部 28课) 推荐使用慧净 51实验板。推荐 51学习网 WWW.HLMCU.COM 淘宝网:http://shop37031453.taobao.com/ POP direct 第一条指令称之为推入,就是将 direct 中的内容送入堆栈中,第二条指令称之为弹出,就 是将堆栈中的内容送回到 direct 中。推入指令的执行过程是,首先将 SP中的值加1,然后 把SP中的值当作地址,将 direct 中的值送进以 SP中的值为地址的 RAM单元中。例: MOVSP,#5FH MOVA,#100 MOVB,#20 PUSHACC PUSHB 则执行第一条 PUSHACC指令是这样的:将SP中的值加1,即变为60H,然后将 A中的值送到 60H 单元中,因此执行完本条指令后, 内存60H 单元的值就是100,同样,执行 PUSHB时, 是将SP+1,即变为61H,然后将 B中的值送入到61H 单元中,即执行完本条指令后,61H 单 元中的值变为20。 POP指令的在单片机中执行是这样的,首先将 SP中的值作为地址,并将此地址中的数送到 POP指令后面的那个 direct 中,然后 SP减1。 接上例: POPB POPACC 则执行过程是:将 SP中的值(现在是61H)作为地址,取61H 单元中的数值(现在是20), 送到B中,所以执行完本条指令后 B中的值是20,然后将 SP减1,因此本条指令执行完后, SP的值变为60H,然后执行 POPACC,将SP中的值(60H)作为地址,从该地址中取数(现 在是100),并送到 ACC中,所以执行完本条指令后,ACC 中的值是100。 这有什么意义呢?ACC中的值本来就是100,B中的值本来就是20,是的,在本例中,的确没 有意义,但在实际工作中,则在 PUSHB后一般要执行其他指令,而且这些指令会把 A中的 值,B中的值改掉,所以在程序的结束,如果我们要把 A和B中的值恢复原值,那么这些指 令就有意义了。 还有一个问题,如果我不用堆栈,比如说在 PUSHACC指令处用 MOV 60H,A,在PUSHB处 用指令 MOV 61H,B,然后用 MOVA,60H,MOVB,61H 来替代两条 POP指令,不是也一样吗? 是的,从结果上看是一样的,但是从过程看是不一样的,PUSH 和POP指令都是单字节,单 周期指令,而MOV指令则是双字节,双周期指令。更何况,堆栈的作用不止于此,所以一般 51 单片机汇编语言教程-慧净电子会员收集整理 (全部 28课) 推荐使用慧净 51实验板。推荐 51学习网 WWW.HLMCU.COM 淘宝网:http://shop37031453.taobao.com/ 的计算机上都设有堆栈,单片机也是一样,而我们在编写子程序,需要保存数据时,常常也 不采用后面的办法,而是用堆栈的办法来实现。 例:写出以下单片机程序的运行结果 MOV 30H,#12 MOV 31H,#23 PUSH 30H PUSH 31H POP 30H POP 31H 结果是30H 中的值变为23,而31H 中的值则变为12。也就两者进行了数据交换。从这个例程 能看出:使用堆栈时,入栈的书写次序和出栈的书写次序必须相反,才能保证数据被送回原 位,不然就要出错了。 51实验板推荐(点击下面的图片可以进入下载资料链接) HJ-1G HJ-3G 51 单片机汇编语言教程-慧净电子会员收集整理 (全部 28课) 推荐使用慧净 51实验板。推荐 51学习网 WWW.HLMCU.COM 淘宝网:http://shop37031453.taobao.com/ 51 51 51 51 单片机汇编语言教程:第11 11 11 11 课----单片机算术运算指令 (基于HJ-1G、HJ-3G 实验板) 不带进位位的单片机加法指令 ADDA,#DATA;例:ADDA,#10H ADD A,direct ;例:ADDA,10H ADD A,Rn ;例:ADDA,R7 ADD A,@Ri ;例:ADDA,@R0 用途:将 A中的值与其后面的值相加,最终结果否是回到 A中。 例:MOVA,#30H ADDA,#10H 则执行完本条指令后,A中的值为 40H。 下面的题目自行练习 MOV 34H,#10H MOV R0,#13H MOVA,34H ADDA,R0 MOV R1,#34H ADDA,@R1 带进位位的加法指令 ADDCA,Rn ADDC A,direct ADDC A,@Ri ADDC A,#data 用途:将 A中的值和其后面的值相加,并且加上进位位 C中的值。 说明:由于 51单片机是一种 8位机,所以只能做 8位的数学运算,但 8位运算的范围只有 0-255,这在实际工作中是不够的,因此就要进行扩展,一般是将 2个8位的数学运算合起 来,成为一个 16位的运算,这样,能表达的数的范围就能达到 0-65535。如何合并呢?其 实很简单,让我们看一个 10进制数的例程: 66+78。 这两个数相加,我们根本不在意这的过程,但事实上我们是这样做的:先做 6+8(低位), 然后再做 6+7,这是高位。做了两次加法,只是我们做的时候并没有刻意分成两次加法来做 罢了,或者说我们并没有意识到我们做了两次加法。之所以要分成两次来做,是因为这两个 数超过了一位数所能表达的范置(0-9)。 在做低位时产生了进位,我们做的时候是在适当的位置点一下,然后在做高位加法是将这一 点加进去。那么计算机中做 16位加法时同样如此,先做低 8位的,如果两数相加产生了进 位,也要“点一下”做个标记,这个标记就是进位位 C,在PSW 中。在进行高位加法是将这 个C加进去。例:1067H+10A0H,先做67H+A0H=107H,而107H 显然超过了 0FFH,因此 最终保存在 A中的是 7,而1则到了 PSW 中的CY 位了,换言之,CY 就相当于是 100H。 然后再做 10H+10H+CY,结果是 21H,所以最终的结果是 2107H。 带借位的单片机减法指令 SUBBA,Rn SUBB A,direct SUBB A,@Ri SUBB A,#data 51 单片机汇编语言教程-慧净电子会员收集整理 (全部 28课) 推荐使用慧净 51实验板。推荐 51学习网 WWW.HLMCU.COM 淘宝网:http://shop37031453.taobao.com/ 设(每个 H,(R2)=55H,CY=1,执行指令 SUBBA,R2 之后,A中的值为 73H。 说明:没有不带借位的单片机减法指令,如果需要做不带位的减法指令(在做第一次相减时), 只要将 CY 清零即可。 乘法指令 MULAB 此单片机指令的功能是将 A和B中的两个 8位无符号数相乘,两数相乘结果一般比较大, 因此最终结果用 1个16位数来表达,其中高 8位放在 B中,低8位放在 A中。在乘积大于 FFFFFH(65535)时,0V置1(溢出),不然 OV为0,而CY 总是0。 例:(A)=4EH,(B)=5DH,执行指令 MULAB后,乘积是 1C56H,所以在 B中放的是 1CH,而A中放的则是 56H。 除法指令 DIVAB 此单片机指令的功能是将 A中的8位无符号数除了 B中的8位无符号数(A/B)。除法一般 会出现小数,但计算机中可没法直接表达小数,它用的是我们小学生还没接触到小数时用的 商和余数的概念,如 13/5,其商是 2,余数是 3。除了以后,商放在 A中,余数放在 B中。 CY 和OV都是0。如果在做除法前 B中的值是 00H,也就是除数为 0,那么 0V=1。 加1指令 INCA INC Rn INC direct INC@Ri INCDPTR 用途很简单,就是将后面目标中的值加 1。例:(A)=12H,(R0)=33H,(21H)=32H,(34H) =22H,DPTR=1234H。执行下面的指令: INCA(A)=13H INC R2 (R0)=34H INC 21H (21H)=33H INC@R0 (34H)=23H INCDPTR(DPTR)=1235H 后结果如上所示。 说明:从结果上看 INCA和ADDA,#1差不多,但INCA是单字节,单周期指令,而ADD #1则是双字节,双周期指令,而且INCA不会影响 PSW 位,如(A)=0FFH,INCA后(A) =00H,而CY 依然保持不变。如果是 ADDA,#1,则(A)=00H,而CY 一定是 1。因此 加1指令并不适合做加法,事实上它主要是用来做计数、地址增加等用途。另外,加法类指 令都是以 A为核心的��其中一个数必须放在 A中,而运算结果也必须放在 A中,而 加1类指令的对象则广泛得多,能是寄存器、内存地址、间址寻址的地址等等。 减1指令 减1指令 DECA DECRN DEC direct DEC@Ri 与加1指令类似,就不多说了。 综合练习: 51 单片机汇编语言教程-慧净电子会员收集整理 (全部 28课) 推荐使用慧净 51实验板。推荐 51学习网 WWW.HLMCU.COM 淘宝网:http://shop37031453.taobao.com/ MOVA,#12H MOV R0,#24H MOV 21H,#56H ADDA,#12H MOVDPTR,#4316H ADDA,DPH ADDA,R0 CLRC SUBBA,DPL SUBBA,#25H INCA SETBC ADDCA,21H INC R0 SUBBA,R0 MOV 24H,#16H CLRC ADDA,@R0 先写出每步运行结果,然后将以上题目建入,并在软件仿真中运行,观察寄存器及有关单元 的内容的变化,是否与自已的预想结果相同。 51实验板推荐(点击下面的图片可以进入下载资料链接) HJ-1G HJ-3G 51单片机汇编语言教程-慧净电子会员收集整理 (全部 28课) 推荐使用慧净 51实验板。推荐 51学习网 WWW.HLMCU.COM 淘宝网:http://shop37031453.taobao.com/ 51单片机汇编语言教程:第12课-单片机逻辑运算类指令 (基于HJ-1G、HJ-3G 实验板) 对单片机的累加器 A的逻辑操作: CLRA;将A中的值清0,单周期单字节指令,与 MOVA,#00H 效果相同。 CPLA;将A中的值按位取反 RLA;将A中的值逻辑左移 RLCA;将A中的值加上进位位进行逻辑左移 RRA;将A中的值进行逻辑右移 RRCA;将A中的值加上进位位进行逻辑右移 SWAPA;将A中的值高、低4位交换。 例:(A)=73H,则执行 CPLA,这样进行: 73H 化为二进制为01110011, 逐位取反即为 10001100,也就是8CH。 RLA是将(A)中的值的第7位送到第0位,第0位送1位,依次类推。 例:A中的值为68H,执行 RLA。68H 化为二进制为01101000,按上图进行移动。01101000 化为11010000,即D0H。 RLCA,是将(A)中的值带上进位位(C)进行移位。 例:A中的值为68H,C中的值为1,则执行 RLCA 1 01101000后,结果是0 11010001,也就是 C进位位的值变成了0,而(A)则变成了 D1H。 RRA和RRCA就不多谈了,请大家参考上面两个例程自行练习吧。 SWAPA,是将 A中的值的高、低4位进行交换。 例:(A)=39H,则执行 SWAPA之后,A中的值就是93H。怎么正好是这么前后交换呢?因为 这是一个16进制数,每1个16进位数字代表4个二进位。注意,如果是这样的:(A)=39,后 面没H,执行SWAPA之后,可不是(A)=93。要将它化成二进制再算:39化为二进制是10111, 也就是0001,0111高4位是0001,低4位是0111,交换后是01110001,也就是71H,即113。 练习,已知(A)=39H,执行下列单片机指令后写出每步的结果 CPLA RLA CLRC RRCA 51单片机汇编语言教程-慧净电子会员收集整理 (全部 28课) 推荐使用慧净 51实验板。推荐 51学习网 WWW.HLMCU.COM 淘宝网:http://shop37031453.taobao.com/ SETBC RLCA SWAPA 通过前面的学习,我们已经掌握了相当一部份的单片机指令,大家对这些枯燥的单片机指令 可能也有些厌烦了,下面让我们轻松一下,做个实验。 实验五: ORG 0000H LJMPSTART ORG 30H START: MOV SP,#5FH MOV A,#80H LOOP: MOV P1,A RLA LCALLDELAY LJMPLOOP delay: mov r7,#255 d1: mov r6,#255 d2: nop nop nop nop djnz r6,d2 djnz r7,d1 ret END 先让我们将程序写入片中,装进实验板,看一看现象。 看到的是一个暗点流动的现象,让我们来分析一下吧。 51单片机汇编语言教程-慧净电子会员收集整理 (全部 28课) 推荐使用慧净 51实验板。推荐 51学习网 WWW.HLMCU.COM 淘宝网:http://shop37031453.taobao.com/ 前而的 ORG 0000H、LJMPSTART、ORG 30H 等我们稍后分析。从 START 开始,MOVSP,#5FH, 这是初始化堆栈,在本程序中有无此句无关紧要,不过我们慢慢开始接触正规的编程,我也 就慢慢给大家培养习惯吧。 MOVA,#80H,将80H 这个数送到 A中去。干什么呢?不知道,往下看。 MOV P1,A。将A中的值送到 P1端口去。此时 A中的值是80H,所以送出去的也就是80H,因 此P1口的值是80H,也就是10000000B,通过前面的分析,我们应当知道,此时 P1。7接的 LED是不亮的,而其它的 LED都是亮的,所以就形成了一个“暗点”。继续看,RLA,RLA 是将A中的值进行左移,算一下,移之后的结果是什么?对了,是01H,也就是00000001B, 这样,应当是接在 P1。0上的LED不亮,而其它的都亮了,从现象上看“暗点”流到了后面。 然后是调用延时程序,这个我们很熟悉了,让这个“暗点”“暗”一会儿。然后又调转到 LOOP处(LJMPLOOP)。请大家计算一下,下面该哪个灯不亮了。。。。。对了,应当是接在 P1。 1上灯不亮了。这样依次循环,就形成了“暗点流动”这一现象。 问题: 如何实现亮点流动? 如何改变流动的方向? 答案: 1、将A中的初始值改为7FH 即可。 2、将RLA改为RRA即可。 51实验板推荐(点击下面的图片可以进入下载资料链接) HJ-1G HJ-3G 51 单片机汇编语言教程-慧净电子会员收集整理 (全部 28课) 推荐使用慧净 51实验板。推荐 51学习网 WWW.HLMCU.COM 淘宝网:http://shop37031453.taobao.com/ 51单片机汇编语言教程:第13课-单片机逻辑与或异或指令详解 (基于HJ-1G、HJ-3G 实验板) ANL A,Rn ;A与Rn中的值按位'与',结果送入 A中 ANL A,direct ;A与direct 中的值按位'与',结果送入 A中 ANL A,@Ri ;A与间址寻址单元@Ri 中的值按位'与',结果送入 A中 ANL A,#data ;A与立即数 data 按位'与',结果送入 A中 ANL direct,A ;direct 中值与 A中的值按位'与',结果送入 direct 中 ANL direct,#data ;direct 中的值与立即数 data 按位'与',结果送入 direct 中。 这几条指令的关键是知道什么是逻辑与。这里的逻辑与是指按位与 例:71H 和56H 相与则将两数写成二进制形式: (71H) 01110001 (56H) 00100110 结果 00100000 即20H,从上面的式子能看出,两个参与运算的值只要其中有一个位上是0, 则这位的结果就是0,两个同是1,结果才是1。 理解了逻辑与的运算规则,结果自然就出来了。看每条指令后面的注释 下面再举一些例程来看。 MOVA,#45H ;(A)=45H MOV R1,#25H ;(R1)=25H MOV 25H,#79H ;(25H)=79H ANLA,@R1 ;45H 与79H 按位与,结果送入 A中为 41H (A)=41H ANL 25H,#15H ;25H 中的值(79H)与15H 相与结果为(25H)=11H) ANL 25H,A ;25H 中的值(11H)与A中的值(41H)相与,结果为(25H)=11H 在知道了逻辑与指令的功能后,逻辑或和逻辑异或的功能就很简单了。逻辑或是按位“或”, 即有“1”为1,全“0”为0。例: 10011000 或 01100001 结果 11111001 而异或则是按位“异或”,相同为“0”,相异为“1”。例: 10011000 异或 01100001 51 单片机汇编语言教程-慧净电子会员收集整理 (全部 28课) 推荐使用慧净 51实验板。推荐 51学习网 WWW.HLMCU.COM 淘宝网:http://shop37031453.taobao.com/ 结果 11111001 而所有的或指令,就是将与指仿中的 ANL 换成ORL,而异或指令则是将 ANL 换成XRL。即 或指令: ORL A,Rn ;A和Rn中的值按位'或',结果送入 A中 ORL A,direct ;A和与间址寻址单元@Ri 中的值按位'或',结果送入 A中 ORL A,#data ;A和立direct 中的值按位'或',结果送入 A中 ORL A,@Ri ;A和即数 data 按位'或',结果送入 A中 ORL direct,A ;direct 中值和 A中的值按位'或',结果送入 direct 中 ORL direct,#data ;direct 中的值和立即数 data 按位'或',结果送入 direct 中。 异或指令: XRL A,Rn ;A和Rn中的值按位'异或',结果送入 A中 XRL A,direct ;A和direct 中的值按位'异或',结果送入 A中 XRL A,@Ri ;A和间址寻址单元@Ri 中的值按位'异或',结果送入 A中 XRL A,#data ;A和立即数 data 按位'异或',结果送入 A中 XRL direct,A ;direct 中值和 A中的值按位'异或',结果送入 direct 中 XRL direct,#data ;direct 中的值和立即数 data 按位'异或',结果送入 direct 中。 练习: MOVA,#24H MOV R0,#37H ORLA,R0 XRLA,#29H MOV 35H,#10H ORL 35H,#29H MOV R0,#35H ANLA,@R0 四、控制转移类指令 无条件转移类指令 短转移类指令 AJMP addr11 长转移类指令 51 单片机汇编语言教程-慧净电子会员收集整理 (全部 28课) 推荐使用慧净 51实验板。推荐 51学习网 WWW.HLMCU.COM 淘宝网:http://shop37031453.taobao.com/ LJMP addr16 相对转移指令 SJMP rel 上面的三条指令,如果要仔细分析的话,区别较大,但开始学习时,可不理会这么多,统统 理解成:JMP 标号,也就是跳转到一个标号处。事实上,LJMP 标号,在前面的例程中我们 已接触过,并且也知道如何来使用了。而AJMP和SJMP 也是一样。那么他们的区别何在呢? 在于跳转的范围不一样。好比跳远,LJMP一下就能跳64K 这么远(当然近了更没关系了)。 而AJMP 最多只能跳2K距离,而SJMP 则最多只能跳256这么远。原则上,所有用 SJMP 或AJMP 的地方都能用 LJMP 来替代。因此在开始学习时,需要跳转时能全用 LJMP,除了一个场合。 什么场合呢?先了解一下 AJMP,AJMP 是一条双字节指令,也就说这条指令本身占用存储器 (ROM)的两个单元。而LJMP 则是三字节指令,即这条指令占用存储器(ROM)的三个单元。 下面是第四条跳转指令。 间接转移指令 JMP@A+DPTR 这条指令的用途也是跳转,转到什么地方去呢?这可不能由标号简单地决定了。让我们从一 个实际的例程入手吧。 MOVDPTR,#TAB;将TAB所代表的地址送入 DPTR MOVA,R0 ;从R0中取数(详见下面说明) MOVB,#2 MULA,B;A中的值乘2(详见下面的说明) JMPA,@A+DPTR ;跳转 TAB:AJMP S1 ;跳转表格 AJMP S2 AJMP S3 51 单片机汇编语言教程-慧净电子会员收集整理 (全部 28课) 推荐使用慧净 51实验板。推荐 51学习网 WWW.HLMCU.COM 淘宝网:http://shop37031453.taobao.com/ 图 应用背景介绍:在单片机开发中,经常要用到键盘,见上面的9个按钮的键盘。我们的 要求是:当按下功能键 A………..G时去完成不一样的功能。这用程序设计的语言来表达的 话,就是:按下不一样的键去执行不一样的程序段,以完成不一样的功能。怎么样来实现呢? 看图2,前面的程序读入的是按钮的值,如按下'A'键后获得的键值是0,按下'B'键后获 得的值是'1'等等,然后根据不一样的值进行跳转,如键值为0就转到 S1执行,为1就转到 S2 执行。。。。如何来实现这一功能呢? 先从程序的下面看起,是若干个 AJMP语句,这若干个 AJMP 语句最后在存储器中是这样 存放的(见图3),也就是每个 AJMP语句都占用了两个存储器的空间,并且是连续存放的。 而AJMP S1存放的地址是 TAB,到底 TAB等于多少,我们不需要知道,把它留给汇编程序来 算好了。 下面我们来看这段程序的执行过程:第一句 MOVDPTR,#TAB 执行完了之后,DPTR 中的 值就是 TAB,第二句是 MOVA,R0,我们假设 R0是由按钮处理程序获得的键值,比如按下 A 键,R0中的值是0,按下B键,R0中的值是1,以此类推,现在我们假设按下的是 B键,则执 行完第二条指令后,A中的值就是1。并且按我们的分析,按下 B后应当执行 S2这段程序, 让我们来看一看是否是这样呢?第三条、第四条指令是将 A中的值乘2,即执行完第4条指令 后A中的值是2。下面就执行 JMP@A+DPTR 了,现在 DPTR中的值是 TAB,而A+DPTR 后就是 51 单片机汇编语言教程-慧净电子会员收集整理 (全部 28课) 推荐使用慧净 51实验板。推荐 51学习网 WWW.HLMCU.COM 淘宝网:http://shop37031453.taobao.com/ TAB+2,因此,执行此句程序后,将会跳到 TAB+2这个地址继续执行。看一看在 TAB+2这个地 址里面放的是什么?就是 AJMP S2这条指令。因此,马上又执行 AJMP S2指令,程序将跳到 S2处往下执行,这与我们的要求相符合。 请大家自行分析按下键“A”、“C”、“D”……之后的情况。 这样我们用 JMP@A+DPTR 就实现了按下一键跳到对应的程序段去执行的这样一个要求。 再问大家一个问题,为什么取得键值后要乘2?如果例程下面的所有指令换成 LJMP,即: LJMP S1,LJMP S2……这段程序还能正确地执行吗?如果不能,应该怎么改? 51实验板推荐(点击下面的图片可以进入下载资料链接) HJ-1G HJ-3G 51 单片机汇编语言教程-慧净电子会员收集整理 (全部 28课) 推荐使用慧净 51实验板。推荐 51学习网 WWW.HLMCU.COM 淘宝网:http://shop37031453.taobao.com/ 51单片机汇编语言教程:第14课-单片机条件转移指令 (基于HJ-1G、HJ-3G 实验板) 条件转移指令是指在满足一定条件时进行相对转移。 判A内容是否为0转移指令 JZ rel JNZ rel 第一指令的功能是:如果(A)=0,则转移,不然次序执行(执行本指令的下一条指令)。转移 到什么地方去呢?如果按照传统的办法,就要算偏移量,很麻烦,好在现在我们能借助于机 器汇编了。因此这第指令我们能这样理解:JZ 标号。即转移到标号处。下面举一例说明: MOV A,R0 JZ L1 MOV R1,#00H AJMP L2 L1: MOV R1,#0FFH L2: SJMP L2 END 在执行上面这段程序前如果 R0中的值是0的话,就转移到 L1执行,因此最终的执行结果是 R1中的值为0FFH。而如果 R0中的值不等于0,则次序执行,也就是执行 MOV R1,#00H 指令。 最终的执行结果是 R1中的值等于0。 第一条指令的功能清楚了,第二条当然就好理解了,如果 A中的值不等于0,就转移。把上 面的那个例程中的 JZ改成JNZ试试吧,看看程序执行的结果是什么? 比较转移指令 CJNE A,#data,rel CJNE A,direct,rel CJNE Rn,#data,rel CJNE@Ri,#data,rel 第一条指令的功能是将 A中的值和立即数 data 比较,如果两者相等,就次序执行(执行本 指令的下一条指令),如果不相等,就转移,同样地,我们能将 rel 理解成标号,即:CJNEA, #data,标号。这样利用这条指令,我们就能判断两数是否相等,这在很多场合是非常有用的。 但有时还想得知两数比较之后哪个大,哪个小,本条指令也具有这样的功能,如果两数不相 51 单片机汇编语言教程-慧净电子会员收集整理 (全部 28课) 推荐使用慧净 51实验板。推荐 51学习网 WWW.HLMCU.COM 淘宝网:http://shop37031453.taobao.com/ 等,则 CPU还会反映出哪个数大,哪个数小,这是用 CY(进位位)来实现的。如果前面的 数(A中的)大,则CY=0,不然CY=1,因此在程序转移后再次利用 CY就可判断出 A中的数 比data 大还是小了。 例: MOV A,R0 CJNE A,#10H,L1 MOV R1,#0FFH AJMP L3 L1: JC L2 MOV R1,#0AAH AJMP L3 L2: MOV R1,#0FFH L3: SJMP L3 上面的程序中有一条单片机指令我们还没学过,即JC,这条指令的原型是 JC rel,作用和上 面的JZ类似,但是它是判 CY是0,还是1进行转移,如果CY=1,则转移到 JC后面的标号处 执行,如果 CY=0则次序执行(执行它的下面一条指令)。 分析一下上面的程序,如果(A)=10H,则次序执行,即R1=0。如果(A)不等于10H,则转 到L1处继续执行,在 L1处,再次进行判断,如果(A)>10H,则CY=1,将次序执行,即执 行MOV R1,#0AAH 指令,而如果(A)<10H,则将转移到 L2处指行,即执行 MOV R1,#0FFH 指令。因此最终结果是:本程序执行前,如果(R0)=10H,则(R1)=00H,如果(R0)>10H, 则(R1)=0AAH,如果(R0)<10H,则(R1)=0FFH。 弄懂了这条指令,其它的几条就类似了,第二条是把 A当中的值和直接地址中的值比较,第 三条则是将直接地址中的值和立即数比较,第四条是将间址寻址得到的数和立即数比较,这 里就不详谈了,下面给出几个对应的例程。 CJNE A,10H ;把A中的值和10H 中的值比较(注意和上题的区别) CJNE 10H,#35H ;把10H 中的值和35H 中的值比较 CJNE@R0,#35H ;把R0中的值作为地址,从此地址中取数并和35H 比较 循环转移指令 DJNZ Rn,rel DJNZ direct,rel 51 单片机汇编语言教程-慧净电子会员收集整理 (全部 28课) 推荐使用慧净 51实验板。推荐 51学习网 WWW.HLMCU.COM 淘宝网:http://shop37031453.taobao.com/ 第一条指令在前面的例程中有详细的分析,这里就不多谈了。第二条指令,只是将 Rn改成 直接地址,其它一样,也不多说了,给一个例程。 DJNZ 10H,LOOP 3.调用与返回指令 (1)主程序与子程序 在前面的灯的实验中,我们已用到过了子程序,只是我们并没有明确 地介绍。子程序是干什么用的,为什么要用子程序技术呢?举个例程,我们数据老师布置了 10道算术题,经过观察,每一道题中都包含一个(3*5+2)*3的运算,我们能有两种选择, 第一种,每做一道题,都把这个算式算一遍,第二种选择,我们能先把这个结果算出来,也 就是51,放在一边,然后要用到这个算式时就将51代进去。这两种办法哪种更好呢?不必多 言。设计程序时也是这样,有时一个功能会在程序的不一样地方反复使用,我们就能把这个 功能做成一段程序,每次需要用到这个功能时就“调用”一下。 (2)调用及回过程:主程序调用了子程序,子程序执行完之后必须再回到主程序继续执行, 不能“一去不回头”,那么回到什么地方呢?是回到调用子程序的下面一条指令继续执行 (当然啦,要是还回到这条指令,不又要再调用子程序了吗?那可就没完没了了……)。参 考图1 调用指令 LCALL addr16 ;长调用指令 ACALL addr11 ;短调用指令 上面两条指令都是在主程序中调用子程序,两者有一定的区别,但在开始学习单片机的这些 指令时,能不加以区别,而且能用 LCALL 标号,ACALL 标号,来理解,即调用子程序。 51 单片机汇编语言教程-慧净电子会员收集整理 (全部 28课) 推荐使用慧净 51实验板。推荐 51学习网 WWW.HLMCU.COM 淘宝网:http://shop37031453.taobao.com/ (5)返回指令则说了,子程序执行完后必须回到主程序,如何返回呢?只要执行一条返回 指令就能了,即执行 ret 指令 4.空操作指令 nop 就是 空操作,就是什么事也不干,停一个周期,一般用作短时间的延时。 51实验板推荐(点击下面的图片可以进入下载资料链接) HJ-1G HJ-3G 51 单片机汇编语言教程-慧净电子会员收集整理 (全部 28课) 推荐使用慧净 51实验板。推荐 51学习网 WWW.HLMCU.COM 淘宝网:http://shop37031453.taobao.com/ 51单片机汇编语言教程:第15课-单片机位操作指令 (基于HJ-1G、HJ-3G 实验板) 前面那些流水灯的例程,我们已经习惯了“位”一位就是一盏灯的亮和灭,而我们学的 指令却全都是用“字节”来介绍的:字节的移动、加法、减法、逻辑运算、移位等等。用字 节来处理一些数学问题,比如说:控制冰箱的温度、电视的音量等等很直观,能直接用数值 来表在。可是如果用它来控制一些开关的打开和合上,灯的亮和灭,就有些不直接了,记得 我们上次课上的流水灯的例程吗?我们知道送往 P1口的数值后并不能马上知道哪个灯亮和 来灭,而是要化成二进制才知道。工业中有很多场合需要处理这类开关输出,继电器吸合, 用字节来处理就显示有些麻烦,所以在8031单片机中特意引入一个位处理机制。 位寻址区在8031中,有一部份 RAM和一部份 SFR是具有位寻址功能的,也就是说这些 RAM 的每一个位都有自已的地址,能直接用这个地址来对此进行操作。 内部RAM的20H-2FH 这16个字节,就是8031的位寻址区。看图1。可见这里面的每一个 RAM 中的每个位我们都可能直接用位地址来找到它们,而不必用字节地址,然后再用逻辑指令的 方式。 能位寻址的特殊功能寄存器8031中有一些 SFR是能进行位寻址的,这些SFR的特点是其字节 地址均可被8整除,如 A累加器,B寄存器、PSW、IP(中断优先级控制寄存器)、IE(中断 允许控制寄存器)、SCON(串行口控制寄存器)、TCON(定时器/计数器控制寄存器)、P0-P3 (I/O端口锁存器)。以上的一些 SFR我们还不熟,等我们讲解相关内容时再作详细解释。 位操作指令 MCS-51单片机的硬件结构中,有一个位处理器(又称布尔处理器),它有一套位 变量处理的指令集。在进行位处理时,CY(就是我们前面讲的进位位)称“位累加器”。有 自已的位 RAM,也就是我们刚讲的内部 RAM的20H-2FH 这16个字节单元即128个位单元,还有 自已的位 I/O空间(即 P0.0…..P0.7,P1.0…….P1.7,P2.0……..P2.7,P3.0……..P3.7)。 当然在物理实体上它们与原来的以字节寻址用的 RAM,及端口是完全相同的,或者说这些 RAM 及端口都能有两种使用办法。 位传送指令 MOVC,BIT MOVBIT,C 这组指令的功能是实现位累加器(CY)和其它位地址之间的数据传递。 例:MOV P1.0,CY ;将CY中的状态送到 P1.0管脚上去(如果是做算术运算,我们就能通过 观察知道现在 CY是多少啦)。 51 单片机汇编语言教程-慧净电子会员收集整理 (全部 28课) 推荐使用慧净 51实验板。推荐 51学习网 WWW.HLMCU.COM 淘宝网:http://shop37031453.taobao.com/ MOV P1.0,CY ;将P1.0的状态送给 CY。 位修正指令 位清0指令 CLRC;使CY=0 CLR bit ;使指令的位地址等于0。例:CLR P1.0 ;即使P1.0变为0 位置1指令 SETBC;使CY=1 SETB bit ;使指定的位地址等于1。例:SETB P1.0 ;使P.0变为1 位取反指令 CPLC;使CY等于原来的相反的值,由1变为0,由0变为1。 CPL bit ;使指定的位的值等于原来相反的值,由0变为1,由1变为0。 例:CPL P1.0 以我们做过的实验为例,如果原来灯是亮的,则执行本指令后灯灭,反之原来灯是灭的,执 行本指令后灯亮。 位逻辑运算指令 位与指令 ANL C,bit ;CY 与指定的位地址的值相与,结果送回 CY ANL C,/bit ;先将指定的位地址中的值取出后取反,再和 CY相与,结果送回 CY,但注意, 指定的位地址中的值本身并不发生变化。 例:ANL C,/P1.0 设执行本指令前,CY=1,P1.0等于1(灯灭),则执行完本指令后 CY=0,而P1.0也是等于1。 可用下列程序验证: ORG 0000H AJMPSTART ORG 30H START:MOVSP,#5FH MOV P1,#0FFH SETBC ANLC,/P1.0 MOV P1.1,C ;将做完的结果送 P1.1,结果应当是 P1.1上的灯亮,而 P1.0上的灯还是不亮 51 单片机汇编语言教程-慧净电子会员收集整理 (全部 28课) 推荐使用慧净 51实验板。推荐 51学习网 WWW.HLMCU.COM 淘宝网:http://shop37031453.taobao.com/ 位或指令 ORL C,bit ORL C,/bit 这个的功能大家自行分析吧,然后对照上面的例程,编一个验证程序,看看你相得对吗? 位条件转移指令 判CY转移指令 JC rel JNC rel 第一条指令的功能是如果 CY等于1就转移,如果不等于1就次序执行。那么转移到什么地方 去呢?我们能这样理解:JC 标号,如果等于1就转到标号处执行。这条指令我们在上节课中 已讲到,不再重复。 第二条指令则和第一条指令相反,即如果 CY=0就转移,不等于0就次序执行,当然,我们也 同样理解: JNC 标号 判位变量转移指令 JB bit,rel JNB bit,rel 第一条指令是如果指定的 bit 位中的值是1,则转移,不然次序执行。同样,我们能这样理 解这条指令:JB bit,标号 第二条指令请大家先自行分析 下面我们举个例程说明: ORG 0000H LJMPSTART ORG 30H START:MOVSP,#5FH MOV P1,#0FFH MOV P3,#0FFH L1: JNB P3.2,L2 ;P3.2上接有一只按钮,它按下时,P3.2=0 JNB P3.3,L3 ;P3.3上接有一只按钮,它按下时,P3.3=0 LJMP L1 L2: MOV P1,#00H 51 单片机汇编语言教程-慧净电子会员收集整理 (全部 28课) 推荐使用慧净 51实验板。推荐 51学习网 WWW.HLMCU.COM 淘宝网:http://shop37031453.taobao.com/ LJMP L1 L3: MOV P1,#0FFH LJMP L1 END 把上面的例程写入片子,看看有什么现象……… 按下接在 P3.2上的按钮,P1口的灯全亮了,松开或再按,灯并不熄灭,然后按下接在 P3.3 上的按钮,灯就全灭了。这像什么?这不就是工业现场经常用到的“启动”、“停止”的功 能吗? 怎么做到的呢?一开始,将0FFH 送入P3口,这样,P3的所有引线都处于高电平,然后执行 L1,如果 P3.2是高电平(键没有按下),则次序执行 JNB P3.3,L3语句,同样,如果 P3.3是 高电平(键没有按下),则次序执行 LJMP L1语句。这样就不停地检测 P3.2、P3.3,如果有 一次P3.2上的按钮按下去了,则转移到 L2,执行MOV P1,#00H,使灯全亮,然后又转去 L1, 再次循环,直到检测到 P3.3为0,则转 L3,执行 MOV P1,#0FFH,例灯全灭,再转去 L1,如 此循环不已。大家能否稍加改动,将本程序用 JB指令改写? 51实验板推荐(点击下面的图片可以进入下载资料链接) HJ-1G HJ-3G 51 单片机汇编语言教程-慧净电子会员收集整理 (全部 28课) 推荐使用慧净 51实验板。推荐 51学习网 WWW.HLMCU.COM 淘宝网:http://shop37031453.taobao.com/ 51单片机汇编语言教程:第16课-单片机定时器与计算器 (基于HJ-1G、HJ-3G 实验板) 一、计数概念的引入 从选票的统计谈起:画“正”。这就是计数,生活中计数的例程处处可见。例:录音机 上的计数器、家里面用的电度表、汽车上的里程表等等,再举一个工业生产中的例程,线缆 行业在电线生产出来之后要计米,也就是测量长度,怎么测法呢?用尺量?不现实,太长不 说,要一边做一边量呢,怎么办呢?行业中有很巧妙的办法,用一个周长是1米的轮子,将 电缆绕在上面一周,由线带轮转,这样轮转一周不就是线长1米嘛,所以只要记下轮转了多 少圈,就能知道走过的线有多长了。 二、计数器的容量 从一个生活中的例程看起:一个水盆在水龙头下,水龙没关紧,水一滴滴地滴入盆中。水 滴持续落下,盆的容量是有限的,过一段时间之后,水就会逐渐变满。录音机上的计数器最 多只计到999….那么单片机中的计数器有多大的容量呢?8031单片机中有两个计数器,分别 称之为 T0和T1,这两个计数器分别是由两个8位的RAM单元组成的,即每个计数器都是16 位的计数器,最大的计数量是65536。 三、定时 8031中的计数器除了能作为计数之用外,还能用作时钟,时钟的用途当然很大,如打铃器, 电视机定时关机,空调定时开关等等,那么计数器是如何作为定时器来用的呢? 一个闹钟,我将它定时在1个小时后闹响,换言之,也能说是秒针走了(3600)次,所以时 间就转化为秒针走的次数的,也就是计数的次数了,可见,计数的次数和时间之间的确十分 相关。那么它们的关系是什么呢?那就是秒针每一次走动的时间正好是1秒。 <单片机定时器记数器结构> 结论:只要计数脉冲的间隔相等,则计数值就代表了时间的流逝。由此,单片机中的定时器 和计数器是一个东西,只不过计数器是记录的外界发生的事情,而定时器则是由单片机供给 一个非常稳定的计数源。那么供给组定时器的是计数源是什么呢?看图1,原来就是由单片 51 单片机汇编语言教程-慧净电子会员收集整理 (全部 28课) 推荐使用慧净 51实验板。推荐 51学习网 WWW.HLMCU.COM 淘宝网:http://shop37031453.taobao.com/ 机的晶体震荡器经过12分频后获得的一个脉冲源。晶体震荡器的频率当然很准,所以这个计 数脉冲的时间间隔也很准。问题:一个12M 的晶体震荡器,它供给给计数器的脉冲时间间隔 是多少呢?当然这很不难,就是12M/12等于1M,也就是1个微秒。结论:计数脉冲的间隔与 晶体震荡器有关,12M 的晶体震荡器,计数脉冲的间隔是1微秒。 四、溢出 让我们再来看水滴的例程,当水持续落下,盆中的水持续变满,最终有一滴水使得盆中的水 满了。这个时候如果再有一滴水落下,就会发生什么现象?水会漫出来,用个术语来讲就是 “溢出”。 水溢出是流到地上,而计数器溢出后将使得 TF0变为“1”。至于 TF0是什么我们稍后再谈。 一旦TF0由0变成1,就是产生了变化,产生了变化就会引发事件,就象定时的时间一到,闹 钟就会响一样。至于会引发什么事件,我们下次课再介绍,现在我们来研究另一个问题:要 有多少个计数脉冲才会使 TF0由0变为1。 五、任意定时及计数的办法 刚才已研究过,计数器的容量是16位,也就是最大的计数值 到65536,因此计数计到65536就会产生溢出。这个没有问题,问题是我们现实生活中,经常 会有少于65536个计数值的要求,如包装线上,一打为12瓶,一瓶药片为100粒,怎么样来满 足这个要求呢? 提示:如果是一个空的盆要1万滴水滴进去才会满,我在开始滴水之前就先放入一勺水,还 需要10000滴嘛?对了,我们采用预置数的办法,我要计100,那我就先放进65436,再来100 个脉冲,不就到了65536了吗。定时也是如此,每个脉冲是1微秒,则计满65536个脉冲需时 65.536毫秒,但现在我只要10毫秒就能了,怎么办?10个毫秒为10000个微秒,所以,只要 在计数器里面放进55536就能了。 51实验板推荐(点击下面的图片可以进入下载资料链接) HJ-1G HJ-3G 51 单片机汇编语言教程-慧净电子会员收集整理 (全部 28课) 推荐使用慧净 51实验板。推荐 51学习网 WWW.HLMCU.COM 淘宝网:http://shop37031453.taobao.com/ 51单片机汇编语言教程:17课单片机定时器与计数器的方式控制字 (基于HJ-1G、HJ-3G 实验板) 从上一节我们已经得知,单片机中的定时/计数器都能有多种用途,那么我怎样才能让 它们工作于我所需要的用途呢?这就要通过定时/计数器的方式控制字来设置。 在单片机中有两个特殊功能寄存器与定时/计数有关,这就是 TMOD和TCON。顺便说一下, TMOD和TCON是名称,我们在写程序时就能直接用这个名称来指定它们,当然也能直接用它 们的地址89H 和88H 来指定它们(其实用名称也就是直接用地址,汇编软件帮你翻译一下而 已)。 从图1中我们能看出,TMOD 被分成两部份,每部份4位。分别用于控制 T1和T0,至于这里面 是什么意思,我们下面介绍。 从图2中我们能看出,TCON也被分成两部份,高4位用于定时/计数器,低4位则用于中断(我 们暂不管)。而TF1(0)我们上节课已提到了,当计数溢出后 TF1(0)就由0变为1。原来 TF1(0)在这儿!那么 TR0、TR1又是什么呢?看上节课的图。 计数脉冲要进入计数器还真不不难,有层层关要通过,最起码,就是TR0(1)要为1,开关 才能合上,脉冲才能过来。因此,TR0(1)称之为运行控制位,可用指令 SETB 来置位以启 动计数器/定时器运行,用指令 CLR来关闭定时/计数器的工作,一切尽在自已的掌握中。 51 单片机汇编语言教程-慧净电子会员收集整理 (全部 28课) 推荐使用慧净 51实验板。推荐 51学习网 WWW.HLMCU.COM 淘宝网:http://shop37031453.taobao.com/ 定时/计数器的四种工作方式 工作方式0 定时器/计数器的工作方式0称之为13位定时/计数方式。它由TL(1/0)的低5位和TH(0/1) 的8位组成13位的计数器,此时 TL(1/0)的高3位未用。 我们用这个图来讨论几个问题: M1M0:定时/计数器一共有四种工作方式,就是用 M1M0来控制的,2位正好是四种组合。 C/T:前面我们说过,定时/计数器即可作定时用也可用计数用,到底作什么用,由我们根据 需要自行决定,也说是决定权在我们��编程者。如果 C/T为0就是用作定时器(开关 往上打),如果C/T为1就是用作计数器(开关往下打)。顺便提一下:一个定时/计数器同一 时刻要么作定时用,要么作计数用,不能同时用的,这是个极普通的常识,几乎没有教材会 提这一点,但很多开始学习者却会有此困惑。 GATE:看图,当我们选择了定时或计数工作方式后,定时/计数脉冲却不一定能到达计数器 端,中间还有一个开关,显然这个开关不合上,计数脉冲就没法过去,那么开关什么时候过 去呢?有两种情况 GATE=0,分析一下逻辑,GATE非后是1,进入或门,或门总是输出1,和或门的另一个输入 端INT1无关,在这种情况下,开关的打开、合上只取决于 TR1,只要TR1是1,开关就合上, 计数脉冲得以畅通无阻,而如果 TR1等于0则开关打开,计数脉冲无法通过,因此定时/计数 是否工作,只取决于 TR1。 GATE=1,在此种情况下,计数脉冲通路上的开关不仅要由 TR1来控制,而且还要受到 INT1 管脚的控制,只有 TR1为1,且INT1管脚也是高电平,开关才合上,计数脉冲才得以通过。 这个特性能用来测量一个信号的高电平的宽度,想想看,怎么测? 为什 么在这种模式下只用13位呢?干吗不用16位,这是为了和51机的前辈48系列兼容而设 的一种工作式,如果你觉得用得不顺手,那就干脆用第二种工作方式。 工作方式1 工作方式1是16位的定时/计数方式,将 M1M0设为01即可,其它特性与工作方式0相同。 工作方式2 在介绍这种式方式之前先让我们思考一个问题:上一次课我们提到过任意计数及任意定时的 问题,比如我要计1000个数,可是16位的计数器要计到65536才满,怎么办呢?我们讨论后 得出的办法是用预置数,先在计数器里放上64536,再来1000个脉冲,不就行了吗?是的, 但是计满了之后我们又该怎么办呢?要知道,计数总是持续重复的,流水线上计满后马上又 51 单片机汇编语言教程-慧净电子会员收集整理 (全部 28课) 推荐使用慧净 51实验板。推荐 51学习网 WWW.HLMCU.COM 淘宝网:http://shop37031453.taobao.com/ 要开始下一次计数,下一次的计数还是1000吗?当计满并溢出后,计数器里面的值变成了0 (为什么,能参考前面课程的说明),因此下一次将要计满65536后才会溢出,这可不符合要 求,怎么办?当然办法很简单,就是每次一溢出时执行一段程序(这常常是需要的,要不然 要溢出干吗?)能在这段程序中做把预置数64536送入计数器中的事情。所以采用工作方式0 或1都要在溢出后做一个重置预置数的工作,做工作当然就得要时间,一般来说这点时间不 算什么,可是有一些场合我们还是要计较的,所以就有了第三种工作方式��自动再装 入预置数的工作方式。 既然要自动得新装入预置数,那么预置数就得放在一个地方,要不然装什么呢?那么预置数 放在什么地方呢?它放在 T(0/1)的高8位,那么这样高8位不就不能参与计数了吗?是的, 在工作方式2,只有低8位参与计数,而高8位不参与计数,用作预置数的存放,这样计数范 围就小多了,当然做任可事总有代价的,关键是看值不值,如果我根本不需要计那么多数, 那么就能用这种方式。看图4,每当计数溢出,就会打开 T(0/1)的高、低8位之间的开关, 计预置数进入低8位。这是由硬件自动完成的,不需要由人工干预。 常常这种式作方式用于波特率发生器(我们将在串行接口中讲解),用于这种用途时,定时 器就是为了供给一个时间基准。计数溢出后不需要做事情,要做的仅仅只有一件,就是重新 装入预置数,再开始计数,而且中间不要任何延迟,可见这个任务用工作方式2来完成是最 妙不过了。 工作方式3 这种式作方式之下,定时/计数器0被拆成2个独立的定时/计数器来用。其中,TL0能组成8 位的定时器或计数器的工作方式,而TH0则只能作为定时器来用。我们知道作定时、计数器 来用,需要控制,计满后溢出需要有溢出标记,T0被分成两个来用,那就要两套控制及、溢 出标记了,从何而来呢?TL0还是用原来的 T0的标记,而TH0则借用 T1的标记。如此T1不是 无标记、控制可用了吗?是的。 一般情况处,只有在 T1以工作方式2运行(当波特率发生器用)时,才让T0工作于方式3的。 定时器/计数器的定时/计数范围 工作方式0:13位定时/计数方式,因此,最多能计到2的13次方,也就是8192次。 工作方式1:16位定时/计数方式,因此,最多能计到2的16次方,也就是65536次。 工作方式2和工作方式3,都是8位的定时/计数方式,因此,最多能计到2的8次方,也说是256 次。 预置值计算:用最大计数量减去需要的计数次数即可。 51 单片机汇编语言教程-慧净电子会员收集整理 (全部 28课) 推荐使用慧净 51实验板。推荐 51学习网 WWW.HLMCU.COM 淘宝网:http://shop37031453.taobao.com/ 例:流水线上一个包装是12盒,要求每到12盒就产生一个动作,用单片机的工作方式0来控 制,应当预置多大的值呢?对了,就是8192-12=8180。 以上是计数,明白了这个道理,定时也是一样。这在前面的课程已提到,我们不再重复,请 参考前面的例程。 51实验板推荐(点击下面的图片可以进入下载资料链接) HJ-1G HJ-3G 51 单片机汇编语言教程-慧净电子会员收集整理 (全部 28课) 推荐使用慧净 51实验板。推荐 51学习网 WWW.HLMCU.COM 淘宝网:http://shop37031453.taobao.com/ 51单片机汇编语言教程:第18课-单片机中断系统 (基于HJ-1G、HJ-3G 实验板) 有关单片机中断系统的概念:什么是中断,我们从一个生活中的例程引入。你正在家中 看书,突然电话铃响了,你放下书本,去接电话,和来电话的人交谈,然后放下电话,回来 继续看你的书。这就是生活中的“中断”的现象,就是正常的工作过程被外部的事件打断了。 仔细研究一下生活中的中断,对于我们学习单片机的中断也很有好处。 第一、什么可以引起中断,生活中很多事件能引起中断:有人按了门铃了,电话铃响了,你 的闹钟闹响了,你烧的水开了….等等诸如此类的事件,我们把能引起中断的称之为中断源, 单片机中也有一些能引起中断的事件,8031中一共有5个:两个外部中断,两个计数/定时器 中断,一个串行口中断。 第二、中断的嵌套与优先级处理:设想一下,我们正在看书,电话铃响了,同时又有人按了 门铃,你该先做那样呢?如果你正是在等一个很重要的电话,你一般不会去理会门铃的,而 反之,你正在等一个重要的客人,则可能就不会去理会电话了。如果不是这两者(即不等电 话,也不是等人上门),你可能会按你常常的习惯去处理。总之这里存在一个优先级的问题, 单片机中也是如此,也有优先级的问题。优先级的问题不仅仅发生在两个中断同时产生的情 况,也发生在一个中断已产生,又有一个中断产生的情况,比如你正接电话,有人按门铃的 情况,或你正开门与人交谈,又有电话响了情况。考虑一下我们会怎么办吧。 第三、中断的响应过程:当有事件产生,进入中断之前我们必须先记住现在看书的第几页了, 或拿一个书签放在当前页的位置,然后去处理不一样的事情(因为处理完了,我们还要回来 继续看书):电话铃响我们要到放电话的地方去,门铃响我们要到门那边去,也说是不一样 的中断,我们要在不一样的地点处理,而这个地点常常还是固定的。计算机中也是采用的这 种办法,五个中断源,每个中断产生后都到一个固定的地方去找处理这个中断的程序,当然 在去之前首先要保存下面将执行的指令的地址,以便处理完中断后回到原来的地方继续往下 执行程序。具体地说,中断响应能分为以下几个步骤:1、保护断点,即保存下一将要执行 的指令的地址,就是把这个地址送入堆栈。2、寻找中断入口,根据5个不一样的中断源所产 生的中断,查找5个不一样的入口地址。以上工作是由计算机自动完成的,与编程者无关。 在这5个入口地址处存放有中断处理程序(这是程序编写时放在那儿的,如果没把中断程序 放在那儿,就错了,中断程序就不能被执行到)。3、执行中断处理程序。4、中断返回:执 行完中断指令后,就从中断处返回到主程序,继续执行。究竟单片机是怎么样找到中断程序 所在位置,又怎么返回的呢?我们稍后再谈。 51 单片机汇编语言教程-慧净电子会员收集整理 (全部 28课) 推荐使用慧净 51实验板。推荐 51学习网 WWW.HLMCU.COM 淘宝网:http://shop37031453.taobao.com/ MCS-51单片机中断系统的结构: 5个中断源的符号、名称及产生的条件如下。 INT0:外部中断0,由P3.2端口线引入,低电平或下跳沿引起。 INT1:外部中断1,由P3.3端口线引入,低电平或下跳沿引起。 T0:定时器/计数器0中断,由 T0计满回零引起。 T1:定时器/计数器 l中断,由 T1计满回零引起。 TI/RI:串行 I/O中断,串行端口完成一帧字符发送/接收后引起。 整个中断系统的结构框图见下图一所示。 51 单片机汇编语言教程-慧净电子会员收集整理 (全部 28课) 推荐使用慧净 51实验板。推荐 51学习网 WWW.HLMCU.COM 淘宝网:http://shop37031453.taobao.com/ <51单片机中断系统结构> 如图所示,由与中断有关的特殊功能寄存器、中断入口、次序查询逻辑电路等组成,包括5 个中断请求源,4个用于中断控制的寄存器 IE、IP、ECON和SCON 来控制中断类弄、中断的 开、关和各种中断源的优先级确定。 中断请求源: (1)外部中断请求源:即外中断0和1,经由外部管脚引入的,在单片机上有两个管脚,名 称为INT0、INT1,也就是 P3.2、P3.3这两个管脚。在内部的 TCON中有四位是与外中断有关 的。IT0:INT0触发方式控制位,可由软件进和置位和复位,IT0=0,INT0为低电平触发方式, IT0=1,INT0为负跳变触发方式。这两种方式的差异将在以后再谈。IE0:INT0中断请求标志 位。当有外部的中断请求时,这位就会置1(这由硬件来完成),在CPU响应中断后,由硬件 将IE0清0。IT1、IE1的用途和 IT0、IE0相同。(2)内部中断请求源 TF0:定时器 T0的溢出 中断标记,当T0计数产生溢出时,由硬件置位 TF0。当CPU响应中断后,再由硬件将 TF0清 0。TF1:与TF0类似。TI、RI:串行口发送、接收中断,在串行口中再讲解。2、中断允许 寄存器 IE在MCS-51中断系统中,中断的允许或禁止是由片内可进行位寻址的8位中断允许 寄存器 IE来控制的。见下表 EAX 其中EA是总开关,如果它等于0,则所有中断都不允许。ES-串行口中断允许 ET1-定时器 1中断允许 EX1-外中断1中断允许。ET0-定时器0中断允许 EX0-外中断0中断允许。如果我 们要设置允许外中断1,定时器1中断允许,其它不允许,则 IE能是EAX 即8CH,当然,我们也能用位操作指令 SETBEA SETB ET1SETB EX1 来实现它。3、五个中断源的自然优先级与中断服务入口地址外中断0:0003H 定时器0:000BH 外中断1:0013H 定时器1:001BH 串行口:0023H 它们的自然优先级由高到低排列。写到这 里,大家应当明白,为什么前面有一些程序一始我们这样写: ORG 0000HLJMP START ORG 0030H START:。 这样写的目的,就是为了让出中断源所占用的向量地址。当然,在程序中没用中断时,直接 从0000H 开始写程序,在原理上并没有错,但在实际工作中最好不这样做。优先级:单片机 采用了自然优先级和人工设置高、低优先级的策略,即能由程序员设定那些中断是高优先级、 51 单片机汇编语言教程-慧净电子会员收集整理 (全部 28课) 推荐使用慧净 51实验板。推荐 51学习网 WWW.HLMCU.COM 淘宝网:http://shop37031453.taobao.com/ 哪些中断是低优先级,由于只有两级,必有一些中断处于同一级别,处于同一级别的,就由 自然优先级确定。 开机时,每个中断都处于低优先级,我们能用指令对优先级进行设置。看表2中断优先级中 由中断优先级寄存器 IP来高置的,IP中某位设为1,对应的中断就是高优先级,不然就是 低优先级。 XX X PS PT1 PX1 PT0 PX0 例:设有如下要求,将T0、外中断1设为高优先级,其它为低优先级,求IP的值。IP的首3 位没用,可任意取值,设为000,后面根据要求写就能了 XX 因此,最终,IP的值就是06H。例:在上例中,如果5个中断请求同时发生,求中断响应的 次序。响应次序为:定时器0->外中断1->外中断0->实时器1->串行中断。 MCS-51的中断响应过程: 1、中断响应的条件:讲到这儿,我们依然对于计算机响应中断感到神奇,我们人能响应外 界的事件,是因为我们有多种“传感器“――眼、耳能接受不一样的信息,计算机是如何做 到这点的呢?其实说穿了,一点都不希奇,MCS51工作时,在每个机器周期中都会去查询一 下各个中断标记,看他们是否是“1“,如果是1,就说明有中断请求了,所以所谓中断,其 实也是查询,不过是每个周期都查一下而已。这要换成人来说,就相当于你在看书的时候, 每一秒钟都会抬起头来看一看,查问一下,是不是有人按门铃,是否有电话。。。。很蠢,不 是吗?可计算机本来就是这样,它根本没人聪明。了解了上述中断的过程,就不难解中断响 应的条件了。在下列三种情况之一时,CPU 将封锁对中断的响应: CPU正在处理一个同级或更高级别的中断请求。 现行的机器周期不是当前正执行指令的最后一个周期。我们知道,单片机有单周期、双周期、 三周期指令,当前执行指令是单字节没有关系,如果是双字节或四字节的,就要等整条指令 都执行完了,才能响应中断(因为中断查询是在每个机器周期都可能查到的)。 51 单片机汇编语言教程-慧净电子会员收集整理 (全部 28课) 推荐使用慧净 51实验板。推荐 51学习网 WWW.HLMCU.COM 淘宝网:http://shop37031453.taobao.com/ 当前正执行的指令是返回批令(RETI)或访问 IP、IE寄存器的指令,则 CPU至少再执行一 条指令才应中断。这些都是与中断有关的,如果正访问 IP、IE则可能会开、关中断或改变 中断的优先级,而中断返回指令则说明本次中断还没有处理完,所以都要等本指令处理结束, 再执行一条指令才能响应中断。 2、中断响应过程 CPU响应中断时,首先把当前指令的下一条指令(就是中断返回后将要执 行的指令)的地址送入堆栈,然后根据中断标记,将对应的中断入口地址送入 PC,PC是程 序指针,CPU取指令就根据 PC中的值,PC中是什么值,就会到什么地方去取指令,所以程 序就会转到中断入口处继续执行。这些工作都是由硬件来完成的,不必我们去考虑。这里还 有个问题,大家是否注意到,每个中断向量地址只间隔了8个单元,如0003-000B,在如此 少的空间中如何完成中断程序呢?很简单,你在中断处安排一个 LJMP 指令,不就能把中断 程序跳转到任何地方了吗?一个完整的主程序看起来应该是这样的: ORG 0000HLJMP START ORG 0003H LJMP INT0 ;转外中断0ORG 000BH RETI;没有用定时器0中断,在此放一条 RETI,万一 “不小心“产生了中断,也不会有太 大的后果。。 中断程序完成后,一定要执行一条 RETI指令,执行这条指令后,CPU将会把堆栈中保存着 的地址取出,送回PC,那么程序就会从主程序的中断处继续往下执行了。注意:CPU所做的 保护工作是很有限的,只保护了一个地址,而其它的所有东西都不保护,所以如果你在主程 序中用到了如 A、PSW等,在中断程序中又要用它们,还要保证回到主程序后这里面的数据 还是没执行中断以前的数据,就得自己保护起来。 中断系统的控制寄存器: 中断系统有两个控制寄存器 IE和IP,它们分别用来设定各个中断源的打开/关闭和中断优 先级。此外,在 TCON中另有4位用于选择引起外部中断的条件并作为标志位。 1.中断允许寄存器--IE IE在特殊功能寄存器中,字节地址为 A8H,位地址(由低位到高位)分别是 A8H-AFH。 IE用来打开或关断各中断源的中断请求,基本格式如下图二所示: 51 单片机汇编语言教程-慧净电子会员收集整理 (全部 28课) 推荐使用慧净 51实验板。推荐 51学习网 WWW.HLMCU.COM 淘宝网:http://shop37031453.taobao.com/ EA:全局中断允许位。EA=0,关闭全部中断;EA=1,打开全局中断控制,在此条件下,由 各个中断控制位确定相应中断的打开或关闭。 ×:无效位。 ES:串行 I/O中断允许位。ES=1,打开串行 I/O中断;ES=0,关闭串行 I/O中断。 ETl;定时器/计数器1中断允许位。ETl=1,打开 T1中断;ETl=O,关闭 T1中断。 EXl:外部中断 l中断允许位。EXl=1,打开 INT1;EXl=0,关闭 INT1。 ET0:定时器/计数器0中断允许位。ET0=1,打开 T0中断;ET0=0,关闭 TO中断。 EXO:外部中断0中断允许位。Ex0=1,打开 INT0;EX0=0,关闭INT0. 中断优先寄存器--IP: IP在特殊功能寄存器中,字节地址为 B8H,位地址(由低位到高位)分别是 B8H 一BFH,IP 用 来设定各个中断源属于两级中断中的哪一级,IP的基本格式如下图三所示: ×:无效位。 PS:串行 I/O中断优先级控制位。PS=1,高优先级;PS=0,低优先级。 PTl:定时器/计数器1中断优先级控制位。PTl=1,高优先级;PTl=0,低优先级。 Pxl:外部中断1中断优先级控制位。Pxl=1,高优先级;PXl=O,低优先级。 PT0:定时器/计数器 o中断优先级控制位。PT0=1,高优先级;PTO=0,低优先级。 51 单片机汇编语言教程-慧净电子会员收集整理 (全部 28课) 推荐使用慧净 51实验板。推荐 51学习网 WWW.HLMCU.COM 淘宝网:http://shop37031453.taobao.com/ Px0:外部中断0中断优先级控制位。Px0=1,高优先级;Px0=0,伤优先级。 在MCS-51单片机系列中,高级中断能够打断低级中断以形成中断嵌套;同级中断之间,或 低级对高级中断则不能形成中断嵌套。若几个同级中断同时向 CPU请求中断响应,则 CPU 按如下顺序确定响应的先后顺序: INT0一T0---INT1一T1一RI/T1. 中断的响应过程 若某个中断源通过编程设置,处于被打开的状态,并满足中断响应的条件,而且①当前正在 执行的那条指令已被执行完 1、当前末响应同级或高级中断 2、不是在操作 IE,IP中断控制寄存器或执行 REH指令则单片机响应此中断。 在正常的情况下,从中断请求信号有效开始,到中断得到响应,通常需要3个机器周期到8 个机器周期。中断得到响应后,自动清除中断请求标志(对串行 I/O端口的中断标志,要用 软件清除),将断点即程序计数器之值(PC)压入堆栈(以备恢复用);然后把相应的中断入口 地址装入 PC,使程序转入到相应的中断服务程序中去执行。 各个中断源在程序存储器中的中断入口地址如下: 中断源 入口地址 INT0(外部中断0) 0003H TF0(TO 中断) 000BH INT1(外部中断1) 0013H TFl(T1中断) 001BH RI/TI(串行口中断) 0023H 由于各个中断入口地址相隔甚近,不便于存放各个较长的中断服务程序,故通常在中断入口 地址开始的二三个单元中,安排一条转移类指令,以转入到安排在那儿的中断服务程序。以 T1中断为例,其过程下如图四所示。 由于5个中断源各有其中断请求标志0,TF0,IEl,TFl 以及RI/TI,在中断源满足中断请求 的条件下,各标志自动置1,以向 CPU请求中断。如果某一中断源提出中断请求后,CPU不 能立即响应,只要该中断请求标志不被软件人为清除,中断请求的状态就将一直保持,直到 CPU响应了中断为止,对串行口中断而言,这一过程与其它4个中断的不同之处在于;即使CPU 响应了中断,其中断标志 RI/TI也不会自动清零,必须在中断服务程序中设置清除 RI/TI 51 单片机汇编语言教程-慧净电子会员收集整理 (全部 28课) 推荐使用慧净 51实验板。推荐 51学习网 WWW.HLMCU.COM 淘宝网:http://shop37031453.taobao.com/ 的指令后,才会再一次地提出中断请求。 CPU的现场保护和恢复必须由被响应的相应中断服务程序去完成,当执行 RETI中断返回指 令后,断点值自动从栈顶2字节弹出,并装入 PC寄存器,使 CPU继续执行被打断了的程序。 下面给出一个应用定时器中断的实例。 现要求编制一段程序,使 P1.0端口线上输出周期为2ms 的方波脉冲。设单片机晶振频率 Fosc=6MHZ. 1、方法:利用定时器 T0作1ms 定时,达到定时值后引起中断,在中断服务程序中,使 P1. 0的状态取一次反,并再次定时1ms。 2、定时初值:机器周期 MC=12/fosc=2us。所以定时 lms 所需的机器周期个数为500D,亦 即0lF4H。设T0为工作方式1(16位方式),则定时初值是(01F4H)求补=FEOCH START:MOVTMOD,#01H ;T0为定时器状态,工作方式1 MOV TL0,#0CH ;T0的低位定时初值 MOV TH0,#0FEH ;T0的高位定时初值 MOVTCON,#10H ;打开 T0 SETB ET0 ;1ET0,即允许 T0中断 SETBEA;1EA,即充许全局中断 AJMP $ ;动态暂存 000BH:AJMP IST0 ;转入 T0中断服务程序入口地址 IST0 51 单片机汇编语言教程-慧净电子会员收集整理 (全部 28课) 推荐使用慧净 51实验板。推荐 51学习网 WWW.HLMCU.COM 淘宝网:http://shop37031453.taobao.com/ IST0:MOV TL0,#0CH ;重置定时器初值 MOV TH0,#0FEH ;重置定时器初值 CPL P1.0 ;P1.0取反 RET1 ;中断返回 串行端口的控制寄存器: 串行端口共有2个控制寄存器 SCON和PCON,用以设置串行端口的工作方式、接收/发送的 运行状态、接收/发送数据的特征、波特率的大小,以及作为运行的中断标志等。 ①串行口控制寄存器 SCON SCON的字节地址是98H,位地址(由低位到高位)分别是98H 一9FH。SCON的格式如图五所示。 SMo,SMl: 串行口工作方式控制位。 00--方式0;01--方式1; 10--方式2;11--方式3。 SM2: 仅用于方式2和方式3的多机通讯控制位 发送机 SM2=1(要求程控设置)。 当为方式2或方式3时: 接收机 SM2=1时,若 RB8=1,可引起串行接收中断;若 RB8=0,不 引起串行接收中断。SM2=0时,若 RB8=1,可引起串行接收中断;若 RB8=0,亦可引起串行接收中断。 REN: 51 单片机汇编语言教程-慧净电子会员收集整理 (全部 28课) 推荐使用慧净 51实验板。推荐 51学习网 WWW.HLMCU.COM 淘宝网:http://shop37031453.taobao.com/ 串行接收允许位。 0--禁止接收;1--允许接收。 TB8: 在方式2,3中,TB8是发送机要发送的第9位数据。 RB8: 在方式2,3中,RB8是接收机接收到的第9位数据,该数据正好来自发 送机的 TB8。 TI: 发送中断标志位。发送前必须用软件清零,发送过程中 TI保持零电平, 发送完一帧数据后,由硬件自动置1。如要再发送,必须用软件再清零。 RI: 接收中断标志位。接收前,必须用软件清零,接收过程中 RI保持零电 平,接收完一帧数据后,由片内硬件自动置1。如要再接收,必须用软件 再清零。 电源控制寄存器 PCON PCON的字节地址为87H,无位地址,PCON的格式如图六所示。需指出的是,对80C31单片机 而言,PCON还有几位有效控制位。 SMOD:波特率加倍位。在计算串行方式1,2,3的波特率时;0---不加倍;1---加倍。 串行中断的应用特点: 8031单片机的串行 I/O端口是一个中断源,有两个中断标志 RI和TI,RI用于接收,TI用 于发送。 串行端口无论在何种工作方式下,发送/接收前都必须对 TI/RI清零。当一帧数据发送/ 接收完后,TI/RI 自动置1,如要再发送/接收,必须先用软件将其清除。 在串行中断被打开的条件下,对方式0和方式1来说,一帧数据发送/接收完后,除置位 TI /RI外,还会引起串行中断请求,并执行串行中侧目务程序。但对方式2和方式3的接收机 51 单片机汇编语言教程-慧净电子会员收集整理 (全部 28课) 推荐使用慧净 51实验板。推荐 51学习网 WWW.HLMCU.COM 淘宝网:http://shop37031453.taobao.com/ 而言,还要视 SM2和RB8的状态,才可确定 RI是否被置位以及串行中断的开放: SM2 RB8 接收机中断标志与中断状态 0 1 激活RI,引起中断 1 0 不激活 RI,不引起中断 1 1 激活RI,引起中断 单片机正是利用方式2,3的这一特点,实现多机间的通信。串行端口的常用应用方法见相关 章节。 波特率的确定: 对方式0来说,波特率已固定成 fosc/12,随着外部晶振的频率不同,波特率亦不相同。常 用的fosc 有12MHz 和6MHz,所以波特率相应为1000×103和500×103位/s。在此方式下, 数据将自动地按固定的波特率发送/接收,完全不用设置。 对方式2而言,波特率的计算式为2SMOD·fosc/64。当SMOD=0时,波特率为 fm/64;当 SMOD=1时,波特率为 fosc/32。在此方式下,程控设置 SMOD 位的状态后,波特率就确定 了,不需要再作其它设置。 对方式1和方式3来说,波特率的计算式为2SMOD/32×T1溢出率,根据 SMOD状态位的不同, 波特率有 Tl/32溢出率和 T1/16溢出率两种。由于T1溢出率的设置是方便的,因而波特率 的选择将十分灵活。 前已叙及,定时器 Tl有4种工作方式,为了得到其溢出率,而又不必进入中断服务程序,往 往使T1设置在工作方式2的运行状态,也就是8位自动加入时间常数的方式。由于在这种方 式下,T1的溢出率(次/秒)计算式可表达成: 下面一段主程序和中断服务程序,是利用串行方式 l从数据00H 开始连续不断增大地串行发 51 单片机汇编语言教程-慧净电子会员收集整理 (全部 28课) 推荐使用慧净 51实验板。推荐 51学习网 WWW.HLMCU.COM 淘宝网:http://shop37031453.taobao.com/ 送一片数据的程序例。设单片机晶振的频率为6MHZ,波特率为1200位/秒。 ORG 2000H ;1200位/秒的定时器初值 MOV TL1,#0F3H MOV TH1,#0F3H ;使SMOD=0 MOV PCON,#00H ;T1方式2 MOV TMOD,#20H SETBEA CLR ET1 ;关闭 T1中断 SETBES;开串行中断 SETB TR1 ;开T1定时 MOV SCON,#40H ;串行方式1 CLRA MOVSBUF,A;串行发送 JNB T1,$ ;等待发送完 CLR T1, ;清标志 SJMP $ ORG 0023H ;串行中断入口地址 MOVSBUF,A;连续发送 JNB T1,$ INCA CLR T1 RET1 ;中断返回 51 单片机汇编语言教程-慧净电子会员收集整理 (全部 28课) 推荐使用慧净 51实验板。推荐 51学习网 WWW.HLMCU.COM 淘宝网:http://shop37031453.taobao.com/ 51实验板推荐(点击下面的图片可以进入下载资料链接) HJ-1G HJ-3G 51 单片机汇编语言教程-慧净电子会员收集整理 (全部 28课) 推荐使用慧净 51实验板。推荐 51学习网 WWW.HLMCU.COM 淘宝网:http://shop37031453.taobao.com/ 51单片机汇编语言教程:第19课-单片机定时器、中断实验 (基于HJ-1G、HJ-3G 实验板) 我们在学单片机时我们第一个例程就是灯的闪烁,那是用延时程序做的,现在回想起来, 这样做不很恰当,为什么呢?我们的主程序做了灯的闪烁,就不能再干其它的事了,难道单 片机只能这样工作吗?当然不是,我们能用定时器来实现灯的闪烁的功能。 例1:查询方式 ORG 0000H AJMPSTART ORG 30H START: MOV P1,#0FFH ;关所 灯 MOV TMOD,#00000001B ;定时/计数器0工作于方式1 MOV TH0,#15H MOV TL0,#0A0H ;即数5536 SETB TR0 ;定时/计数器0开始运行 LOOP:JBC TF0,NEXT ;如果TF0等于1,则清 TF0并转NEXT处 AJMPLOOP;不然跳转到 LOOP处运行 NEXT:CPL P1.0 MOV TH0,#15H MOV TL0,#9FH;重置定时/计数器的初值 AJMPLOOP ENDAJMPLOOP END 键入程序,看到了什么?灯在闪烁了,这可是用定时器做的,不再是主程序的循环了。 简单地分析一下程序,为什么用 JBC呢?TF0是定时/计数器0的溢出标记位,当定时器产生 溢出后,该位由0变1,所以查询该位就可知宇时时间是否已到。该位为1后,要用软件将标 记位清0,以便下一次定时是间到时该位由0变1,所以用了 JBC指令,该指位在判1转移的同 时,还将该位清0。 以上程序是能实现灯的闪烁了,可是主程序除了让灯闪烁外,还是不能做其他的事啊! 不,不对,我们能在 LOOP:……和AJMPLOOP指令之间插入一些指令来做其他的事情,只 51 单片机汇编语言教程-慧净电子会员收集整理 (全部 28课) 推荐使用慧净 51实验板。推荐 51学习网 WWW.HLMCU.COM 淘宝网:http://shop37031453.taobao.com/ 要保证执行这些指令的时间少于定时时间就行了。那我们在用软件延时程序的时候不是也能 用一些指令来替代 DJNZ 吗?是的,但是那就要求你精确计算所用指令的时间,然后再减去 对应的 DJNZ循环次数,很不方便,而现在只要求所用指令的时间少于定时时间就行,显然 要求低了。当然,这样的办法还是不好,所以我们常用以下的办法来实现。 程序2:用中断实现 ORG 0000H ,http://www.51hei.com AJMPSTART ORG 000BH ;定时器0的中断向量地址 AJMP TIME0 ;跳转到真正的定时器程序处 ORG 30H START: MOV P1,#0FFH ;关所 灯 MOV TMOD,#00000001B ;定时/计数器0工作于方式1 MOV TH0,#15H MOV TL0,#0A0H ;即数5536 SETBEA;开总中断允许 SETB ET0 ;开定时/计数器0允许 SETB TR0 ;定时/计数器0开始运行 LOOP:AJMPLOOP;真正工作时,这里可写任意程序 TIME0: ;定时器0的中断处理程序 PUSHACC PUSHPSW;将PSW和ACC推入堆栈保护 CPL P1.0 MOV TH0,#15H MOV TL0,#0A0H ;重置定时常数 POPPSW POPACC RETI END 上面的例程中,定时时间一到,TF0由0变1,就会引发中断,CPU将自动转至000B 处寻 51 单片机汇编语言教程-慧净电子会员收集整理 (全部 28课) 推荐使用慧净 51实验板。推荐 51学习网 WWW.HLMCU.COM 淘宝网:http://shop37031453.taobao.com/ 找程序并执行,由于留给定时器中断的空间只有8个字节,显然不足以写下所有有中断处理 程序,所以在000B 处安排一条跳转指令,转到实际处理中断的程序处,这样,中断程序能 写在任意地方,也能写任意长度了。进入定时中断后,首先要保存当前的一些状态,程序中 只演示了保存存 ACC和PSW,实际工作中应该根据需要将可能会改变的单元的值都推入堆栈 进行保护(本程序中实际不需保存护任何值,这里只作个演示)。 上面的两个单片机程序运行后,我们发现灯的闪烁非常快,根本分辨不出来,只是视觉 上感到灯有些晃动而已,为什么呢?我们能计算一下,定时器中预置的数是5536,所以每计 60000个脉冲就是定时时间到,这60000个脉冲的时间是多少呢?我们的晶体震荡器是12M, 所以就是60000微秒,即60毫秒,因此速度是非常快的。如果我想实现一个1S的定时,该怎 么办呢?在该晶体震荡器濒率下,最长的定时也就是65。536个毫秒啊!上面给出一个例程。 ORG 0000H AJMPSTART ORG 000BH ;定时器0的中断向量地址 AJMP TIME0 ;跳转到真正的定时器程序处 ORG 30H START: MOV P1,#0FFH ;关所 灯 MOV 30H,#00H ;软件计数器预清0 MOV TMOD,#00000001B ;定时/计数器0工作于方式1 MOV TH0,#3CH MOV TL0,#0B0H ;即数15536 SETBEA;开总中断允许 SETB ET0 ;开定时/计数器0允许 SETB TR0 ;定时/计数器0开始运行 LOOP:AJMPLOOP;真正工作时,这里可写任意程序 TIME0: ;定时器0的中断处理程序 PUSHACC PUSHPSW;将PSW和ACC推入堆栈保护 INC 30H MOV A,30H 51 单片机汇编语言教程-慧净电子会员收集整理 (全部 28课) 推荐使用慧净 51实验板。推荐 51学习网 WWW.HLMCU.COM 淘宝网:http://shop37031453.taobao.com/ CJNE A,#20,T_RET ;30H 单元中的值到了20了吗? T_L1: CPL P1.0 ;到了,取反P10 MOV 30H,#0 ;清软件计数器 T_RET: MOV TH0,#15H MOV TL0,#9FH ;重置定时常数 POPPSW POPACC RETI END 先自己分析一下,看看是怎么实现的?这里采用了软件计数器的概念,思路是这样的,先 用定时/计数器0做一个50毫秒的定时器,定时是间到了以后并不是立即取反 P10,而是将软 件计数器中的值加1,如果软件计数器计到了20,就取反 P10,并清掉软件计数器中的值, 不然直接返回,这样,就变成了20次定时中断才取反一次 P10,因此定时时间就延长了成了 20*50即1000毫秒了。 这个思路在工程中是非常有用的,有的时候我们需要若干个定时器,可51中总共才有2 个,怎么办呢?其实,只要这几个定时的时间有一定的公约数,我们就能用软件定时器加以 实现,如我要实现 P10口所接灯按1S每次,而P11口所接灯按2S每次闪烁,怎么实现呢?对 了我们用两个计数器,一个在它计到20时,取反P10,并清零,就如上面所示,另一个计到 40取反P11,然后清0,不就行了吗?这部份的程序如下 ORG 0000H AJMPSTART ORG 000BH ;定时器0的中断向量地址 AJMP TIME0 ;跳转到真正的定时器程序处 ORG 30H START: MOV P1,#0FFH ;关所 灯 MOV 30H,#00H ;软件计数器预清0 MOV TMOD,#00000001B ;定时/计数器0工作于方式1 MOV TH0,#3CH 51 单片机汇编语言教程-慧净电子会员收集整理 (全部 28课) 推荐使用慧净 51实验板。推荐 51学习网 WWW.HLMCU.COM 淘宝网:http://shop37031453.taobao.com/ MOV TL0,#0B0H ;即数15536 SETBEA;开总中断允许 SETB ET0 ;开定时/计数器0允许 SETB TR0 ;定时/计数器0开始运行 LOOP:AJMPLOOP;真正工作时,这里可写任意程序 TIME0: ;定时器0的中断处理程序 PUSHACC PUSHPSW;将PSW和ACC推入堆栈保护 INC 30H INC 31H ;两个计数器都加1 MOV A,30H CJNE A,#20,T_NEXT ;30H 单元中的值到了20了吗? T_L1: CPL P1.0 ;到了,取反P10 MOV 30H,#0 ;清软件计数器 T_NEXT: MOV A,31H CJNE A,#40,T_RET ;31h 单元中的值到40了吗? T_L2: CPL P1.1 MOV 31H,#0 ;到了,取反P11,清计数器,返回 T_RET: MOV TH0,#15H MOV TL0,#9FH ;重置定时常数 POPPSW POPACC RETI END 您能用定时器的办法实现前面讲的流水灯吗?试试看。 51 单片机汇编语言教程-慧净电子会员收集整理 (全部 28课) 推荐使用慧净 51实验板。推荐 51学习网 WWW.HLMCU.COM 淘宝网:http://shop37031453.taobao.com/ 51实验板推荐(点击下面的图片可以进入下载资料链接) HJ-1G HJ-3G 51 单片机汇编语言教程-慧净电子会员收集整理 (全部 28课) 推荐使用慧净 51实验板。推荐 51学习网 WWW.HLMCU.COM 淘宝网:http://shop37031453.taobao.com/ 51单片机汇编语言教程:第20课-单片机定时、计数器实验 (基于HJ-1G、HJ-3G 实验板) 前面我们做了定时器的实验,现在来看一看计数实验,在工作中计数常常会有两种要求: 第一、将计数的值显示出来,第二、计数值到一定程度即中断报警。第一种如各种计数器、 里程表,第二种如前面例中讲到的生产线上的计数。先看第一种吧。我们的硬件中是这样连 线的:324组成的振荡器连到定时/计数器1的外部管脚 T1上面,我们就利用这个来做一个计 数实验,要将计数的值显示出来,当然最好用数码管了,可我们还没讲到这一部份,为了避 免把问题复杂化,我们用 P1口的8个LED来显示计到的数据。 程序如下: ORG 0000H ,http://www.51hei.com AJMPSTART ORG 30H START: MOV SP,#5FH MOV TMOD,#01000000B ;定时/计数器1作计数用,0不用全置0 SETB TR1 ;启动计数器1开始运行. LOOP:MOV A,TL0 MOV P1,A AJMPLOOP END 在硬件上用线将324的输出与 T1连通(印板上有焊盘)运行这种程序,注意将板按正确的位置 放置(LM324放在左手边,LED排列是按从高位到低们排列)看到什么?随着324后接的 LED 的闪烁,单片机的8只LED也在持续变化,注意观察,是不是按二进制: 00000000 00000001 00000010 00000011 这样的次序在变呢?这就对了,这就是 TL0中的数据。 程序二: ORG 0000H 51 单片机汇编语言教程-慧净电子会员收集整理 (全部 28课) 推荐使用慧净 51实验板。推荐 51学习网 WWW.HLMCU.COM 淘宝网:http://shop37031453.taobao.com/ AJMPSTART ORG 001BH AJMP TIMER1 ;定时器1的中断处理 ORG 30H START:MOV SP,#5FH MOV TMOD,#01010000B ;定时/计数器1作计数用,模式1,0不用全置0 MOV TH1,#0FFH MOV TL1,#0FAH ;预置值,要求每计到6个脉冲即为一个事件 SETBEA SETB ET1 ;开总中断和定时器1中断允许 SETB TR1 ;启动计数器1开始运行. AJMP $ TIMER1: PUSHACC PUSHPSW CPL P1.0 ;计数值到,即取反 P1.0 MOV TH1,#0FFH MOV TL1,#0FAH ;重置计数初值 POPPSW POPACC RETI END 上面这个单片机程序完成的工作很简单,就是在每6个脉冲到来后取反一次 P1。0,因此实 验的结果应当是:LM324后接的 LED亮、灭6次,则P1。0口所接 LED亮或灭一次。这实际就 是我们上面讲的计数器的第二种应用。 程序三:外部中断实验 ORG 0000H AJMPSTART ORG 0003H ;外部中断地直入口 AJMP INT0 51 单片机汇编语言教程-慧净电子会员收集整理 (全部 28课) 推荐使用慧净 51实验板。推荐 51学习网 WWW.HLMCU.COM 淘宝网:http://shop37031453.taobao.com/ ORG 30H START:MOV SP,#5FH MOV P1,#0FFH ;灯全灭 MOV P3,#0FFH ;P3口置高电平 SETBEA SETB EX0 AJMP $ INT0: PUSHACC PUSHPSW CPL P1.0 POPPSW POPACC RETI END 本程序的功能很简单,按一次按钮1(接在12管脚上的)就引发一次中断0,取反一次 P1。0, 因此理论上按一下灯亮,按一下灯灭,但在实际做实验时,可能会发觉有时不“灵”,按了 它没反应,但在大部份时候是对的,这是怎么回事呢?我们在讲解键盘时再作解释,这个程 序本身是没有问题的。 51实验板推荐(点击下面的图片可以进入下载资料链接) HJ-1G HJ-3G 51 单片机汇编语言教程-慧净电子会员收集整理 (全部 28课) 推荐使用慧净 51实验板。推荐 51学习网 WWW.HLMCU.COM 淘宝网:http://shop37031453.taobao.com/ 51单片机汇编语言教程:第21课-单片机串行口介绍 (基于HJ-1G、HJ-3G 实验板) 介绍:串行口是单片机与外界进行信息交换的工具。 8051单片机的通信方式有两种: 并行通信:数据的各位同时发送或接收。 串行通信:数据一位一位次序发送或接收。参看下 图: 串行通信的方式: 异步通信:它用一个起始位表示字符的开始,用停止位表示字符的结束。其每帧的格式如下: 在一帧格式中,先是一个起始位0,然后是8个数据位,规定低位在前,高位在后,接下来是 奇偶校验位(能省略),最后是停止位1。用这种格式表示字符,则字符能一个接一个地传送。 在异步通信中,CPU与外设之间必须有两项规定,即字符格式和波特率。字符格式的规定是 双方能够在对同一种0和1的串理解成同一种意义。原则上字符格式能由通信的双方自由制 定,但从通用、方便的角度出发,一般还是使用一些标准为好,如采用 ASCII 标准。 波特率即数据传送的速率,其定义是每秒钟传送的二进制数的位数。例如,数据传送的速率 是120字符/s,而每个字符如上述规定包含10数位,则传送波特率为1200波特。 同步通信:在同步通信中,每个字符要用起始位和停止位作为字符开始和结束的标志,占用 了时间;所以在数据块传递时,为了提高速度,常去掉这些标志,采用同步传送。由于数据 块传递开始要用同步字符来指示,同时要求由时钟来实现发送端与接收端之间的同步,故硬 件较复杂。 51 单片机汇编语言教程-慧净电子会员收集整理 (全部 28课) 推荐使用慧净 51实验板。推荐 51学习网 WWW.HLMCU.COM 淘宝网:http://shop37031453.taobao.com/ 通信方向:在串行通信中,把通信接口只能发送或接收的单向传送办法叫单工传送;而把数 据在甲乙两机之间的双向传递,称之为双工传送。在双工传送方式中又分为半双工传送和全 双工传送。半双工传送是两机之间不能同时进行发送和接收,任一时该,只能发或者只能收 信息。 2.8051单片机的串行接口结构 8051单片机串行接口是一个可编程的全双工串行通信接口。它可用作异步通信方式(UART), 与串行传送信息的外部设备相连接,或用于通过标准异步通信协议进行全双工的8051多机系 统也能通过同步方式,使用 TTL或CMOS移位寄存器来扩充 I/O口。 8051单片机通过管脚 RXD(P3.0,串行数据接收端)和管脚 TXD(P3.1,串行数据发送端) 与外界通信。SBUF是串行口缓冲寄存器,包括发送寄存器和接收寄存器。它们有相同名字 和地址空间,但不会出现冲突,因为它们两个一个只能被 CPU读出数据,一个只能被 CPU 写入数据。 串行口的控制与状态寄存器 串行口控制寄存器 SCON 它用于定义串行口的工作方式及实施接收和发送控制。字节地址为98H,其各位定义如下表: D7 D6 D5 D4 D3 D2 D1 D0 SM0 SM1 SM2 REN TB8 RB8 TIRI SM0、SM1:串行口工作方式选择位,其定义如下: SM0、SM1 工作方式 功能描述 波特率 0 0 方式0 8位移位寄存器 Fosc/12 0 1 方式1 10位UART 可变 1 0 方式2 11位UART Fosc/64或fosc/32 1 1 方式3 11位UART 可变 其中fosc 为晶体震荡器频率 51 单片机汇编语言教程-慧净电子会员收集整理 (全部 28课) 推荐使用慧净 51实验板。推荐 51学习网 WWW.HLMCU.COM 淘宝网:http://shop37031453.taobao.com/ SM2:多机通信控制位。在方式0时,SM2一定要等于0。在方式1中,当(SM2)=1则只有接收 到有效停止位时,RI才置1。在方式2或方式3当(SM2)=1且接收到的第九位数据 RB8=0时, RI才置1。 REN:接收允许控制位。由软件置位以允许接收,又由软件清0来禁止接收。 TB8: 是要发送数据的第9位。在方式2或方式3中,要发送的第9位数据,根据需要由软件置1 或清0。例如,可约定作为奇偶校验位,或在多机通信中作为区别地址帧或数据帧的标志位。 RB8:接收到的数据的第9位。在方式0中不使用 RB8。在方式1中,若(SM2)=0,RB8为接收 到的停止位。在方式2或方式3中,RB8为接收到的第9位数据。 TI:发送中断标志。在方式0中,第8位发送结束时,由硬件置位。在其它方式的发送停止位 前,由硬件置位。TI置位既表示一帧信息发送结束,同时也是申请中断,可根据需要,用 软件查询的办法获得数据已发送完毕的信息,或用中断的方式来发送下一个数据。TI必须 用软件清0。 RI:接收中断标志位。在方式0,当接收完第8位数据后,由硬件置位。在其它方式中,在接 收到停止位的中间时刻由硬件置位(例外情况见于 SM2的说明)。RI置位表示一帧数据接收 完毕,可用查询的办法获知或者用中断的办法获知。RI也必须用软件清0。 特殊功能寄存器 PCON PCON是为了在 CHMOS 的80C51单片机上实现电源控制而附加的。其中最高位是 SMOD。 串行口的工作方式 8051单片机的全双工串行口可编程为4种工作方式,现分述如下: 方式0为移位寄存器输入/输出方式。可外接移位寄存器以扩展 I/O口,也能外接同步输入/ 输出设备。8位串行数据者是从 RXD输入或输出,TXD用来输出同步脉冲。 输出 串行数据从 RXD管脚输出,TXD管脚输出移位脉冲。CPU将数据写入发送寄存器时,立 即启动发送,将8位数据以 fos/12的固定波特率从 RXD输出,低位在前,高位在后。发送完 一帧数据后,发送中断标志 TI由硬件置位。 输入 当串行口以方式0接收时,先置位允许接收控制位 REN。此时,RXD为串行数据输入端, TXD仍为同步脉冲移位输出端。当(RI)=0和(REN)=1同时满足时,开始接收。当接收到 第8位数据时,将数据移入接收寄存器,并由硬件置位 RI。 下面两图分别是方式0扩展输出和输入的接线图。 51 单片机汇编语言教程-慧净电子会员收集整理 (全部 28课) 推荐使用慧净 51实验板。推荐 51学习网 WWW.HLMCU.COM 淘宝网:http://shop37031453.taobao.com/ <单片机串行口接线图> 方式1为波特率可变的10位异步通信接口方式。发送或接收一帧信息,包括1个起始位0,8 个数据位和1个停止位1。 输出 当CPU执行一条指令将数据写入发送缓冲 SBUF时,就启动发送。串行数据从 TXD管脚 输出,发送完一帧数据后,就由硬件置位 TI。 输入 在(REN)=1时,串行口采样 RXD管脚,当采样到1至0的跳变时,确认是开始位0,就 开始接收一帧数据。只有当(RI)=0且停止位为1或者(SM2)=0时,停止位才进入 RB8,8 位数据才能进入接收寄存器,并由硬件置位中断标志 RI;不然信息丢失。所以在方式1接收 时,应先用软件清零 RI和SM2标志。 方式2 方式月为固定波特率的11位UART 方式。它比方式1增加了一位可程控为1或0的第9位数据。 输出: 发送的串行数据由 TXD端输出一帧信息为11位,附加的第9位来自 SCON寄存器的 TB8 位,用软件置位或复位。它可作为多机通信中地址/数据信息的标志位,也能作为数据的奇 偶校验位。当CPU执行一条数据写入 SUBF 的指令时,就启动发送器发送。发送一帧信息后, 置位中断标志 TI。 输入: 在(REN)=1时,串行口采样 RXD管脚,当采样到1至0的跳变时,确认是开始位0,就 开始接收一帧数据。在接收到附加的第9位数据后,当(RI)=0或者(SM2)=0时,第9位数 据才进入 RB8,8位数据才能进入接收寄存器,并由硬件置位中断标志 RI;不然信息丢失。 且不置位 RI。再过一位时间后,不管上述条件时否满足,接收电路即行复位,并重新检测 RXD上从1到0的跳变。 工作方式3 方式3为波特率可变的11位UART方式。除波特率外,其余与方式2相同。 51 单片机汇编语言教程-慧净电子会员收集整理 (全部 28课) 推荐使用慧净 51实验板。推荐 51学习网 WWW.HLMCU.COM 淘宝网:http://shop37031453.taobao.com/ 波特率选择 如前所述,在串行通信中,收发双方的数据传送率(波特率)要有一定的约定。在8051串行 口的四种工作方式中,方式0和2的波特率是固定的,而方式1和3的波特率是可变的,由定时 器T1的溢出率控制。 方式0 方式0的波特率固定为主振频率的1/12。 方式2 方式2的波特率由 PCON中的选择位 SMOD来决定,可由下式表示: 波特率=2的SMOD次方除以64再乘一个 fosc,也就是当 SMOD=1时,波特率为1/32fosc,当 SMOD=0时,波特率为1/64fosc 3.方式1和方式3 定时器 T1作为波特率发生器,其公式如下: 波特率= 定时器 T1溢出率 T1溢出率= T1计数率/产生溢出所需的周期数 式中T1计数率取决于它工作在定时器状态还是计数器状态。当工作于定时器状态时,T1计 数率为 fosc/12;当工作于计数器状态时,T1计数率为外部输入频率,此频率应小于 fosc/24。 产生溢出所需周期与定时器 T1的工作方式、T1的预置值有关。 定时器 T1工作于方式0:溢出所需周期数=8192-x 定时器 T1工作于方式1:溢出所需周期数=65536-x 定时器 T1工作于方式2:溢出所需周期数=256-x 因为方式2为自动重装入初值的8位定时器/计数器模式,所以用它来做波特率发生器最恰当。 当时钟频率选用11.0592MHZ 时,取易获得标准的波特率,所以很多单片机系统选用这个看 起来“怪”的晶体震荡器就是这个道理。 下表列出了定时器 T1工作于方式2常用波特率及初值。 常用波特率 Fosc(MHZ) SMOD TH1初值 19200 11.0592 1 FDH 9600 11.0592 0 FDH 4800 11.0592 0 FAH 51 单片机汇编语言教程-慧净电子会员收集整理 (全部 28课) 推荐使用慧净 51实验板。推荐 51学习网 WWW.HLMCU.COM 淘宝网:http://shop37031453.taobao.com/ 2400 11.0592 0 F4h 1200 11.0592 0 E8h 51实验板推荐(点击下面的图片可以进入下载资料链接) HJ-1G HJ-3G 51 单片机汇编语言教程-慧净电子会员收集整理 (全部 28课) 推荐使用慧净 51实验板。推荐 51学习网 WWW.HLMCU.COM 淘宝网:http://shop37031453.taobao.com/ 51515151单片机汇编语言教程:第22222222课----单片机串行口通信程序设计 (基于HJ-1G、HJ-3G 实验板) 1.串行口方式0应用编程 8051单片机串行口方式0为移位寄存器方式,外接一个串入并出的 移位寄存器,就能扩展一个并行口。 2. <单片机串行口通信程序设计硬件连接图> 例:用8051单片机串行口外接 CD4094扩展8位并行输出口,如图所示,8位并行口的各 位都接一个发光二极管,要求发光管呈流水灯状态。 串行口方式0的数据传送可采用中断方 式,也可采用查询方式,无论哪种方式,都要借助于 TI 或RI 标志。串行发送时,能靠 TI 置位(发完一帧数据后)引起中断申请,在中断服务程序中发送下一帧数据,或者通过查询 TI 的状态,只要 TI 为0就继续查询,TI 为1就结束查询,发送下一帧数据。在串行接收时, 则由RI 引起中断或对 RI 查询来确定何时接收下一帧数据。无论采用什么方式,在开始通信 之前,都要先对控制寄存器 SCON 进行初始化。在方式0中将,将00H 送SCON 就能了。 -----------------单片机串行口通信程序设计列子-------------------------- ORG 2000H START:MOV SCON,#00H ;置串行口工作方式0 MOV A,#80H ;最高位灯先亮 CLR P1.0 ;关闭并行输出(避象传输过程中,各 LED 的"暗红"现象) OUT0: MOVSBUF,A;开始串行输出 OUT1: JNB TI,OUT1 ;输出完否 CLRTI;完了,清 TI 标志,以备下次发送 SETB P1.0 ;打开并行口输出 ACALLDELAY;延时一段时间 RRA;循环右移 CLR P1.0 ;关闭并行输出 JMP OUT0 ;循环 说明:DELAY 延时子程序能用前面我们讲 P1口流水灯时用的延时子程序,这里就不给出了。 二、串行口异步通信 org 0000H AJMPSTART ORG 30H START: mov SP,#5fh ; mov TMOD,#20h ;T1: 工作模式2 mov PCON,#80h ;SMOD=1 mov TH1,#0FDH ;初始化波特率(参见表) 51 单片机汇编语言教程-慧净电子会员收集整理 (全部 28课) 推荐使用慧净 51实验板。推荐 51学习网 WWW.HLMCU.COM 淘宝网:http://shop37031453.taobao.com/ mov SCON,#50h ;Standard UART settings MOV R0,#0AAH ;准备送出的数 SETBREN;允许接收 SETB TR1 ;T1开始工作 WAIT: MOV A,R0 CPLA MOV R0,A MOVSBUF,A LCALLDELAY JBC TI,WAIT1 ;如果TI 等于1,则清 TI 并转WAIT1 AJMPWAIT WAIT1: JBCRI,READ;如果RI 等于1,则清 RI 并转READ AJMP WAIT1 READ: MOVA,SBUF;将取得的数送 P1口 MOV P1,A LJMPWAIT DELAY:;延时子程序 MOV R7,#0ffH DJNZ R7,$ RET END 将程序编译通过,写入芯片,插入实验板,用通读电缆将实验板与主机的串行口相连就 能实验了。上面的程序功能很简单,就是每隔一段时间向主机轮流送数55H 和AAH,并把 主机送去的数送到 P1口。能在PC 端用串行口精灵来做实验。串行口精灵在我主页上有下载。 运行串行口精灵后,按主界面上的“设置参数”按钮进入“设置参数”对话框,按下面的参数进 行设置。注意,我的机器上用的是串行口2,如果你不是串行口2,请自行更改串行口的设置。 设置完后,按确定返回主界面,注意右边有一个下拉列表,应当选中“按16进制”。然后按“开 始发送”、“开始接收”就能了。按此设置,实验板上应当有两只灯亮,6只灯灭。大家能自行 51 单片机汇编语言教程-慧净电子会员收集整理 (全部 28课) 推荐使用慧净 51实验板。推荐 51学习网 WWW.HLMCU.COM 淘宝网:http://shop37031453.taobao.com/ 更改设置参数中的发送字符如55,00,FF 等等,观察灯的亮灭,并分析原因,也能在主界 面上更改下拉列表中的“按16进制”为“按10进制”或“按ASCII字符”来观察现象,并仔细分析。 这对于大家理解16进制、10进制、ASCII 字符也是很有好处的。程序本身很简单,又有注释, 这里就不详加说明了。 三、上述程序的中断版本 org 0000H AJMPSTART org 0023h AJMPSERIAL; ORG 30H START: mov SP,#5fh ; mov TMOD,#20h ;T1: 工作模式2 mov PCON,#80h ;SMOD=1 mov TH1,#0FDH ;初始化波特率(参见表) mov SCON,#50h ;Standard UART settings MOV R0,#0AAH ;准备送出的数 SETBREN;允许接收 SETB TR1 ;T1开始工作 SETBEA;开总中断 SETBES;开串行口中断 SJMP $ SERIAL: MOVA,SBUF MOV P1,A CLRRI RETI END 本程序没有写入发送程序,大家能自行添加。 51实验板推荐(点击下面的图片可以进入下载资料链接) HJ-1G HJ-3G 51 单片机汇编语言教程-慧净电子会员收集整理 (全部 28课) 推荐使用慧净 51实验板。推荐 51学习网 WWW.HLMCU.COM 淘宝网:http://shop37031453.taobao.com/ 51单片机汇编语言教程:第23课-LED数码管静态显示接口与编程 (基于HJ-1G、HJ-3G 实验板) 在单片机系统中,常常用 LED数码数码管显示器来显示各种数字或符号。由于它具有显 示清晰、亮度高、使用电压低、寿命长的特点,因此使用非常广泛。 引言:还记得我们小时候玩的“火柴棒游戏”吗,几根火柴棒组合起来,能拼成各种各样的 图形,LED数码管显示器实际上也是这么一个东西。 八段LED数码管显示器 <单片机静态显示接口> 八段LED数码管显示器由8个发光二极管组成。基中7个长条形的发光管排列成“日”字 形,另一个贺点形的发光管在数码管显示器的右下角作为显示小数点用,它能显示各种数字 及部份英文字母。LED数码管显示器有两种不一样的形式:一种是8个发光二极管的阳极都 连在一起的,称之为共阳极 LED数码管显示器;另一种是8个发光二极管的阴极都连在一起 的,称之为共阴极 LED数码管显示器。如下图所示。` 共阴和共阳结构的 LED数码管显示器各笔划段名和安排位置是相同的。当二极管导通时, 对应的笔划段发亮,由发亮的笔划段组合而显示的各种字符。8个笔划段 hgfedcba 对应于一 个字节(8位)的 D7 D6 D5 D4 D3 D2 D1 D0,于是用8位二进制码就能表示欲显示字符的字 形代码。例如,对于共阴 LED数码管显示器,当公共阴极接地(为零电平),而阳极 hgfedcba 各段为0111011时,数码管显示器显示"P"字符,即对于共阴极 LED数码管显示器,“P”字 符的字形码是73H。如果是共阳 LED数码管显示器,公共阳极接高电平,显示“P”字符的字 形代码应为10001100(8CH)。这里必须注意的是:很多产品为方便接线,常不按规则的办法 去对应字段与位的关系,这个时候字形码就必须根据接线来自行设计了,后面我们会给出一 个例程。 在单片机应用系统中,数码管显示器显示常用两种办法:静态显示和动态扫描显示。所 谓静态显示,就是每一个数码管显示器都要占用单独的具有锁存功能的 I/O接口用于笔划段 51 单片机汇编语言教程-慧净电子会员收集整理 (全部 28课) 推荐使用慧净 51实验板。推荐 51学习网 WWW.HLMCU.COM 淘宝网:http://shop37031453.taobao.com/ 字形代码。这样单片机只要把要显示的字形代码发送到接口电路,就不用管它了,直到要显 示新的数据时,再发送新的字形码,因此,使用这种办法单片机中 CPU的开销小。能供给单 独锁存的 I/O接口电路很多,这里以常用的串并转换电路74LS164为例,介绍一种常用静态 显示电路,以使大家对静态显示有一定的了解。 MCS-51单片机串行口方式押为移们寄存器方式,外接6片74LS164作为6位LED数码管显示 器的静态显示接口,把8031的RXD作为数据输出线,TXD作为移位时钟脉冲。74LS164为TTL 单向8位移位寄存器,可实现串行输入,并行输出。其中A、B(第1、2脚)为串行数据输入 端,2个管脚按逻辑与运算规律输入信号,公一个输入信号时可并接。T(第8脚)为时钟输 入端,可连接到串行口的 TXD端。每一个时钟信号的上升沿加到 T端时,移位寄存器移一位, 8个时钟脉冲过后,8位二进制数全部移入74LS164中。R(第9脚)为复位端,当 R=0时,移 位寄存器各位复0,只有当 R=1时,时钟脉冲才起作用。Q1…Q8(第3-6和10-13管脚)并行 输出端分别接 LED数码管显示器的 hg---a 各段对应的管脚上。关于74LS164还能作如下的介 绍:所谓时钟脉冲端,其实就是需要高、低、高、低的脉冲,不管这个脉冲是怎么来的,比 如,我们用根电线,一端接 T,一端用手拿着,分别接高电平、低电平,那也是给出时钟脉 冲,在74LS164获得时钟脉冲的瞬间(再讲清楚点,是在脉冲的沿),如果数据输入端(第1, 2管脚)是高电平,则就会有一个1进入到74LS164的内部,如果数据输入端是低电平,则就 会有一个0进入其内部。在给出了8个脉冲后,最先进入74LS164的第一个数据到达了最高位, 然后再来一个脉冲会有什么发生呢?再来一个脉冲,第一个脉冲就会从最高位移出,就象车 站排队买票,栏杆就那么长,要从后面进去一本人,前面必须要从前面走出去一本人才行。 搞清了这一点,下面让我们来看电路,6片7LS164首尾相串,而时钟端则接在一起,这 样,当输入8个脉冲时,从单片机 RXD端输出的数据就进入到了第一片74LS164中了,而当第 二个8个脉冲到来后,这个数据就进入了第二片74LS164,而新的数据则进入了第一片 74LS164,这样,当第六个8个脉冲完成后,首次送出的数据被送到了最左面的164中,其他 数据依次出现在第一、二、三、四、五片74LS164中。有个问题,在第一个脉冲到来时,除 了第一片74LS164中接收数据外,其他各片在干吗呢?它们也在接收数据,因为它们的时钟 端都是被接在一起的,可是数据还没有送到其他各片呢,它们在接收什么数据呢?。。。。。。 其实所谓数据不过是一种说法而已,实际就是电平的高低,当第一个脉冲到来时,第一片164 固然是从单片机接收数据了,而其它各片也接到前一片的 Q8上,而 Q8是一根电线,在数字 电路中它只可能有两种状态:低电平或高电平,也就是“0”和“1”。所以它的下一片 74LS164也相当于是在接收数据啊。只是接收的全部是0或1而已。这个问题放在这儿说明, 51 单片机汇编语言教程-慧净电子会员收集整理 (全部 28课) 推荐使用慧净 51实验板。推荐 51学习网 WWW.HLMCU.COM 淘宝网:http://shop37031453.taobao.com/ 可能有朋友不屑一顾,而有的朋友可能还是不清楚,这实际上涉及到数的本质的问题,如果 不懂的,请仔细思考,并找一些数字电路的数,理解164的工作原理,再来看这个问题,或 者去看看我的另一篇文章《27课:关于单片机的一些基本概念》的文章。务必搞懂,搞懂了 这一点,你的级别就高过开始学习者,可谓入门者了。 入口:把要显示的数分别放在显示缓冲区60H-65H 共6个单元中,并且分别对应各个数码管 LED0-LED5。 出口:将预置在显示缓冲区中的6个数成对应的显示字形码,然后输出到数码管显示器中显 示。 单片机 led 显示程序如下: DISP:MOV SCON,#00H ;初始化串行口方式0 MOV R1,#06H ;显示6位数 MOV R0,#65H ;60H-65H 为显示缓冲区 MOVDPTR,#SEGTAB;字形表的入口地址 LOOP: MOV A,@R0 ;取最高位的待显示数据 MOVC A,@A+DPTR ;查表获取字形码 MOVSBUF,A;送串行口显示 DELAY:JNBTI,DELAY;等待发送完毕 CLRTI;清发送标志 DEC R0 ;指针下移一位,准备取下一个待显示数 DJNZ R1,LOOP ;直到6个数据全显示完。 RET SETTAB:;字形表,前面有介绍,以后我们再介绍字形表的制作。 DB 03H 9FH 27H 0DH 99H 49H 41H 1FH 01H 09H 0FFH ; 0 1 2 3 4 5 6 7 8 9 消隐码 单片机显示测试用主程序 ORG 0000H AJMPSTART ORG 30H START:MOV SP,#6FH 51 单片机汇编语言教程-慧净电子会员收集整理 (全部 28课) 推荐使用慧净 51实验板。推荐 51学习网 WWW.HLMCU.COM 淘宝网:http://shop37031453.taobao.com/ MOV 65H,#0 MOV 64H,#1 MOV 63H,#2 MOV 62H,#3 MOV 61H,#4 MOV 60H,#5 LCALLDISP SJMP $ 如果按图示数码管排列,则以上主程序将显示的是543210,想想看,如果要显示012345 该怎样送数? 下面我们来分析一下字形表的制作问题。先就上述“标准”的图形来看吧。写出数据位 和字形的对应关系并列一个表如下(设为共阳型,也就是对应的输出位为0时笔段亮) 如何,字形表会做了吧,就是这样列个表格,根据要求(0亮或1亮)写出对应位的0和1,就 成了。做个练习,写出 A-F的字形码吧。 如果为了接线方便而打乱了接线的次序,那么字形表又该如何接呢?也很简单,一样地列表 啊。以新实验板为例,共阳型。接线如下: P0.7 P0.6 P0.5 P0.4 P0.3 P0.2 P0.1 P0.0 CEHDGFAB 则字形码如下所示: ;0 00101000 28H ;1 01111110 7EH ;2 10100100 0A4H ;3 01100100 64H ;4 01110010 72H ;5 01100001 61H ;6 00100001 21H ;7 01111100 7CH ;8 00100000 20H ;9 01100000 60H 作为练习,大家写出 A-F的字形代码。 51 单片机汇编语言教程-慧净电子会员收集整理 (全部 28课) 推荐使用慧净 51实验板。推荐 51学习网 WWW.HLMCU.COM 淘宝网:http://shop37031453.taobao.com/ 本来这里是讲解单片机数码管显示器的静态接口的,到此应当可算结束了,但是我还想 接着上面讲到的数的本质的问题再谈一点。单片机中有一些术语、名词本来是帮助我们理解 事物的,但有时我们会被这些术语的相关语义所迷惑,以致不能进一步认清他们的本质,由 此一般陷入困惑的境界。只有深入地了解了74LS164的工作特性,才能真正理解何谓串行的 数据。 51实验板推荐(点击下面的图片可以进入下载资料链接) HJ-1G HJ-3G 51 单片机汇编语言教程-慧净电子会员收集整理 (全部 28课) 推荐使用慧净 51实验板。推荐 51学习网 WWW.HLMCU.COM 淘宝网:http://shop37031453.taobao.com/ 51 51 51 51 单片机汇编语言教程:24 24 24 24 课动态扫描显示接口电路及程序 (基于HJ-1G、HJ-3G 实验板) 在单片机系统中动态扫描显示接口是单片机中应用最为广泛的一种显示方式之一。其接 口电路是把所有显示器的 8个笔划段 a-h 同名端连在一起,而每一个显示器的公共极 COM 是各自独立地受 I/O 线控制。CPU 向字段输出口送出字形码时,所有显示器接收到相同的字 形码,但究竟是那个显示器亮,则取决于 COM 端,而这一端是由 I/O 控制的,所以我们就 能自行决定何时显示哪一位了。而所谓动态扫描就是指我们采用分时的办法,轮流控制各个 显示器的 COM 端,使各个显示器轮流点亮。 在轮流点亮扫描过程中,每位显示器的点亮时间是极为短暂的(约1ms),但由于人的视觉暂 留现象及发光二极管的余辉效应,尽管实际上各位显示器并非同时点亮,但只要扫描的速度 足够快,给人的印象就是一组稳定的显示数据,不会有闪烁感。 下图所示就是我们的单片机实验板上的动态扫描接口。由89c51的P0口能灌入较大的电 流,所以我们采用共阳的数码管,并且不用限流电阻,而只是用两只1N4004进行降压后给数 码管供电,这里仅用了两只,实际上还能扩充。它们的公共端则由 PNP型三极管8550控制, 显然,如果8550导通,则对应的数码管就能亮,而如果8550截止,则对应的数码管就不可能 亮,8550是由P2.7,P2.6控制的。这样我们就能通过控制 P27、P26达到控制某个数码管亮 或灭的目的。 下面的这个单片机程序,就是用实验板上的数码管显示0和1。 FIRSTEQU P2.7 ;第一位数码管的位控制 SECONDEQU P2.6 ;第二位数码管的位控制 DISPBUFFEQU 5AH ;显示缓冲区为5AH 和5BH ORG 0000H AJMPSTART ORG 30H START: MOV SP,#5FH ;设置堆栈 MOV P1,#0FFH MOV P0,#0FFH MOV P2,#0FFH ;初始化,所显示器,LED灭 MOV DISPBUFF,#0 ;第一位显示0 MOV DISPBUFF+1,#1 ;第二握显示1 LOOP: 51 单片机汇编语言教程-慧净电子会员收集整理 (全部 28课) 推荐使用慧净 51实验板。推荐 51学习网 WWW.HLMCU.COM 淘宝网:http://shop37031453.taobao.com/ LCALLDISP;调用显示程序 AJMPLOOP ;主程序到此结束 DISP: PUSHACC;ACC 入栈 PUSHPSW;PSW 入栈 MOVA,DISPBUFF;取第一个待显示数 MOVDPTR,#DISPTAB;字形表首地址 MOVC A,@A+DPTR ;取字形码 MOV P0,A ;将字形码送 P0位(段口) CLRFIRST;开第一位显示器位口 LCALLDELAY;延时1毫秒 SETBFIRST;关闭第一位显示器(开始准备第二位的数据) MOV A,DISPBUFF+1 ;取显示缓冲区的第二位 MOVDPTR,#DISPTAB MOVC A,@A+DPTR MOV P0,A ;将第二个字形码送 P0口 CLRSECOND;开第二位显示器 LCALLDELAY;延时 SETBSECOND;关第二位显示 POPPSW POPACC RET DELAY:;延时1毫秒 PUSHPSW SETB RS0 MOV R7,#50 D1: MOV R6,#10 D2: DJNZ R6,$ DJNZ R7,D1 51 单片机汇编语言教程-慧净电子会员收集整理 (全部 28课) 推荐使用慧净 51实验板。推荐 51学习网 WWW.HLMCU.COM 淘宝网:http://shop37031453.taobao.com/ POPPSW RET DISPTAB:DB 28H,7EH,0a4H,64H,72H,61H,21H,7CH,20H,60H END 从上面的单片机例程中能看出,动态扫描显示必须由 CPU持续地调用显示程序,才能保证持 续持续的显示。 上面的这个程序能实现数字的显示,但不太实用,为什么呢?这里仅是显示两个数字, 并没有做其他的工作,因此,两个数码管轮流显示1毫秒,没有问题,实际的工作中,当然 不可能只显示两个数字,还是要做其他的事情的,这样在二次调用显示程序之间的时间间隔 就不一不定了,如果时间间隔比较长,就会使显示不连续。而实际工作中是很难保证所有工 作都能在很短时间内完成的。况且这个显示程序也有点“浪费”,每个数码管显示都要占用 1个毫秒的时间,这在很多合是不允许的,怎么办呢?我们能借助于定时器,定时时间一到, 产生中断,点亮一个数码管,然后马上返回,这个数码管就会一直亮到下一次定时时间到, 而不用调用延时程序了,这段时间能留给主程序干其他的事。到下一次定时时间到则显示下 一个数码管,这样就很少浪费了。 Counter EQU 59H ;计数器,显示程序通过它得知现正显示哪个数码管 FIRSTEQU P2.7 ;第一位数码管的位控制 SECONDEQU P2.6 ;第二位数码管的位控制 DISPBUFFEQU 5AH ;显示缓冲区为5AH 和5BH ORG 0000H AJMPSTART ORG 000BH ;定时器 T0的入口 AJMPDISP;显示程序 ORG 30H START: MOV SP,#5FH ;设置堆栈 MOV P1,#0FFH MOV P0,#0FFH MOV P2,#0FFH ;初始化,所显示器,LED灭 MOV TMOD,#00000001B ;定时器 T0工作于模式1(16位定时/计数模式) 51 单片机汇编语言教程-慧净电子会员收集整理 (全部 28课) 推荐使用慧净 51实验板。推荐 51学习网 WWW.HLMCU.COM 淘宝网:http://shop37031453.taobao.com/ MOV TH0,#HIGH(65536-2000) MOV TL0,#LOW(65536-2000) SETB TR0 SETBEA SETB ET0 MOV Counter,#0 ;计数器初始化 MOV DISPBUFF,#0 ;第一位始终显示0 MOV A,#0 LOOP: MOV DISPBUFF+1,A ;第二位轮流显示0-9 INCA LCALLDELAY CJNE A,#10,LOOP MOV A,#0 AJMPLOOP;在此中间能按排任意程序,这里仅作示范。 ;主程序到此结束 DISP:;定时器 T0的中断响应程序 PUSHACC;ACC 入栈 PUSHPSW;PSW 入栈 MOV TH0,#HIGH(65536-2000) ;定时时间为2000个周期,约2170微秒(11.0592M) MOV TL0,#LOW(65536-2000) SETBFIRST SETBSECOND;关显示 MOVA,#DISPBUFF;显示缓冲区首地址 ADD A,Counter MOV R0,A MOV A,@R0 ;根据计数器的值取对应的显示缓冲区的值 MOVDPTR,#DISPTAB;字形表首地址 MOVC A,@A+DPTR ;取字形码 MOV P0,A ;将字形码送 P0位(段口) 51 单片机汇编语言教程-慧净电子会员收集整理 (全部 28课) 推荐使用慧净 51实验板。推荐 51学习网 WWW.HLMCU.COM 淘宝网:http://shop37031453.taobao.com/ MOV A,Counter ;取计数器的值 JZDISPFIRST;如果是0则显示第一位 CLRSECOND;不然显示第二位 AJMPDISPNEXT DISPFIRST: CLRFIRST;显示第一位 DISPNEXT: INC Counter ;计数器加1 MOV A,Counter DECA;如果计数器计到2,则让它回0 DECA JZRSTCOUNT AJMPDISPEXIT RSTCOUNT: MOV Counter,#0 ;计数器的值只能是0或1 DISPEXIT: POPPSW POPACC RETI DELAY:;延时130毫秒 PUSHPSW SETB RS0 MOV R7,#255 D1: MOV R6,#255 D2: NOP NOP NOP NOP DJNZ R6,D2 DJNZ R7,D1 51 单片机汇编语言教程-慧净电子会员收集整理 (全部 28课) 推荐使用慧净 51实验板。推荐 51学习网 WWW.HLMCU.COM 淘宝网:http://shop37031453.taobao.com/ POPPSW RET DISPTAB:DB 28H,7EH,0a4H,64H,72H,61H,21H,7CH,20H,60H END 从上面的单片机程序能看出,动态显示和静态显示相比,程序稍有点复杂,不过,这是 值得的。这个程序有一定的通用性,只要改变端口的值及计数器的值就能显示更多位数了。 下面给出显示程序的流程图。 <动态扫描程序框图> 51 单片机汇编语言教程-慧净电子会员收集整理 (全部 28课) 推荐使用慧净 51实验板。推荐 51学习网 WWW.HLMCU.COM 淘宝网:http://shop37031453.taobao.com/ 51实验板推荐(点击下面的图片可以进入下载资料链接) HJ-1G HJ-3G 51 单片机汇编语言教程-慧净电子会员收集整理 (全部 28课) 推荐使用慧净 51实验板。推荐 51学习网 WWW.HLMCU.COM 淘宝网:http://shop37031453.taobao.com/ 51单片机汇编语言教程:第25课-单片机键盘接口程序设计 (基于HJ-1G、HJ-3G 实验板) 键盘是由若干按钮组成的开关矩阵,它是单片机系统中最常用的输入设备,用户能通过 键盘向计算机输入指令、地址和数据。一般单片机系统中采和非编码键盘,非编码键盘是由 软件来识别键盘上的闭合键,它具有结构简单,使用灵活等特点,因此被广泛应用于单片机 系统。 按钮开关的抖动问题 组成键盘的按钮有触点式和非触点式两种,单片机中应用的一般是由机械触点组成的。在下 图中,当开 <键盘结构图> 关S未被按下时,P1。0输入为高电平,S闭合后,P1。0输入为低电平。由于按钮是机械触 点,当机械触点断开、闭合时,会有抖动动,P1。0输入端的波形如图2所示。这种抖动对于 人来说是感觉不到的,但对计算机来说,则是完全能感应到的,因为计算机处理的速度是在 微秒级,而机械抖动的时间至少是毫秒级,对计算机而言,这已是一个“漫长”的时间了。 前面我们讲到中断时曾有个问题,就是说按钮有时灵,有时不灵,其实就是这个原因,你只 按了一次按钮,可是计算机却已执行了多次中断的过程,如果执行的次数正好是奇数次,那 么结果正如你所料,如果执行的次数是偶数次,那就不对了。 为使CPU能正确地读出 P1口的状态,对每一次按钮只作一次响应,就必须考虑如何去除抖 动,常用的去抖动的办法有两种:硬件办法和软件办法。单片机中常用软件法,因此,对于 硬件办法我们不介绍。软件法其实很简单,就是在单片机获得 P1。0口为低的信息后,不是 立即认定 S1已被按下,而是延时10毫秒或更长一些时间后再次检测 P1。0口,如果仍为低, 说明S1的确按下了,这实际上是避开了按钮按下时的抖动时间。而在检测到按钮释放后(P1。 0为高)再延时5-10个毫秒,消除后沿的抖动,然后再对键值处理。不过一般情况下,我们 常常不对按钮释放的后沿进行处理,实践证明,也能满足一定的要求。当然,实际应用中, 对按钮的要求也是千差万别,要根据不一样的需要来编制处理程序,但以上是消除键抖动的 51 单片机汇编语言教程-慧净电子会员收集整理 (全部 28课) 推荐使用慧净 51实验板。推荐 51学习网 WWW.HLMCU.COM 淘宝网:http://shop37031453.taobao.com/ 原则。 键盘与单片机的连接 <键盘连接> 图3 <单片机与键盘接口图> 图4 1、通过1/0口连接。将每个按钮的一端接到单片机的 I/O口,另一端接地,这是最简单的办 法,如图3所示是实验板上按钮的接法,四个按钮分别接到 P3.2 、P3.3、P3.4和P3.5。对 于这种键各程序能采用持续查询的办法,功能就是:检测是否有键闭合,如有键闭合,则去 除键抖动,判断键号并转入对应的键处理。下面给出一个例程。其功能很简单,四个键定义 如下: P3.2:开始,按此键则灯开始流动(由上而下) P3.3:停止,按此键则停止流动,所有灯为暗 P3.4:上,按此键则灯由上向下流动 P3.5:下,按此键则灯由下向上流动 UpDown EQU 00H ;上下行标志 StartEnd EQU 01H ;起动及停止标志 LAMPCODEEQU 21H ;存放流动的数据代码 ORG 0000H AJMPMAIN ORG 30H MAIN: MOV SP,#5FH MOV P1,#0FFH CLR UpDown ;启动时处于向上的状态 51 单片机汇编语言教程-慧净电子会员收集整理 (全部 28课) 推荐使用慧净 51实验板。推荐 51学习网 WWW.HLMCU.COM 淘宝网:http://shop37031453.taobao.com/ CLR StartEnd ;启动时处于停止状态 MOV LAMPCODE,#0FEH ;单灯流动的代码 LOOP: ACALLKEY;调用键盘程序 JNB F0,LNEXT ;如果无键按下,则继续 ACALLKEYPROC;不然调用键盘处理程序 LNEXT: ACALLLAMP;调用灯显示程序 AJMPLOOP;反复循环,主程序到此结束 DELAY: MOV R7,#100 D1: MOV R6,#100 DJNZ R6,$ DJNZ R7,D1 RET ;----------------------------------------延时程序,键盘处理中调用 KEYPROC: MOVA,B;从B寄存器中获取键值 JB ACC.2,KeyStart ;分析键的代码,某位被按下,则该位为1(因为在键盘程序中已取反) JB ACC.3,KeyOver JB ACC.4,KeyUp JB ACC.5,KeyDown AJMPKEY_RET KeyStart: SETB StartEnd ;第一个键按下后的处理 AJMPKEY_RET KeyOver: CLR StartEnd ;第二个键按下后的处理 AJMPKEY_RET KeyUp: SETB UpDown ;第三个键按下后的处理 51 单片机汇编语言教程-慧净电子会员收集整理 (全部 28课) 推荐使用慧净 51实验板。推荐 51学习网 WWW.HLMCU.COM 淘宝网:http://shop37031453.taobao.com/ AJMPKEY_RET KeyDown: CLR UpDown ;第四个键按下后的处理 KEY_RET:RET KEY: CLR F0 ;清F0,表示无键按下。 ORL P3,#00111100B ;将P3口的接有键的四位置1 MOV A,P3 ;取P3的值 ORL A,#11000011B ;将其余4位置1 CPLA;取反 JZK_RET;如果为0则一定无键按下 ACALLDELAY;不然延时去键抖 ORL P3,#00111100B MOV A,P3 ORL A,#11000011B CPLA JZK_RET MOVB,A;确实有键按下,将键值存入 B中 SETB F0 ;设置有键按下的标志 K_RET: ORL P3,#00111100B ;此处循环等待键的释放 MOV A,P3 ORL A,#11000011B CPLA JZ K_RET1 ;直到读取的数据取反后为0说明键释放了,才从键盘处理程序中返回 AJMPK_RET K_RET1: RET D500MS: ;流水灯的延迟时间 PUSHPSW 51 单片机汇编语言教程-慧净电子会员收集整理 (全部 28课) 推荐使用慧净 51实验板。推荐 51学习网 WWW.HLMCU.COM 淘宝网:http://shop37031453.taobao.com/ SETB RS0 MOV R7,#200 D51: MOV R6,#250 D52: NOP NOP NOP NOP DJNZ R6,D52 DJNZ R7,D51 POPPSW RET LAMP: JB StartEnd,LampStart ;如果StartEnd=1,则启动 MOV P1,#0FFH AJMPLAMPRET;不然关闭所有显示,返回 LampStart: JB UpDown,LAMPUP ;如果UpDown=1,则向上流动 MOVA,LAMPCODE RLA;实际就是左移位而已 MOVLAMPCODE,A MOV P1,A LCALL D500MS AJMPLAMPRET LAMPUP: MOVA,LAMPCODE RRA;向下流动实际就是右移 MOVLAMPCODE,A MOV P1,A LCALL D500MS LAMPRET: 51 单片机汇编语言教程-慧净电子会员收集整理 (全部 28课) 推荐使用慧净 51实验板。推荐 51学习网 WWW.HLMCU.COM 淘宝网:http://shop37031453.taobao.com/ RET END 以上程序功能很简单,但它演示了一个单片机键盘处理程序的基本思路,程序本身很简单, 也不很实用,实际工作中还会有好多要考虑的因素,比如主循环每次都调用灯的循环程序, 会造成按钮反应“迟钝”,而如果一直按着键不放,则灯不会再流动,一直要到松开手为止, 等等,大家能仔细考虑一下这些问题,再想想有什么好的解决办法。 2、采用中断方式:如图4所示。各个按钮都接到一个与非上,当有任何一个按钮按下时,都 会使与门输出为低电平,从而引起单片机的中断,它的好处是不用在主程序中持续地循环查 询,如果有键按下,单片机再去做对应的处理 51实验板推荐(点击下面的图片可以进入下载资料链接) HJ-1G HJ-3G 51 单片机汇编语言教程-慧净电子会员收集整理 (全部 28课) 推荐使用慧净 51实验板。推荐 51学习网 WWW.HLMCU.COM 淘宝网:http://shop37031453.taobao.com/ 51单片机汇编语言教程:第26课-矩阵式键盘接口技术及程序设计 (基于HJ-1G、HJ-3G 实验板) 在单片机系统中键盘中按钮数量较多时,为了减少 I/O口的占用,常常将按钮排列成矩阵形 式,如图1所示。在矩阵式键盘中,每条水平线和垂直线在交叉处不直接连通,而是通过一 个按钮加以连接。这样,一个端口(如 P1口)就能组成4*4=16个按钮,比之直接将端口线 用于键盘多出了一倍,而且线数越多,区别越明显,比如再多加一条线就能组成20键的键盘, 而直接用端口线则只能多出一键(9键)。由此可见,在需要的键数比较多时,采用矩阵法来 做键盘是合理的。 <单片机矩阵式键盘接口技术及编程接口图> 矩阵式结构的键盘显然比直接法要复杂一些,识别也要复杂一些,上图中,列线通过电阻接 正电源,并将行线所接的单片机的 I/O口作为输出端,而列线所接的 I/O口则作为输入。这 样,当按钮没有按下时,所有的输出端都是高电平,代表无键按下。行线输出是低电平,一 旦有键按下,则输入线就会被拉低,这样,通过读入输入线的状态就可得知是否有键按下了。 具体的识别及编程办法如下所述。 矩阵式键盘的按钮识别办法 确定矩阵式键盘上何键被按下介绍一种“行扫描法”。 行扫描法 行扫描法又称为逐行(或列)扫描查询法,是一种最常用的按钮识别办法,如上 图所示键盘,介绍过程如下。 判断键盘中有无键按下 将全部行线 Y0-Y3置低电平,然后检测列线的状态。只要有一列的 电平为低,则表示键盘中有键被按下,而且闭合的键位于低电平线与4根行线相交叉的4个按 51 单片机汇编语言教程-慧净电子会员收集整理 (全部 28课) 推荐使用慧净 51实验板。推荐 51学习网 WWW.HLMCU.COM 淘宝网:http://shop37031453.taobao.com/ 钮之中。若所有列线均为高电平,则键盘中无键按下。 判断闭合键所在的位置 在确认有键按下后,即可进入确定具体闭合键的过程。其办法是: 依次将行线置为低电平,即在置某根行线为低电平时,其它线为高电平。在确定某根行线位 置为低电平后,再逐行检测各列线的电平状态。若某列为低,则该列线与置为低电平的行线 交叉处的按钮就是闭合的按钮。 下面给出一个具体的例程: 图仍如上所示。8031单片机的 P1口用作键盘 I/O口,键盘的列线接到 P1口的低4位,键盘的 行线接到 P1口的高4位。列线 P1.0-P1.3分别接有4个上拉电阻到正电源+5V,并把列线 P1.0-P1.3设置为输入线,行线 P1.4-P.17设置为输出线。4根行线和4根列线形成16个相交 点。 检测当前是否有键被按下。检测的办法是 P1.4-P1.7输出全“0”,读取 P1.0-P1.3的状态, 若P1.0-P1.3为全“1”,则无键闭合,不然有键闭合。 去除键抖动。当检测到有键按下后,延时一段时间再做下一步的检测判断。 若有键被按下,应识别出是哪一个键闭合。办法是对键盘的行线进行扫描。P1.4-P1.7按下 述4种组合依次输出: P1.7 1 1 1 0 P1.6 1 1 0 1 P1.5 1 0 1 1 P1.4 0 1 1 1 在每组行输出时读取 P1.0-P1.3,若全为“1”,则表示为“0”这一行没有键闭合,不然有 键闭合。由此得到闭合键的行值和列值,然后可采用计算法或查表法将闭合键的行值和列值 转换成所定义的键值 为了保证键每闭合一次 CPU仅作一次处理,必须却除键释放时的抖动。 51 单片机汇编语言教程-慧净电子会员收集整理 (全部 28课) 推荐使用慧净 51实验板。推荐 51学习网 WWW.HLMCU.COM 淘宝网:http://shop37031453.taobao.com/ 《单片机矩阵式键盘接口技术及编程》 键盘扫描程序: 从以上分析得到单片机键盘扫描程序的流程图如图2所示。程序如下 SCAN:MOV P1,#0FH MOV A,P1 ANL A,#0FH CJNE A,#0FH,NEXT1 SJMP NEXT3 NEXT1: ACALL D20MS MOV A,#0EFH 51 单片机汇编语言教程-慧净电子会员收集整理 (全部 28课) 推荐使用慧净 51实验板。推荐 51学习网 WWW.HLMCU.COM 淘宝网:http://shop37031453.taobao.com/ NEXT2: MOV R1,A MOV P1,A MOV A,P1 ANL A,#0FH CJNE A,#0FH,KCODE; MOV A,R1 SETBC RLCA JC NEXT2 NEXT3: MOV R0,#00H RET KCODE:MOV B,#0FBH NEXT4: RRCA INCB JC NEXT4 MOV A,R1 SWAPA NEXT5: RRCA INCB INCB INCB INCB JC NEXT5 NEXT6: MOV A,P1 ANL A,#0FH CJNE A,#0FH,NEXT6 MOV R0,#0FFH RET 键盘处理程序就作这么一个简单的介绍,实际上,键盘、显示处理是很复杂的,它一般占到 一个应用程序的大部份代码,可见其重要性,但说到,这种复杂并不来自于单片机的本身, 51 单片机汇编语言教程-慧净电子会员收集整理 (全部 28课) 推荐使用慧净 51实验板。推荐 51学习网 WWW.HLMCU.COM 淘宝网:http://shop37031453.taobao.com/ 而是来自于操作者的习惯等等问题,因此,在编写键盘处理程序之前,最好先把它从逻辑上 理清,然后用适当的算法表示出来,最后再去写代码,这样,才能快速有效地写好代码。 51实验板推荐(点击下面的图片可以进入下载资料链接) HJ-1G HJ-3G 51 单片机汇编语言教程-慧净电子会员收集整理 (全部 28课) 推荐使用慧净 51实验板。推荐 51学习网 WWW.HLMCU.COM 淘宝网:http://shop37031453.taobao.com/ 51 51 51 51 单片机汇编语言教程:第27 27 27 27 课----关于单片机的一些基本概念 (基于HJ-1G、HJ-3G 实验板) 随着电子技术的迅速发展,计算机已深入地渗透到我们的生活中,许多电子爱好者开始 学习单片机知识,但单片机的内容比较抽象,相对电子爱好者已熟悉的模拟电路、数字电路, 单片机中有一些新的概念,这些概念非常基本以至于一般作者不屑去谈,教材自然也不会很 深入地讲解这些概念,但这些内容又是学习中必须要理解的,下面就结合本人的学习、教学 经验,对这些最基本概念作一说明,希望对自学者有所帮助。 一、总线:我们知道,一个电路总是由元器件通过电线连接而成的,在模拟电路中,连 线并不成为一个问题,因为各器件间一般是串行关系,各器件之间的连线并不很多,但计算 机电路却不一样,它是以微处理器为核心,各器件都要与微处理器相连,各器件之间的工作 必须相互协调,所以就需要的连线就很多了,如果仍如同模拟电路一样,在各微处理器和各 器件间单独连线,则线的数量将多得惊人,所以在微处理机中引入了总线的概念,各个器件 共同享用连线,所有器件的8根数据线全部接到8根公用的线上,即相当于各个器件并联起来, 但仅这样还不行,如果有两个器件同时送出数据,一个为0,一个为1,那么,接收方接收到 的究竟是什么呢?这种情况是不允许的,所以要通过控制线进行控制,使器件分时工作,任 何时候只能有一个器件发送数据(能有多个器件同时接收)。器件的数据线也就被称为数据 总线,器件所有的控制线被称为控制总线。在单片机内部或者外部存储器及其它器件中有存 储单元,这些存储单元要被分配地址,才能使用,分配地址当然也是以电信号的形式给出的, 由于存储单元比较多,所以,用于地址分配的线也较多,这些线被称为地址总线。 二、数据、地址、指令:之所以将这三者放在一起,是因为这三者的本质都是一样的 ──数字,或者说都是一串‘0’和‘1’组成的序列。换言之,地址、指令也都是数据。指 令:由单片机芯片的设计者规定的一种数字,它与我们常用的指令助记符有着严格的一一对 应关系,不能由单片机的开发者更改。地址:是寻找单片机内部、外部的存储单元、输入输 出口的依据,内部单元的地址值已由芯片设计者规定好,不可更改,外部的单元能由单片机 开发者自行决定,但有一些地址单元是一定要有的(详见程序的执行过程)。数据:这是由 微处理机处理的对象,在各种不一样的应用电路中各不相同,一般而言,被处理的数据可能 有这么几种情况: 1·地址(如 MOVDPTR,#1000H),即地址1000H 送入DPTR。 2·方式字或控制字(如 MOVTMOD,#3),3即是控制字。 3·常数(如 MOV TH0,#10H)10H 即定时常数。 4·实际输出值(如 P1口接彩灯,要灯全亮,则执行指令:MOV P1,#0FFH,要灯全暗,则 执行指令:MOV P1,#00H)这里0FFH 和00H 都是实际输出值。又如用于 LED的字形码,也是 51 单片机汇编语言教程-慧净电子会员收集整理 (全部 28课) 推荐使用慧净 51实验板。推荐 51学习网 WWW.HLMCU.COM 淘宝网:http://shop37031453.taobao.com/ 实际输出的值。 理解了地址、指令的本质,就不难理解程序运行过程中为什么会跑飞,会把数据当成指令来 执行了。 三、P0口、P2口和P3的第二功能使用办法 开始学习时一般对 P0口、P2口和P3口的第 二功能使用办法迷惑不解,认为第二功能和原功能之间要有一个切换的过程,或者说要有一 条指令,事实上,各端口的第二功能完全是自动的,不需要用指令来转换。如 P3.6、P3.7 分别是 WR、RD信号,当微片理机外接 RAM或有外部 I/O口时,它们被用作第二功能,不能 作为通用 I/O 口使用,只要一微处理机一执行到 MOVX 指令,就会有对应的信号从 P3.6或 P3.7 送出,不需要事先用指令说明。事实上‘不能作为通用 I/O 口使用’也并不是‘不能’而是 (使用者)‘不会’将其作为通用 I/O口使用。你完全能在指令中按排一条 SETB P3.7的指 令,并且当单片机执行到这条指令时,也会使 P3.7变为高电平,但使用者不会这么去做, 因为这常常这会导致系统的崩溃(即死机)。 四、程序的执行过程 单片机在通电复位后8051内的程序计数器(PC)中的值为‘0000’, 所以程序总是从‘0000’单元开始执行,也就是说:在系统的 ROM中一定要存在‘0000’这 个单元,并且在‘0000’单元中存放的一定是一条指令。 五、堆栈 堆栈是一个区域,是用来存放数据的,这个区域本身没有任何特殊之处,就 是内部 RAM的一部份,特殊的是它存放和取用数据的方式,即所谓的‘先进后出,后进先 出’,并且堆栈有特殊的数据传输指令,即‘PUSH’和‘POP’,有一个特殊的专为其服务 的单元,即堆栈指针 SP,每当执一次 PUSH 指令时,SP就(在原来值的基础上)自动加1, 每当执行一次 POP指令,SP就(在原来值的基础上)自动减1。由于 SP中的值能用指令加 以改变,所以只要在程序开始阶段更改了 SP的值,就能把堆栈设置在规定的内存单元中, 如在程序开始时,用一条 MOVSP,#5FH 指令,就时把堆栈设置在从内存单元60H 开始的单 元中。一般程序的开头总有这么一条设置堆栈指针的指令,因为开机时,SP的初始值为07H, 这样就使堆栈从08H 单元开始往后,而08H 到1FH 这个区域正是8031的第二、三、四工作寄 存器区,经常要被使用,这会造成数据的浑乱。不一样作者编写程序时,初始化堆栈指令也 不完全相同,这是作者的习惯问题。当设置好堆栈区后,并不意味着该区域成为一种专用内 存,它还是能象普通内存区域一样使用,只是一般情况下编程者不会把它当成普通内存用了。 六、单片机的开发过程 这里所说的开发过程并不是一般书中所说的从任务分析开始, 我们假设已设计并制作好硬件,下面就是编写软件的工作。在编写软件之前,首先要确定一 些常数、地址,事实上这些常数、地址在设计阶段已被直接或间接地确定下来了。如当某器 51 单片机汇编语言教程-慧净电子会员收集整理 (全部 28课) 推荐使用慧净 51实验板。推荐 51学习网 WWW.HLMCU.COM 淘宝网:http://shop37031453.taobao.com/ 件的连线设计好后,其地址也就被确定了,当器件的功能被确定下来后,其控制字也就被确 定了。然后用文本编缉器(如 EDIT、CCED 等)编写软件,编写好后,用编译器对源程序文 件编译,查错,直到没有语法错误,除了极简单的程序外,一般应用仿真机对软件进行调试, 直到程序运行正确为止。运行正确后,就能写片(将程序固化在 EPROM 中)。在源程序被编 译后,生成了扩展名为 HEX的目标文件,一般编程器能够识别这种格式的文件,只要将此文 件调入即可写片。在此,为使大家对整个过程有个认识,举一例说明: 表1 ORG 0000H LJMPSTART ORG 040H START: MOVSP,#5FH ;设堆栈 LOOP: NOP LJMPLOOP;循环 END;结束 表2 :03000000020040BB :0700400075815F000200431F 表3 02 00 40 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFF 75 81 5F 00 02 00 43 表1为源程序,表2是汇编后得到的 HEX文件,表3是由HEX文件转换成的目标文件,也就是 最终写入 EPROM 的文件,它由编程器转换得到,也能由 HEXBIN 一类的程序转换得到。学过 手工汇编者应当不难找出表3与表1的一一对应关系,值得注意的是从02 00 40后开始的一长 串‘FF’,直到75 81,这是由于伪指令:ORG 040H 造成的结果。 七、仿真、仿真机 仿真是单片机开发过程中非常重要的一个环节,除了一些极简单的 任务,一般产品开发过程中都要进行仿真,仿真的主要目的是进行软件调试,当然借助仿真 机,也能进行一些硬件排错。一块单片机应用电路板包括单片机部份及为达到使用目的而设 51 单片机汇编语言教程-慧净电子会员收集整理 (全部 28课) 推荐使用慧净 51实验板。推荐 51学习网 WWW.HLMCU.COM 淘宝网:http://shop37031453.taobao.com/ 计的应用电路,仿真就是利用仿真机来代替应用电路板(称目标机)的单片机部份,对应用 电路部份进行测试、调试。仿真有 CPU仿真和 ROM仿真两种,所谓CPU仿真是指用仿真机代 替目标机的 CPU,由仿真机向目标机的应用电路部份供给各种信号、数据,进行调试的办法。 这种仿真能通过单步运行、连续运行等多种办法来运行程序,并能观察到单片机内部的变化, 便于改正程序中的错误。所谓ROM仿真,就是用仿真机代替目标机的 ROM,目标机的 CPU工 作时,从仿真机中读取程序,并执行。这种仿真其实就是将仿真机当成一片 EPROM,只是省 去了擦片、写片的麻烦,并没有多少调试手段可言。常常这是二种不一样类型的仿真机,也 就是说,一台仿真机不能既做 CPU仿真,又做ROM仿真。可能的情况下,当然以 CPU仿真好。 51实验板推荐(点击下面的图片可以进入下载资料链接) HJ-1G HJ-3G 51 单片机汇编语言教程-慧净电子会员收集整理 (全部 28课) 推荐使用慧净 51实验板。推荐 51学习网 WWW.HLMCU.COM 淘宝网:http://shop37031453.taobao.com/ 51单片机汇编语言教程:第28课-音乐程序设计 (基于HJ-1G、HJ-3G 实验板) 利用单片机(或单板机)奏乐大概是无线电爱好者感兴趣的问题之一。本文从单片机的 基本发间实验出发,谈谈音乐程序的设计原理,并给出具体实例,以供参考。 单片机的基本发音实验 我们知道,声音的频谱范围约在几十到几千赫兹,若能利用程序来控制单处机某个口线的 “高”电平或低电平,则在该口线上就能产生一定频率的矩形波,接上喇叭就能发出一定频 率的声音,若再利用延时程序控制“高”“低”电平的持续时间,就能改变输出频率,从而 改变音调。 例如,要产生200HZ 的音频信号,按图1接入喇叭(若属临时实验,也可将喇叭直接接在 P1 口线上),实验程序为: 其中子程序 DEL为延时子程序,当R3为1时,延时时间约为20us,R3中存放延时常数,对200HZ 音频,其周期为1/200秒,即5ms。这样,当 P1.4的高电平或低电平的持续时间为2.5ms,即 R3的时间常数取2500/20=125(7DH)时,就能发出200HZ 的音调。将上述程序键入学习机,并 持续修改 R3的常数能感到音调的变化。乐曲中,每一音符对应着确定的频率,表1给出C调 时各音符频率及其对应的时间常数。读者能根据表1所供给的常数,将其16进制代码送入 R3, 反复练习体会。根据表1能奏出音符。仅这还不够,要准确奏出一首曲子,必须准确地控制 乐曲节奏,即一音符的持续时间。 音符的节拍我们能用定时器 T0来控制,送入不一样的初值,就能产生不一样的定时时间。 便如某歌曲的节奏为每分钟94拍,即一拍为0.64秒。其它节拍与时间的对应关系见表2。 但时,由于T0的最大定时时间只能为131毫秒,因此不可能直接用改变 T0的时间初值来实现 不一样节拍。我们能用 T0来产生10毫秒的时间基准,然后设置一个中断计数器,通过判别 中断计数器的值来控制节拍时间的长短。表2中也给出了各种节拍所对应的时间常数。例如 对1/4拍音符,定时时间为0.16秒,对应的时间常数为16(即10H);对3拍音符,定时时间为 1.92秒,对应时间长数为192(即C0H)。 我们将每一音符的时间常数和其对应的节拍常数作为一组,按次序将乐曲中的所有常数排列 成一个表,然后由查表程序依次取出,产生音符并控制节奏,就能实现演奏效果。此外,结 束符和体止符能分别用代码00H 和FFH 来表示,若查表结果为00H,则表示曲子终了;若查 表结果为 FFH,则产生对应的停顿效果。为了产生手弹的节奏感,在某些音符(例如两个相 同音符)音插入一个时间单位的频率略有不一样的音符。 51 单片机汇编语言教程-慧净电子会员收集整理 (全部 28课) 推荐使用慧净 51实验板。推荐 51学习网 WWW.HLMCU.COM 淘宝网:http://shop37031453.taobao.com/ 下面给出程序序清单,可直接在 TD-III 型学习机上演奏,对其它不一样型号的学习机,只 需对应地改变一下地址即可。本程序演奏的是民歌“八月桂花遍地开”,C调,节奏为94拍 /分。读者也能自行找出一首歌,按表1和表2给定的常数,将乐曲翻译成码表输入机器,而 程序不变。本实验办法简便,即使不懂音乐的人,将一首陌生的曲子翻译成代码也是易事, 和着机器的演奏学唱一首歌曲,其趣味无穷。 程序清单(略,请参看源程序的说明)。 程序框图如图2所示。 <单片机音乐程序的设计图> 本课由单片机教程网提供,有问题指出. 硬件连接说明: 随便找一个仿真机或者什么单片机实验板,只要能工作的就行,将程序输入,运行,然后找 个音箱(你计算机旁边应当就有一对吧)拨出插头,插头的前端接在 P1。0上,后面部分找 根线接单片机的地,就应当有声了,然后怎么改进硬件连接就是你的事了。。。。 音乐程序汇编代码代码1 -------------Voice.asm-------------------------- ORG 0000H 51 单片机汇编语言教程-慧净电子会员收集整理 (全部 28课) 推荐使用慧净 51实验板。推荐 51学习网 WWW.HLMCU.COM 淘宝网:http://shop37031453.taobao.com/ LJMPSTART ORG 000BH INC 20H ;中断服务,中断计数器加1 MOV TH0,#0D8H MOV TL0,#0EFH ;12M 晶振,形成10毫秒中断 RETI START: MOV SP,#50H MOV TH0,#0D8H MOV TL0,#0EFH MOV TMOD,#01H MOV IE,#82H MUSIC0: NOP MOVDPTR,#DAT;表头地址送 DPTR MOV 20H,#00H ;中断计数器清0 MOV B,#00H ;表序号清0 MUSIC1: NOP CLRA MOVC A,@A+DPTR ;查表取代码 JZ END0 ;是00H,则结束 CJNE A,#0FFH,MUSIC5 LJMP MUSIC3 MUSIC5: NOP MOV R6,A INCDPTR MOVA,B MOVC A,@A+DPTR ;取节拍代码送 R7 51 单片机汇编语言教程-慧净电子会员收集整理 (全部 28课) 推荐使用慧净 51实验板。推荐 51学习网 WWW.HLMCU.COM 淘宝网:http://shop37031453.taobao.com/ MOV R7,A SETB TR0 ;启动计数 MUSIC2: NOP CPL P1.0 MOV A,R6 MOV R3,A LCALLDEL MOV A,R7 CJNE A,20H,MUSIC2 ;中断计数器(20H)=R7否? ;不等,则继续循环 MOV 20H,#00H ;等于,则取下一代码 INCDPTR ;INCB LJMP MUSIC1 MUSIC3: NOP CLR TR0 ;休止100毫秒 MOV R2,#0DH MUSIC4: NOP MOV R3,#0FFH LCALLDEL DJNZ R2,MUSIC4 INCDPTR LJMP MUSIC1 END0: NOP MOV R2,#64H ;歌曲结束,延时1秒后继续 MUSIC6: 51 单片机汇编语言教程-慧净电子会员收集整理 (全部 28课) 推荐使用慧净 51实验板。推荐 51学习网 WWW.HLMCU.COM 淘宝网:http://shop37031453.taobao.com/ MOV R3,#00H LCALLDEL DJNZ R2,MUSIC6 LJMP MUSIC0 DEL: NOP DEL3: MOV R4,#02H DEL4: NOP DJNZ R4,DEL4 NOP DJNZ R3,DEL3 RET NOP DAT: db 26h,20h,20h,20h,20h,20h,26h,10h,20h,10h,20h,80h,26h,20h,30h,20h db 30h,20h,39h,10h,30h,10h,30h,80h,26h,20h,20h,20h,20h,20h,1ch,20h db 20h,80h,2bh,20h,26h,20h,20h,20h,2bh,10h,26h,10h,2bh,80h,26h,20h db 30h,20h,30h,20h,39h,10h,26h,10h,26h,60h,40h,10h,39h,10h,26h,20h db 30h,20h,30h,20h,39h,10h,26h,10h,26h,80h,26h,20h,2bh,10h,2bh,10h db 2bh,20h,30h,10h,39h,10h,26h,10h,2bh,10h,2bh,20h,2bh,40h,40h,20h db 20h,10h,20h,10h,2bh,10h,26h,30h,30h,80h,18h,20h,18h,20h,26h,20h db 20h,20h,20h,40h,26h,20h,2bh,20h,30h,20h,30h,20h,1ch,20h,20h,20h db 20h,80h,1ch,20h,1ch,20h,1ch,20h,30h,20h,30h,60h,39h,10h,30h,10h db 20h,20h,2bh,10h,26h,10h,2bh,10h,26h,10h,26h,10h,2bh,10h,2bh,80h db 18h,20h,18h,20h,26h,20h,20h,20h,20h,60h,26h,10h,2bh,20h,30h,20h db 30h,20h,1ch,20h,20h,20h,20h,80h,26h,20h,30h,10h,30h,10h,30h,20h db 39h,20h,26h,10h,2bh,10h,2bh,20h,2bh,40h,40h,10h,40h,10h,20h,10h db 20h,10h,2bh,10h,26h,30h,30h,80h,00H 51 单片机汇编语言教程-慧净电子会员收集整理 (全部 28课) 推荐使用慧净 51实验板。推荐 51学习网 WWW.HLMCU.COM 淘宝网:http://shop37031453.taobao.com/ END 音乐程序汇编代码代码2 -------------Voice1.asm-------------------------- ;标题 '八月桂花香'发声程序 ;摘要 详见'无线电'92年3期 ;作者 周振安 ORG 0000H LJMPSTART ORG 000BH INC 20H ;中断服务,中断计数器加1 MOV TH0,#0D8H MOV TL0,#0EFH ;12M 晶振,形成10毫秒中断 RETI START: MOV SP,#50H MOV TH0,#0D8H MOV TL0,#0EFH MOV TMOD,#01H MOV IE,#82H MUSIC0: NOP MOVDPTR,#DAT;表头地址送 DPTR MOV 20H,#00H ;中断计数器清0 MOV B,#00H ;表序号清0 MUSIC1: NOP CLRA MOVC A,@A+DPTR ;查表取代码 JZ END0 ;是00H,则结束 CJNE A,#0FFH,MUSIC5 LJMP MUSIC3 51 单片机汇编语言教程-慧净电子会员收集整理 (全部 28课) 推荐使用慧净 51实验板。推荐 51学习网 WWW.HLMCU.COM 淘宝网:http://shop37031453.taobao.com/ MUSIC5: NOP MOV R6,A INCDPTR MOVA,B MOVC A,@A+DPTR ;取节拍代码送 R7 MOV R7,A SETB TR0 ;启动计数 MUSIC2: NOP CPL P1.0 MOV A,R6 MOV R3,A LCALLDEL MOV A,R7 CJNE A,20H,MUSIC2 ;中断计数器(20H)=R7否? ;不等,则继续循环 MOV 20H,#00H ;等于,则取下一代码 INCDPTR ;INCB LJMP MUSIC1 MUSIC3: NOP CLR TR0 ;休止100毫秒 MOV R2,#0DH MUSIC4: NOP MOV R3,#0FFH LCALLDEL DJNZ R2,MUSIC4 51 单片机汇编语言教程-慧净电子会员收集整理 (全部 28课) 推荐使用慧净 51实验板。推荐 51学习网 WWW.HLMCU.COM 淘宝网:http://shop37031453.taobao.com/ INCDPTR LJMP MUSIC1 END0: NOP MOV R2,#64H ;歌曲结束,延时1秒后继续 MUSIC6: MOV R3,#00H LCALLDEL DJNZ R2,MUSIC6 LJMP MUSIC0 DEL: NOP DEL3: MOV R4,#02H DEL4: NOP DJNZ R4,DEL4 NOP DJNZ R3,DEL3 RET NOP DAT: DB 18H, 30H, 1CH, 10H DB 20H, 40H, 1CH, 10H DB 18H, 10H, 20H, 10H DB 1CH, 10H, 18H, 40H DB 1CH, 20H, 20H, 20H DB 1CH, 20H, 18H, 20H DB 20H, 80H, 0FFH, 20H DB 30H, 1CH, 10H , 18H 51 单片机汇编语言教程-慧净电子会员收集整理 (全部 28课) 推荐使用慧净 51实验板。推荐 51学习网 WWW.HLMCU.COM 淘宝网:http://shop37031453.taobao.com/ DB 20H, 15H, 20H , 1CH DB 20H, 20H, 20H , 26H DB 40H, 20H , 20H , 2BH DB 20H, 26H, 20H , 20H DB 20H, 30H , 80H , 0FFH DB 20H, 20H, 1CH , 10H DB 18H, 10H, 20H , 20H DB 26H, 20H , 2BH , 20H DB 30H, 20H , 2BH , 40H DB 20H, 20H , 1CH , 10H DB 18H, 10H, 20H, 20H DB 26H, 20H , 2BH, 20H DB 30H, 20H, 2BH , 40H DB 20H, 30H, 1CH , 10H DB 18H, 20H , 15H , 20H DB 1CH, 20H , 20H , 20H DB 26H, 40H, 20H , 20H DB 2BH, 20H, 26H , 20H DB 20H, 20H, 30H , 80H DB 20H, 30H, 1CH , 10H DB 20H, 10H, 1CH , 10H DB 20H, 20H, 26H , 20H DB 2BH, 20H, 30H , 20H DB 2BH, 40H, 20H , 15H DB 1FH, 05H, 20H , 10H DB 1CH, 10H, 20H , 20H DB 26H, 20H, 2BH , 20H DB 30H, 20H, 2BH , 40H DB 20H, 30H, 1CH , 10H DB 18H, 20H , 15H , 20H 51 单片机汇编语言教程-慧净电子会员收集整理 (全部 28课) 推荐使用慧净 51实验板。推荐 51学习网 WWW.HLMCU.COM 淘宝网:http://shop37031453.taobao.com/ DB 1CH, 20H , 20H , 20H DB 26H, 40H, 20H , 20H DB 2BH, 20H, 26H , 20H DB 20H, 20H, 30H, 30H DB 20H, 30H, 1CH, 10H DB 18H, 40H, 1CH, 20H DB 20H, 20H, 26H, 40H DB 13H, 60H, 18H , 20H DB 15H, 40H, 13H , 40H DB 18H, 80H, 00H end 51实验板推荐(点击下面的图片可以进入下载资料链接) HJ-1G HJ-3G
还剩124页未读

继续阅读

下载pdf到电脑,查找使用更方便

pdf的实际排版效果,会与网站的显示效果略有不同!!

需要 10 金币 [ 分享pdf获得金币 ] 0 人已下载

下载pdf

pdf贡献者

wwwmagic

贡献于2017-05-17

下载需要 10 金币 [金币充值 ]
亲,您也可以通过 分享原创pdf 来获得金币奖励!
下载pdf