您好,欢迎来电子发烧友网! ,新用户?[免费注册]

当前位置:电子发烧友网 > 图书频道 > 电子 > 《单片机原理与应用》 > 第4章 汇编语言程序设计

第1节 单片机计数

  4.1.1 硬件电路

  1. 硬件电路

  硬件电路如图4.1所示,555振荡电路产生约4HZ的脉冲信号,经S3点接到单片机P3.4输入端,注意应将跳线JP1下面的两个端子(M与R)短接。

  图4.1 单片机计数电路原理图

  2. 工作原理

  MCS-51单片机内部有两个16位的定时/计数器,都可以用于对外部事件进行计数。外部计数脉冲从P3.4或P3.5端口输人,程序设置定时/计数器工作在计数状态即可以对外部事件进行计数。

  4.1.2 程序设计

  ORG 0000H

  LJMP MAIN

  ORG 0030H

  MAIN: MOV TMOD,#06H

  MOV TH0,#0F6H

  MOV TL0,#0F6H

  SETB TR0

  MOV A,#0FEH

  LOOP: MOV P1,A

  JBC TF0,MLOOP

  SJMP LOOP

  MLOOP:RL A

  SJMP LOOP

  END

  4.1.3 源程序的编辑、编译、下载

  打开“伟福”模拟仿真软件进行程序的编辑、编译。

  打开“ISP下载软件”将目标文件下载到ISP-4实验开发板上的AT89S51单片机芯片,观察程序运行结果。

  4.1.4 相关知识

  在前面的程序中,我们经常可以看到ORG、END这样的东西,但是从我们已经学完了51单片机的基本指令中,根本找不到它们。它们到底是什么呢?原来在单片机中,除了指令外还有伪指令。

  1. 什么是伪指令?有哪些常用伪指令?

  随着单片机的广泛应用和开发以装置功能的不断完善与发展,汇编语言源程序都借助系统机(PC等)进行编辑、汇编和调试。因此,在编制汇编语言源程序时,常需应用伪指令。伪指令又称汇编程序控制译码指令,属说明性汇编指令。“伪”字体现在汇编时不产生机器指令代码,不影响程序的执行,仅产生供汇编时用的某些命令,在汇编时执行某些特殊操作。

  不同的单片机及其开发装置所定义的伪指令不全相同。下面介绍几种常用的伪指令。

  (1) 为标号赋值伪指令

  ① 标号等值伪指令——EQU

  格式:〈标号:〉EQU〈表达式〉

  指令的含义为本语句的标号等值于表达式,亦即将表达式值赋予标号。这里的标号和表达式是必不可少的。

  例如:

  TTY: EQU 1080H

  本语句向汇编程序指明,标号TTY已于前句赋值为1080H,则相当于TTY=1080H。用EOU语句给一个标号赋值以后,在整个源程序中该标号的值是固定而不能更改的。

  ② 定义标号值伪指令——DATA

  格式:〈标号:〉DATA〈表达式〉

  其含义是定义该标号的值为表达式值,同样,标号和表达式是不可缺少的。

  例如:

  COUNT1: DATA 2300H   ;定义COUNT1=2300H

  COUNT2: DATA COUNT1+1  ;定义COUNT2=2300H+1

  由上可见,DATA和EQU的功能都是将表达成值赋给标号,但两者有区别,用DATA语句赋值的标号可以先用后定义,而用EQU语句赋值的标号,必须先定义后使用。

  (2) 数据存储说明伪指令

  数据存储说明伪指令的作用是将数据存储在程序存储器单元中。

  ① 定义字节数据伪指令——DB或DEGB

  格式:〈标号:〉DB〈表达式或表达式串〉

  式中表达式或表达式串是指一个字节或用逗号隔开的一个字节数据。其含义是将表达式或表达式串所指定的字节数据存入从标号开始的连续存储单元中。标号为可选项,它表示数据存入程序存储器的起始地址。例如:

  HERE:DB 56H ;将数据56H存入HERE所指示的单元中

  DB OA7H

  再如:

  SECON:DB02H,36H,74H,0B4H,OFFH,…

  上述语句表示将字节数据串按顺序存篇幅 标号SECON所指示的地址为起始顺序存储单元中。

  作为本语句操作数控部分的表达式或表达式串,可以是数据表达式、ASCII码字符串、字节数据,字节数据串(其字节串长度限制在80B的数据内)。

  ② 定义字数据伪指令——DW或DEFW

  格式:〈标号:〉DW〈表达式或表达式串〉

  本语句的含义是将作为操作部分的字数据(2B)或字数据串存入由标号指定的首地址按顺序连续单元中,定义字为为双字节的数据。在执行汇编时,计算机会自动按高位字节在前、低位字节在后的顺序格式存入程序存储器单元中,例如:

  ABC:DW 1234H,4567H,0A5C4H,…

  汇编执行时第一个字节的12H存入标号ABC所指示的存储单元,34H存入(ABC)+1单元中,其余按此顺序将后续字节数据存入对应的存储单元中,如标号ABC定义为1000H,则上例汇编后:(1000H)=12H,(1001H)=34H,(1002H)=45H,…。

  (3) 存储区说明伪指令——DS

  格式:〈标号:〉DS〈表达式〉

  其含义是以标号的值为首地址保留表达式所指定的若干存储单元空间作为备用。例如:

  BASE:DS 0100H

  汇编后,程序存储器从标号BASE为首地址开始,空出256个存储单元,以备另用。

  (4) 程序起始地址伪指令——ORG

  格式:ORG〈表达式〉

  其含义是指定下面目标程序的起始地址为表达式值。表达式常为一个双字节地址数。

  例如:

  ORG 0100H

  START: MOV A,#00H

  汇编号,从START开始的目标程序,其起始地址从0100H开始。由于表达式0100H是立即型地址码所以隐含地指明该程序段属绝对地址段。

  一个源程序中,可能有多处设置程序段起始地址,因此定义地址空间应从低地址端向高地址设置,不能重叠,否则将出错。若程序段前无ORG伪指令,则汇编后的目标程序将从0000H地址开始或紧接前段程序后。若表达式为浮动程序段中定义过的标号,则由该标号定义的目标程序段首地址也将之浮动。

  (5) 汇编结束伪指令——END

  END伪指令是汇编语言源程序结束为标志。源程序在汇编过程中执行完END伪指令,即结束伪指令,为调试方便,可根据调试需要而设置。它有两种格式:

  格式1:〈标号:〉END〈表达式〉

  格式2:〈标号:〉END

  或者 END

  其中标号不是必需的,有无表达式的区别在于前者在汇编结束后立即转向由表达式指定的起始地址开始执行程序。因此,只需在程序运行的入口处和END后的表达式以同一个标号设置,当汇编完源程序后就自动转向由标号指定的入口处开始执行。表达式也可以入口入的绝对地址,后者则汇编结束后立即停机。