文档库 最新最全的文档下载
当前位置:文档库 › 单片机汇编语言程序编程规范

单片机汇编语言程序编程规范

单片机汇编语言程序编程规范
单片机汇编语言程序编程规范

引言

软件设计更多地是一种工程,而不是一种个人艺术。如果不统一编程规范,最终写出的程序,其可读性将较差,这不仅给代码的理解带来障碍,增加维护阶段的工作量,同时不规范的代码隐含错误的可能性也比较大。

分析表明,编码阶段产生的错误当中,语法错误大概占20%左右,而由于未严格检查软件逻辑导致的错误、函数(模块)之间接口错误及由于代码可理解度低导致优化维护阶段对代码的错误修改引起的错误则占了一半以上。

可见,提高软件质量必须降低编码阶段的错误率。如何有效降低编码阶段的错误呢?这需要制定详细的软件编程规范,并培训每一位程序员,最终的结果可以把编码阶段的错误降至10%左右,同时也降低了程序的测试费用,效果相当显著。

本文从代码的可维护性(可读性、可理解性、可修改性)、代码逻辑与效率、函数(模块)接口、可测试性四个方面阐述了软件编程规范,规范分成规则和建议两种,其中规则部分为强制执行项目,而建议部分则不作强制,可根据习惯取舍。

1.排版

规则1

程序块使用缩进方式,函数和标号使用空格缩进,程序段混合使用TAB和空格缩进。缩进的目的是使程序结构清晰,便于阅读和理解。

默认宽度应为8个空格,由于Word中为4个空格,为示范清晰,此处用2个代替(下同)。例如:

MOV R1, #00H

MOV R2, #00H

MOV PMR, #PMRNORMAL

MOV DPS, #FLAGDPTR

MOV DPTR, #ADDREEPROM

read1kloop:

read1kpage:

INC R1

MOVX A, @DPTR

MOV SBUF, A

JNB TI, $

CLR TI

INC DPTR

CJNE R1, #20H, read1kpage

INC R2

MOV R1, #00H

CPL WDI

CJNE R2, #20H, read1kloop ;END OF EEPROM

规则2

在指令的操作数之间的,使用空格进行间隔,采用这种松散方式编写代码的目的是使代码更加清晰。

例如:

CJNE R2, #20H, read1kloop ;END OF EEPROM

规则3

一行最多写一条语句。

规则4

变量定义时,保持对齐。便于阅读和检查内存的使用情况。

例如:

RegLEDLOSS EQU 30H ; V ARIABLE ; TESTLED==RegLEDLOSS.0

RegLEDRA EQU 31H ; V ARIABLE

RUNLED_Flag EQU 32H ; V ARIABLE ; 256ms改变一次RUNLED状态

RUNLED_Def EQU 10H ; STA TIC ; 16*32ms=500ms改变一次LED状态

2.注释

注释的原则是有助于对程序的阅读理解,注释不宜太多也不能太少,太少不利于代码理解,太多则会对阅读产生干扰,因此只在必要的地方才加注释,而且注释要准确、易懂、尽可能简洁。注释量一般控制在30%到50%之间。

规则1

程序在必要的地方必须有注释,注释要准确、易懂、简洁。

例如如下注释意义不大:

MOV DXCE1COUNTER, #00H ; 将DXCE1COUNTER赋值为0 而如下的注释则给出了额外有用的信息:

JNZ PcComm_Err ; 假如校验出错

规则2

注释应与其描述的代码相近,对代码的注释应放在其上方或右方(对单条语句的注释)相邻位置,不可放在下面,如放于上方则需与其上面的代码用空行隔开。

规则3

头文件、源文件的头部,应进行注释。注释必须列出:文件名、作者、目的、功能、修改日志等。

规则4

函数头部应进行注释,列出:函数的目的、功能、输入参数、输出参数、涉及到的通用变量

和寄存器、调用的其他函数和模块、修改日志等。对一些复杂的函数,在注释中最好提供典型用法。

规则5

对重要代码段的功能、意图进行注释,提供有用的、额外的信息。并在该代码段的结束处加一行注释表示该段代码结束。

规则6

对于所有的常量,变量,数据结构声明(包括数组、结构、类、枚举等),如果其命名不是充分自注释的,在声明时都必须加以注释,说明其含义。

规则7

维护代码时,要更新相应的注释,删除不再有用的注释。保持代码、注释的一致性,避免产生误解。

3.命名

规则1

标识符缩写

形成缩写的几种技术:

1) 去掉所有的不在词头的元音字母。如screen写成scrn, primtive写成prmv。

2) 使用每个单词的头一个或几个字母。如Channel Activation写成ChanActiv,Release Indication写成RelInd。

3) 使用变量名中每个有典型意义的单词。如Count of Failure写成FailCnt。

4) 去掉无用的单词后缀ing, ed等。如Paging Request写成PagReq。

5) 使用标准的或惯用的缩写形式(包括协议文件中出现的缩写形式)。如BSIC(Base Station Identification Code)、MAP(Mobile Application Part)。

关于缩写的准则:

1) 缩写应该保持一致性。如Channel不要有时缩写成Chan,有时缩写成Ch。Length有时缩写成Len,有时缩写成len。

2) 在源代码头部加入注解来说明协议相关的、非通用缩写。

3) 标识符的长度不超过12个字符。

规则2

变量命名约定:<前缀> + 主体; 注释

变量命名要考虑简单、直观、不易混淆。

前缀是可选项,表示变量类型,由于汇编中变量多是单字节变量,所以单字节变量可以不加前缀,对于bit和双字节型变量,使用小写的b和d作为前缀表示。

主体是必选项,可多个单词(或缩写)合在一起,每个单词首字母大写,其余部分小写。

规则3

常量的命名

常量的命名规则:单词的字母全部大写,各单词之间用下划线隔开。

函数的命名

单词首字母为大写,其余均为小写。函数名应以一个动词开头,即函数名应类似一个动词断语或祈使句。

例如:Test_Protect,Check_EEPROM,Init_Para

4.可维护性

规则1

函数和过程中关系较为紧密的代码尽可能相邻。

规则2

每个函数的源程序行数原则上应该少于200行。

对于消息分流处理函数,完成的功能统一,但由于消息的种类多,可能超过200行的限制,不属于违反规定。

规则3

语句嵌套层次不得超过5层。

嵌套层次太多,增加了代码的复杂度及测试的难度,容易出错,增加代码维护的难度。

规则4

避免相同的代码段在多个地方出现。

当某段代码需在不同的地方重复使用时,应根据代码段的规模大小使用函数调用或宏调用的方式代替。这样,对该代码段的修改就可在一处完成,增强代码的可维护性。

规则5

每个函数完成单一的功能,不设计多用途面面俱到的函数。

多功能集于一身的函数,很可能使函数的理解、测试、维护等变得困难。使函数功能明确化,增加程序可读性,亦可方便维护、测试。

规则6

在函数的项目维护文档中,应该指出软件适用的硬件平台及版本。

建议1

使用专门的初始化函数对所有的公共变量进行初始化。

5.程序正确性、效率

规则1

严禁使用未经初始化的变量。

引用未经初始化的变量可能会产生不可预知的后果,特别是引用未经初始化的指针经常会导致系统崩溃,需特别注意。

防止内存操作越界。

说明:内存操作越界是软件系统主要错误之一,后果往往非常严重。

规则3

注意变量的有效取值范围,防止表达式出现上溢或下溢。

规则4

防止易混淆的指令和操作数拼写错误。

规则5

避免函数中不必要语句,防止程序中的垃圾代码,预留代码应以注释的方式出现。

程序中的垃圾代码不仅占用额外的空间,而且还常常影响程序的功能与性能,很可能给程序的测试、维护等造成不必要的麻烦。

规则6

通过对系统数据结构的划分与组织的改进,以及对程序算法的优化来提高空间效率。

这种方式是解决软件空间效率的根本办法。

规则7

循环体内工作量最小化。

应仔细考虑循环体内的语句是否可以放在循环体之外,使循环体内工作量最小,从而提高程序的时间效率。

规则8

在多重循环中,应将最忙的循环放在最内层。

规则9

避免循环体内含判断语句,将与循环变量无关的判断语句移到循环体外。

目的是减少判断次数。循环体中的判断语句是否可以移到循环体外,要视程序的具体情况而言,一般情况,与循环变量无关的判断语句可以移到循环体外,而有关的则不可以。

规则10

中断和恢复

中断程序应该尽量短,应该在中断中进行标记,在主程序中处理。但实时性很高的程序段例外。

中断时应该保存所有涉及到的通用变量和寄存器,如A, PSW, DPTR等。

规则11

堆栈设置

堆栈对于程序非常重要,对于堆栈的设置要合理。堆栈太小,在嵌套调用和很容易溢出,造成系统故障;堆栈太大,浪费RAM资源。

为了节约堆栈资源,中断时要求不要保存太多资源,中断嵌套和程序嵌套层数不要太多,尽量不要超过5层。这就要求合理的划分功能模块。

规则12

看门狗

看门狗电路用于在单片机死机时自动复位。单片机需要定时向看门狗发送脉冲,俗称”喂狗”。喂狗不可太勤,这样看门狗没有起到作用;也不可太慢,这样容易造成单片机复位。正确的喂狗应该在主循环中进行,最好是建立一个独立的系统监控进程。不可以在定时中断中喂狗,应为单片机有时可能会在主循环中死掉。

6.接口

规则1

去掉没有必要的公共变量,编程时应尽量少用公共变量。

公共变量是增大模块间耦合的原因之一,故应减少没必要的公共变量以降低模块间的耦合度。应该构造仅有一个模块或函数可以修改、创建,而其余有关模块或函数只访问的公共变量,防止多个不同模块或函数都可以修改、创建同一公共变量的现象。

规则2

当向公共变量传递数据时,要防止越界现象发生。

对公共变量赋值时,若有必要应进行合法性检查,以提高代码的可靠性、稳定性。

规则3

尽量不设计多参数函数,将不使用的参数从接口中去掉,降低接口复杂度,减少函数间接口的复杂度。

规则4

对所调用函数的返回码要仔细、全面地处理。

防止把错误传递到后面的处理流程。如有意不检查其返回码,应明确指明。

规则5

检查接口函数所有输入参数的有效性。

规则6

检查函数的所有非参数输入,如外部数据、公共变量等。

7.代码可测性

规则1

模块编写应该有完善的测试方面的考虑。

规则2

源代码中应该设计了代码测试的内容。

在编写代码之前,应预先设计好程序调试与测试的方法和手段,并设计好各种调测开关及相应测试代码。

程序的调试与测试是软件生存周期中很重要的一个阶段,如何对软件进行较全面、高率的测

试并尽可能地找出软件中的错误就成为很关键的问题。因此在编写源代码之前,除了要有一套比较完善的测试计划外,还应设计出一系列代码测试手段,为单元测试、集成测试及系统联调提供方便。

规则3

在同一项目组或产品组内,要有一套统一的为集成测试与系统联调准备的调测开关及相应函数,并且要有详细的说明。本规则是针对项目组或产品组的。

规则4

在同一项目组或产品组内,调测打印出的信息串的格式要有统一的形式。信息串中至少要有所在模块名(或源文件名)及行号。

统一的调测信息格式便于集成测试。

规则5

正式软件产品中应把调测代码去掉(即把有关的调测开关关掉)。

规则6

用调测开关来切换软件的DEBUG版和正式版,而不要同时存在正式版本和DEBUG版本的不同源文件,以减少维护的难度。

规则7

在软件系统中设置与取消有关测试手段,不能对软件实现的功能等产生影响。

即有测试代码的软件和关掉测试代码的软件,在功能行为上应一致。

规则8

发现错误应该立即修改,并且若有必要记录下来。

规则9

开发人员应坚持对代码进行彻底的测试(单元测试),而不依靠他人或测试组来发现问题。

规则10

清理、整理或优化后的代码要经过审查及测试。

规则11

代码版本升级要经过严格测试。

8.代码编译

规则1

打开编译器的所有告警开关对程序进行编译。

防止隐藏可能是错误的告警。

规则2

某些语句经编译后产生告警,但如果你认为它是正确的,那么应通过某种手段去掉告警信息。

ps:从网上收集了一些相关内容,结合我自己的经验,欢迎拍砖,谢绝辱骂;

ps2:有些可能不常用,因为大家写不到那么长的代码,就我自己写的最长的汇编代码也不超过10K行;

?硅谷芯微为莘莘学子提供全日制、在职嵌入式工程师技术培训,地处深圳市国家级高新科技产业园区内,配套设施齐全,实力有保障,欢迎来电咨询!

?嵌入式工程师就业年薪保底5万,企业紧缺人才,行业需求巨大!

?硅谷芯微与学员签订培训合同,充分保障教学质量!

?硅谷芯微外非深圳学员提供住宿、全日制自习室、全日制工程师指导的贴心服务!

?大专以上学历通过入学咨询皆可报名!

?开设课程:单片机、嵌入式、ARM、Linux、Android、iphone、PCB设计

?联系方式:0755-********,0755-********

咨询QQ:851022781、54068518

?官方网站:https://www.wendangku.net/doc/3714181952.html,

(完整版)快速入门单片机汇编语言

快速入门单片机汇编语言 简要: 单片机有通用型和专用型之分。专用型是厂家为固定程序的执行专门开发研制的一种单片机,其程序不可更改。通用型单片机是常用的一种供学习或自主编制程序的单片机,其程序需要自己写入,可更改。单片机根据其基本操作处理位数不同可以分为:1位、4位、8位、16、32位单片机。 正文: 在此我们主要讲解美国ATMEL公司的89C51单片机。 一、89C51单片机PDIP(双列直插式)封装引脚图: 其引脚功能如下: P0口(p0.0—p0.7):为双向三态口,可以作为输入/输出口。但在实际应用中通常作为地址/数据总线口,即为低8位地址/数据总线分时复用。低8位地址在ALE信号的负跳变锁存到外部地址锁存器中,而高8位地址由P2口输出。 P1口(p1.0—p1.7):其每一位都能作为可编程的输入或输出线。 P2口(p2.0—p2.7):每一位也都可作为输入或输出线用,当扩展系统外设时,可作为扩展系统的地址总线高8位,与P0口一起组成16位地址总线。对89c51单片机来说,P2口一般只作为地址总线使用,而不作为I/O线直接与外设相连。 P3口(p3.0—p3.7):其为双功能口,作为第一功能使用时,其功能与P1口相同。当作为第二功能使用时,每一位功能如下表所示。 Rst\Vpd:上电复位端和掉电保护端。 XTAL1(xtal2):外接晶振一脚,分别接晶振的一端。 Gnd:电源地。 Vcc:电源正级,接+5V。 PROG\ALE:地址锁存控制端 PSEN:片外程序存储器读选通信号输出端,低电平有效。 EA\vpp:访问外部程序储存器控制信号,低电平有效。当EA为高电平时访问片内存储器,若超出范围则自动访问外部程序存储器。当为低电平时只访问外部程序存储器。 二、常用指令及其格式介绍: 1、指令格式: [标号:]操作码 [ 目的操作数][,操作源][;注释]

51单片机汇编程序范例

16位二进制数转换成BCD码的的快速算法-51单片机2010-02-18 00:43在做而论道上篇博文中,回答了一个16位二进制数转换成BCD码的问题,给出了一个网上广泛流传的经典转换程序。 程序可见: http: 32.html中的HEX2BCD子程序。 .说它经典,不仅是因为它已经流传已久,重要的是它的编程思路十分清晰,十分易于延伸推广。做而论道曾经利用它的思路,很容易的编写出了48位二进制数变换成16位BCD码的程序。 但是这个程序有个明显的缺点,就是执行时间太长,转换16位二进制数,就必须循环16遍,转换48位二进制数,就必须循环48遍。 上述的HEX2BCD子程序,虽然长度仅仅为26字节,执行时间却要用331个机器周期。.单片机系统多半是用于各种类型的控制场合,很多时候都是需要“争分夺秒”的,在低功耗系统设计中,也必须考虑因为运算时间长而增加系统耗电量的问题。 为了提高整机运行的速度,在多年前,做而论道就另外编写了一个转换程序,程序的长度为81字节,执行时间是81个机器周期,(这两个数字怎么这么巧!)执行时间仅仅是经典程序的!.近来,在网上发现了一个链接: ,也对这个经典转换程序进行了改进,话是说了不少,只是没有实质性的东西。这篇文章提到的程序,一直也没有找到,也难辩真假。 这篇文章好像是选自某个著名杂志,但是在术语的使用上,有着明显的漏洞,不像是专业人员的手笔。比如说文中提到的:

“使用51条指令代码,但执行这段程序却要耗费312个指令周期”,就是败笔。51条指令代码,真不知道说的是什么,指令周期是因各种机型和指令而异的,也不能表示确切的时间。 .下面说说做而论道的编程思路。;----------------------------------------------------------------------- ;已知16位二进制整数n以b15~b0表示,取值范围为0~65535。 ;那么可以写成: ; n = [b15 ~ b0] ;把16位数分解成高8位、低8位来写,也是常见的形式: ; n = [b15~b8] * 256 + [b7~b0] ;那么,写成下列形式,也就可以理解了: ; n = [b15~b12] * 4096 + [b11~b0] ;式中高4位[b15~b12]取值范围为0~15,代表了4096的个数; ;上式可以变形为: ; n = [b15~b12] * 4000 + {[b15~b12] * (100 - 4) + [b11~b0]} ;用x代表[b15~b12],有: ; n =x * 4000 + {x * (100 - 4) + [b11~b0]} ;即: ; n =4*x (千位) + x (百位) + [b11~b0] - 4*x ;写到这里,就可以看出一点BCD码变换的意思来了。 ;;上式中后面的位:

51单片机汇编指令集(附记忆方法)

51单片机汇编指令集 一、数据传送类指令(7种助记符) MOV(英文为Move):对内部数据寄存器RAM和特殊功能寄存器SFR的数据进行传送; MOVC(Move Code)读取程序存储器数据表格的数据传送; MOVX (Move External RAM) 对外部RAM的数据传送; XCH (Exchange) 字节交换; XCHD (Exchange low-order Digit) 低半字节交换; PUSH (Push onto Stack) 入栈; POP (Pop from Stack) 出栈; 二、算术运算类指令(8种助记符) ADD(Addition) 加法; ADDC(Add with Carry) 带进位加法; SUBB(Subtract with Borrow) 带借位减法; DA(Decimal Adjust) 十进制调整; INC(Increment) 加1; DEC(Decrement) 减1; MUL(Multiplication、Multiply) 乘法; DIV(Division、Divide) 除法; 三、逻辑运算类指令(10种助记符) ANL(AND Logic) 逻辑与; ORL(OR Logic) 逻辑或; XRL(Exclusive-OR Logic) 逻辑异或; CLR(Clear) 清零; CPL(Complement) 取反; RL(Rotate left) 循环左移; RLC(Rotate Left throught the Carry flag) 带进位循环左移; RR(Rotate Right) 循环右移; RRC (Rotate Right throught the Carry flag) 带进位循环右移; SWAP (Swap) 低4位与高4位交换; 四、控制转移类指令(17种助记符) ACALL(Absolute subroutine Call)子程序绝对调用; LCALL(Long subroutine Call)子程序长调用; RET(Return from subroutine)子程序返回; RETI(Return from Interruption)中断返回; SJMP(Short Jump)短转移; AJMP(Absolute Jump)绝对转移; LJMP(Long Jump)长转移; CJNE (Compare Jump if Not Equal)比较不相等则转移;

51单片机实用汇编程序库(word)

51 单片机实用程序库 4.1 流水灯 程序介绍:利用P1 口通过一定延时轮流产生低电平 输出,以达到发光二极管轮流亮的效果。实际应用中例如:广告灯箱彩灯、霓虹灯闪烁。 程序实例(LAMP.ASM) ORG 0000H AJMP MAIN ORG 0030H MAIN: 9 MOV A,#00H MOV P1,A ;灭所有的灯 MOV A,#11111110B MAIN1: MOV P1,A ;开最左边的灯 ACALL DELAY ;延时 RL A ;将开的灯向右边移 AJMP MAIN ;循环 DELAY: MOV 30H,#0FFH D1: MOV 31H,#0FFH D2: DJNZ 31H,D2 DJNZ 30H,D1 RET END 4.2 方波输出 程序介绍:P1.0 口输出高电平,延时后再输出低电 平,循环输出产生方波。实际应用中例如:波形发生器。 程序实例(FAN.ASM): ORG 0000H MAIN: ;直接利用P1.0 口产生高低电平地形成方波////////////// ACALL DELAY SETB P1.0 ACALL DELAY 10 CLR P1.0 AJMP MAIN ;////////////////////////////////////////////////// DELAY: MOV R1,#0FFH DJNZ R1,$ RET

五、定时器功能实例 5.1 定时1 秒报警 程序介绍:定时器1 每隔1 秒钟将p1.o 的输出状态改变1 次,以达到定时报警的目的。实际应用例如:定时报警器。程序实例(DIN1.ASM): ORG 0000H AJMP MAIN ORG 000BH AJMP DIN0 ;定时器0 入口 MAIN: TFLA G EQU 34H ;时间秒标志,判是否到50 个 0.2 秒,即50*0.2=1 秒 MOV TMOD,#00000001B;定时器0 工作于方式 1 MOV TL0,#0AFH MOV TH0,#3CH ;设定时时间为0.05 秒,定时 20 次则一秒 11 SETB EA ;开总中断 SETB ET0 ;开定时器0 中断允许 SETB TR0 ;开定时0 运行 SETB P1.0 LOOP: AJMP LOOP DIN0: ;是否到一秒//////////////////////////////////////// INCC: INC TFLAG MOV A,TFLAG CJNE A,#20,RE MOV TFLAG,#00H CPL P1.0 ;////////////////////////////////////////////////// RE: MOV TL0,#0AFH MOV TH0,#3CH ;设定时时间为0.05 秒,定时 20 次则一秒 RETI END 5.2 频率输出公式 介绍:f=1/t s51 使用12M 晶振,一个周期是1 微秒使用定时器1 工作于方式0,最大值为65535,以产生200HZ 的频率为例: 200=1/t:推出t=0.005 秒,即5000 微秒,即一个高电

51单片机汇编语言

51单片机汇编语言 a)单个与多个LED灯,位操作与字节操作—输出 ORG 0000H START: CLR C MOV P0.0,C MOV P1.1,C MOV P2.2,C MOV P3.3,C CLR A

CPL A MOV P0,A MOV P1,A MOV P2,A MOV P3,A END 程序说明: 可以用7段数码管来代替各端口的8个LED灯,硬件的这种显示方式使得数字表达成为实用。数字显示由数码管的硬件结构与工作原理(7个LED灯的几何变形组合)和数字表达的数据格式确定。 如: 共阳极数码管显示数字3,则有P1口送数据#4FH;MOVP1, #0B0H 共阴极数码管显示数字8,则有P1口送数据#80H;MOVP1, #7F H 用数据表表示则有: TABshuziyang: //阳极管(共阴极管取反即可) DB(数字0~F) C0H,F9H,A4H,B0H,99H,92H,82H,F8H,80H,90H,88H,83H,C 6H,A1H,86H,8EH

TABshuziyin: //阴极管(共阳极管取反即可) DB(数字0~F) 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH,77H,7CH,3 9H,5EH,79H,71H b)单个与多个LED灯闪烁—延时子程序—注意定时器 前边已经看到,通过改变位或字节的赋值,可以使得LED灯亮或灭,以此形成闪烁效果。但是硬件的响应时间太短,使得效果不佳。虽然可以通过改变单片机的时钟设置来改变效果。但时钟的改变极其不方便,因此需要利用延时指令(注意定时器功能)获得理想的效果。延时效果是利用单片机空转来实现的。 ACALLDELAY;调延时子程序 ************************************************* ************************

快速入门单片机汇编语言

快速入门单片机汇编语 言 文档编制序号:[KKIDT-LLE0828-LLETD298-POI08]

快速入门单片机汇编语言 简要: 单片机有通用型和专用型之分。专用型是厂家为固定程序的执行专门开发研制的一种单片机,其程序不可更改。通用型单片机是常用的一种供学习或自主编制程序的单片机,其程序需要自己写入,可更改。单片机根据其基本操作处理位数不同可以分为:1位、4位、8位、16、32位单片机。 正文: 在此我们主要讲解美国ATMEL公司的89C51单片机。 一、89C51单片机PDIP(双列直插式)封装引脚图: 其引脚功能如下: P0口(—):为双向三态口,可以作为输入/输出口。但在实际应用中通常作为地址/数据总线口,即为低8位地址/数据总线分时复用。低8位地址在ALE信号的负跳变锁存到外部地址锁存器中,而高8位地址由P2口输出。 P1口(—):其每一位都能作为可编程的输入或输出线。 P2口(—):每一位也都可作为输入或输出线用,当扩展系统外设时,可作为扩展系统的地址总线高8位,与P0口一起组成16位地址总线。对89c51单片机来说,P2口一般只作为地址总线使用,而不作为I/O线直接与外设相连。 P3口(—):其为双功能口,作为第一功能使用时,其功能与P1口相同。当作为第二功能使用时,每一位功能如下表所示。 P3口第二功能

Rst\Vpd:上电复位端和掉电保护端。 XTAL1(xtal2):外接晶振一脚,分别接晶振的一端。 Gnd:电源地。 Vcc:电源正级,接+5V。 PROG\ALE:地址锁存控制端 PSEN:片外程序存储器读选通信号输出端,低电平有效。 EA\vpp:访问外部程序储存器控制信号,低电平有效。当EA为高电平时访问片内存储器,若超出范围则自动访问外部程序存储器。当EA为低电平时只访问外部程序存储器。 二、常用指令及其格式介绍: 1、指令格式: [标号:]操作码 [ 目的操作数][,操作源][;注释] 例如:LOOP:ADD A,#0FFH ;(A)←(A)+FFH 2、常用符号: Ri和Rn:R表示工作寄存器,i表示1和0,n表示0~7。 rel:相对地址、地址偏移量,主要用于无条件相对短转移指令和条件转移指令。 #data:包含于指令中的8位立即数。 #data16:包含于指令中的16位立即数。

单片机控制系统汇编程序

; step motor control ; ASM for MCS51 mode equ 082h contrl equ 08003h ctl equ 08000h ;8255接口芯片PA口的地址值 Astep equ 01h ;对A相通电,PA口的赋值 Bstep equ 02h ;对B相通电,PA口的赋值 Cstep equ 04h ;对C相通电,PA口的赋值 Dstep equ 08h ;对D相通电,PA口的赋值 dly_c equ 10h ;启动初值(加速度)寄存器 sd1 equ 80 ;0--255 加速度初值:值越小,加速越快 sd2 equ 40 ;

51单片机中的汇编语言与C语言.

51单片机中的汇编语言与 C 语言 C 语言, 更多的是为了掌握单片机的应用, C 语言是高效的应用程序开发工具, 与汇编语言比却不是开发高效应用程序的工具。就目前而言, 更多的是为了应用单片机, 开发应用程序, 更多的是强调开发效率, 而不是程序的运行效率 (相对而言。再就是应用程序对单片机内部资源的使用效率, 这在过去, 单片机内部资源紧缺的年代, 特别的强调, 现在已经不是特别重要了。所以, 大多数人都认为,只用 C 语言,就可以应对大多数单片机的应用开发了。 其实,汇编语言跟 C 语言在本质上一样的,只是语言形式不同而已,一个接近底层逻辑, 一个接近人类语言, 本质上都是对寄存器或存储器的读写操作而已。 汇编语言中,用 MOV 来回传送数据, C 语言里,用等号表示数据传送。汇编语言中,用 call 转去执行子过程程序, C 语言里,用个函数名调用子程序。汇编语言中,用 JMP 完成分支转移, C 语言里用 if 、 switch 、 while 、 for 来判断跳转。汇编语言跟 C 一样可以给寄存器指定命名,然后对定义的名称进行操作。汇编语言提供了对很多标志位的操作, C51根据需要也进行了改进, C 语言可以通过 #include给存储器命名来简化操作。 我觉得, C 语言是最接近汇编语言的一种高级语言, 要说不同, 也许具有大量函数的函数库,是 C 语言与汇编语言的最大区别,也是 C 语言比汇编语言有更大开发效率的原因。 在应用汇编语言进行应用程序开发时, 如果精心规划好程序结构, 设计好各种数据结构、子程序、中断程序,积累大量的算法程序(相当于函数库,也可以高效率的用汇编语言进行单片机开发。倒是兼容性、可移植性是汇编语言的最大限制,因为不同单片机有不同的指令系统,而 C 语言把这个问题,交给了机器也就是编译器去解决了。其实, 计算机的发展, 就是把尽可能多的事情交个机器去解决。

单片机汇编语言指令集

汇编语言的所有指令数据传送指令集 MOV 功能: 把源操作数送给目的操作数 语法: MOV 目的操作数,源操作数 格式: MOV r1,r2 MOV r,m MOV m,r MOV r,data XCHG 功能: 交换两个操作数的数据 语法: XCHG 格式: XCHG r1,r2 XCHG m,r XCHG r,m PUSH,POP 功能: 把操作数压入或取出堆栈 语法: PUSH 操作数POP 操作数 格式: PUSH r PUSH M PUSH data POP r POP m PUSHF,POPF,PUSHA,POPA 功能: 堆栈指令群 格式: PUSHF POPF PUSHA POPA LEA,LDS,LES 功能: 取地址至寄存器 语法: LEA r,m LDS r,m LES r,m XLAT(XLATB) 功能: 查表指令 语法: XLAT XLAT m 算数运算指令 ADD,ADC 功能: 加法指令 语法: ADD OP1,OP2 ADC OP1,OP2 格式: ADD r1,r2 ADD r,m ADD m,r ADD r,data 影响标志: C,P,A,Z,S,O SUB,SBB 功能:减法指令 语法: SUB OP1,OP2 SBB OP1,OP2 格式: SUB r1,r2 SUB r,m SUB m,r SUB r,data SUB m,data 影响标志: C,P,A,Z,S,O

INC,DEC 功能: 把OP的值加一或减一 语法: INC OP DEC OP 格式: INC r/m DEC r/m 影响标志: P,A,Z,S,O NEG 功能: 将OP的符号反相(取二进制补码) 语法: NEG OP 格式: NEG r/m 影响标志: C,P,A,Z,S,O MUL,IMUL 功能: 乘法指令 语法: MUL OP IMUL OP 格式: MUL r/m IMUL r/m 影响标志: C,P,A,Z,S,O(仅IMUL会影响S标志) DIV,IDIV 功能:除法指令 语法: DIV OP IDIV OP 格式: DIV r/m IDIV r/m CBW,CWD 功能: 有符号数扩展指令 语法: CBW CWD AAA,AAS,AAM,AAD 功能: 非压BCD码运算调整指令 语法: AAA AAS AAM AAD 影响标志: A,C(AAA,AAS) S,Z,P(AAM,AAD) DAA,DAS 功能: 压缩BCD码调整指令 语法: DAA DAS 影响标志: C,P,A,Z,S 位运算指令集 AND,OR,XOR,NOT,TEST 功能: 执行BIT与BIT之间的逻辑运算 语法: AND r/m,r/m/data OR r/m,r/m/data XOR r/m,r/m/data TEST r/m,r/m/data NOT r/m 影响标志: C,O,P,Z,S(其中C与O两个标志会被设为0) NOT指令不影响任何标志位 SHR,SHL,SAR,SAL 功能: 移位指令 语法: SHR r/m,data/CL SHL r/m,data/CL SAR r/m,data/CL SAL r/m,data/CL

单片机汇编语言经典一百例

51单片机实用程序库 4.1 流水灯 程序介绍:利用P1 口通过一定延时轮流产生低电平 输出,以达到发光二极管轮流亮的效果。实际应用中例如:广告灯箱彩灯、霓虹灯闪烁。 程序实例(LAMP.ASM) ORG 0000H AJMP MAIN ORG 0030H MAIN: 9 MOV A,#00H MOV P1,A ;灭所有的灯 MOV A,#11111110B MAIN1: MOV P1,A ;开最左边的灯 ACALL DELAY ;延时 RL A ;将开的灯向右边移 AJMP MAIN ;循环 DELAY:

MOV 30H,#0FFH D1: MOV 31H,#0FFH D2: DJNZ 31H,D2 DJNZ 30H,D1 RET END 4.2 方波输出 程序介绍:P1.0 口输出高电平,延时后再输出低电 平,循环输出产生方波。实际应用中例如:波形发生器。 程序实例(FAN.ASM): ORG 0000H MAIN: ;直接利用P1.0口产生高低电平地形成方波////////////// ACALL DELAY SETB P1.0 ACALL DELAY 10 CLR P1.0 AJMP MAIN ;////////////////////////////////////////////////// DELAY: MOV R1,#0FFH

DJNZ R1,$ RET END 五、定时器功能实例 5.1 定时1秒报警 程序介绍:定时器1每隔1秒钟将p1.o的输出状态改变1 次,以达到定时报警的目的。实际应用例如:定时报警器。程序实例(DIN1.ASM): ORG 0000H AJMP MAIN ORG 000BH AJMP DIN0 ;定时器0入口 MAIN: TFLA G EQU 34H ;时间秒标志,判是否到50个 0.2秒,即50*0.2=1秒 MOV TMOD,#00000001B;定时器0工作于方式 1 MOV TL0,#0AFH MOV TH0,#3CH ;设定时时间为0.05秒,定时 20次则一秒 11 SETB EA ;开总中断

基于汇编语言的单片机led点阵显示(含c)

8X8 LED点阵显示技术 在8X8LED点阵上显示柱形,让其先从左到右平滑移动三次,其次从右到左平滑移动三次,再次从上到下平滑移动三次,最后从下到上平滑移动三次,如此循环下去。 电路原理图 图4.24.1 硬件电路连线

(1).把“单片机系统”区域中的P1端口用8芯排芯连接到“点阵模块” 区域中的“DR1-DR8”端口上; (2).把“单片机系统”区域中的P3端口用8芯排芯连接到“点阵模块” 区域中的“DC1-DC8”端口上; 程序设计容 (1).8X8点阵LED工作原理说明 8X8点阵LED结构如下图所示

从图4.24.2中可以看出,8X8点阵共需要64个发光二极管组成,且每个发光二极管是放置在行线和列线的交叉点上,当对应的某一列置1电平,某一行置0电平,则相应的二极管就亮;因此要实现一根柱形的亮法,如图49所示,对应的一列为一根竖柱,或者对应的一行为一根横柱,因此实现柱的亮的方法如下所述: 一根竖柱:对应的列置1,而行则采用扫描的方法来实现。 一根横柱:对应的行置0,而列则采用扫描的方法来实现。

汇编源程序 ORG 00H START: NOP MOV R3,#3 LOP2: MOV R4,#8 MOV R2,#0 LOP1: MOV P1,#0FFH MOV DPTR,#TABA MOV A,R2 MOVC A,A+DPTR MOV P3,A INC R2 LCALL DELAY DJNZ R4,LOP1 DJNZ R3,LOP2 MOV R3,#3 LOP4: MOV R4,#8 MOV R2,#7 LOP3: MOV P1,#0FFH MOV DPTR,#TABA MOV A,R2 MOVC A,A+DPTR MOV P3,A DEC R2 LCALL DELAY DJNZ R4,LOP3

单片机汇编语言经典一百例

51单片机实用程序库 流水灯 程序介绍:利用P1 口通过一定延时轮流产生低电平 输出,以达到发光二极管轮流亮的效果。实际应用中例如:广告灯箱彩灯、霓虹灯闪烁。 程序实例() ORG 0000H AJMP MAIN ORG 0030H MAIN: 9 MOV A,#00H MOV P1,A ;灭所有的灯 MOV A,#B

MAIN1: MOV P1,A ;开最左边的灯 ACALL DELAY ;延时 RL A ;将开的灯向右边移 AJMP MAIN ;循环 DELAY: MOV 30H,#0FFH D1: MOV 31H,#0FFH D2: DJNZ 31H,D2 DJNZ 30H,D1 RET END 方波输出 程序介绍:口输出高电平,延时后再输出低电 平,循环输出产生方波。实际应用中例如:波形发生器。

程序实例(): ORG 0000H MAIN: ;直接利用口产生高低电平地形成方波步移位 ;显示个,十,百,千算机的内部计算都是二进 制,而二进制每除一个2,实际上是向右移一次。所以为了计算方便,我们选择取6个数,最后在算除法的时候,只需要用单片机自带的右移位命令移2次就行了。 27 十六进制六位数加法(数码显示) 程序实例: ORG 0000H MAIN: ADNUMBER EQU 30H ;AD转换值 ADDNUMBER EQU 31H ;加数值1

ADL EQU 32H ;// ADH EQU 33H ;ADL转换高低位值 DISL EQU 34H ;// DISH EQU 35H ;显示高低位值 ADDTOTAL EQU 36H ;第一次AD转换值ADDJW EQU 37H ;加法进位数 ADDHOLD EQU 38H ADDFLAG EQU 39H ;加标志 ENDFLAG EQU 40H ;赋初值//////////////////////////////////////////// MOV ADDHOLD,#00H MOV ADDNUMBER,#00H MOV ADL,#00H MOV ADH,#00H MOV DISL,#00H

LCD1602-51单片机汇编程序

1602汇编程序,51单片机汇编程序,仅需修改引脚定义即可。晶振大小12M,程序测试完全正确。内部包含写数据、写命令(包括读忙和不读忙)、初始化等子函数。调用时先给LCD_DAT赋值,给出需要写入的数据或命令,然后调用。 ;端口引脚定义区 LCD_RS BIT P2.4 ;1602数据命令选择端口 LCD_RW BIT P2.5 ;1602读写选择端口 LCD_EN BIT P2.6 ;1602使能端口 LCD_DATA EQU P0 ;1602数据端口 ;变量声明区 ALL_FLAG EQU 20H ;标志位 LCD_FLAG EQU ALL_FLAG.7 ;1602读忙标志位 LCD_DAT EQU 30H ;1602数据命令字 DELAYED EQU 31H ;延时字 /***************************************** 1602读命令函数,高位存至LCD_LAG中 *****************************************/ LCD_R_DATA: MOV LCD_DATA,#0FFH LCD_BUSY: CLR LCD_RS SETB L CD_RW NOP SETB L CD_EN NOP MOV Acc,LCD_DATA MOV C,Acc.7 MOV LCD_FLAG,C CLR LCD_EN NOP JB LCD_FLAG,LCD_BUSY RET /***************************************** 1602写数据函数,数据存在LCD_DAT *****************************************/ LCD_W_DATA: LCALL LCD_R_DATA SETB L CD_RS CLR LCD_RW NOP MOV LCD_DATA,LCD_DAT

基于单片机的汇编语言入门教程

入门教程2007-04-29 22:04对初学者而言,汇编的许多命令太复杂,往往学习很长时间也写不出一个漂漂亮亮的程序,以致妨碍了我们学习汇编的兴趣,不少人就此放弃。所以我个人看法学汇编,不一定要写程序,写程序确实不是汇编的强项,大家不妨玩玩DEBUG,有时CRACK出一个小软件比完成一个程序更有成就感(就像学电脑先玩游戏一样)。某些高深的指令事实上只对有经验的汇编程序员有用,对我们而言,太过高深了。为了使学习汇编语言有个好的开始,你必须要先排除那些华丽复杂的命令,将注意力集中在最重要的几个指令上(CMP LOOP MOV JNZ……)。但是想在啰里吧嗦的教科书中完成上述目标,谈何容易,所以本人整理了这篇超浓缩(用WINZIP、WINRAR…依次压迫,嘿嘿!)教程。大言不惭的说,看通本文,你完全可以“不经意”间在前辈或是后生卖弄一下DEBUG,很有成就感的,试试看!那么――这个接下来呢?――Here we go!(阅读时看不懂不要紧,下文必有分解) 因为汇编是通过CPU和内存跟硬件对话的,所以我们不得不先了解一下CPU和内存:(关于数的进制问题在此不提) CPU是可以执行电脑所有算术╱逻辑运算与基本I/O 控制功能的一块芯片。一种汇编语言只能用于特定的CPU。也就是说,不同的CPU其汇编语言的指令语法亦不相同。个人电脑由1981年推出至今,其CPU发展过程为:8086→80286→80386→80486→PENTIUM →……,还有AMD、CYRIX等旁支。后面兼容前面CPU的功能,只不过多了些指令(如多能奔腾的MMX指令集)、增大了寄存器(如386的32位EAX)、增多了寄存器(如486的FS)。为确保汇编程序可以适用于各种机型,所以推荐使用8086汇编语言,其兼容性最佳。本文所提均为8086汇编语言。寄存器(Register)是CPU内部的元件,所以在寄存器之间的数据传送非常快。用途:1.可将寄存器内的数据执行算术及逻辑运算。2.存于寄存器内的地址可用来指向内存的某个位置,即寻址。3.可以用来读写数据到电脑的周边设备。8086 有8个8位数据寄存器,这些8位寄存器可分别组成16位寄存器:AH&AL=AX:累加寄存器,常用于运算;BH&BL=BX:基址寄存器,常用于地址索引;CH&CL=CX:计数寄存器,常用于计数;DH&DL=DX:数据寄存器,常用于数据传递。为了运用所有的内存空间,8086设定了四个段寄存器,专门用来保存段地址:CS(Code Segment):代码段寄存器;DS(Data Segment):数据段寄存器;SS(Stack Segment):堆栈段寄存器;ES(Extra Segment):附加段寄存器。当一个程序要执行时,就要决定程序代码、数据和堆栈各要用到内存的哪些位置,通过设定段寄存器CS,DS,SS 来指向这些起始位置。通常是将DS固定,而根据需要修改CS。所以,程序可以在可寻址空间小于64K的情况下被写成任意大小。所以,程序和其数据组合起来的大小,限制在DS 所指的64K内,这就是COM文件不得大于64K的原因。8086以内存做为战场,用寄存器做为军事基地,以加速工作。除了前面所提的寄存器外,还有一些特殊功能的寄存器:IP(Intruction Pointer):指令指针寄存器,与CS配合使用,可跟踪程序的执行过程;SP(Stack Pointer):堆栈指针,与SS配合使用,可指向目前的堆栈位置。BP(Base Pointer):基址指针寄存器,可用作SS的一个相对基址位置;SI(Source Index):源变址寄存器可用来存放相对于DS 段之源变址指针;DI(Destination Index):目的变址寄存器,可用来存放相对于ES 段之目的变址指针。还有一个标志寄存器FR(Flag Register),有九个有意义的标志,将在下文用

单片机汇编语言实验教程(1).

本文由zaoangy贡献 doc文档可能在WAP端浏览体验不佳。建议您优先选择TXT,或下载源文件到本机查看。 实验一熟悉MCS-51寻址方式及传送类指令 一.实验目的: 1.熟悉uVision2集成调试环境 2.熟悉 MCS-51寻址方式及传送类指令二.uVision2集成调试环境的使用uVision2是德国Keil Software公司用于多种嵌入式微处理器的一个理想、快速、 可靠的程序调试器。此调试器包含一个高速模拟器,能够让你模拟整个8051 系统,包括片上外围.....器件和外部硬件。 1.创建项目uVision2是以项目来管理你的任务,它可以使你的8051应用系统设计变得简单。要创建一个应用,你需要按下列步骤进行操作:①第一次使用,首先为我们编写的实验程序在D盘上新建一个文件夹D:\单片机实验;②启动uVision2,新建一个项目文件并从器件库中选择一个器件,操作步骤如下:直接在桌面上点击uVision2程序图标就可以启动它。要新建一个项目文件,从uVision 2的Project菜单中选择New Project,这将打开一个标准的Windows对话框,此对话框要求你输入项目文件名,例如为实验一新建项目:D:\单片机实验\ex1.vu2。紧接着,Select Device for Target,即为你的项目选择一个CPU。我们选择Gene ric下的8032。 2.新建一个源文件你可以用菜单选项File-New来新建一个源文件。这将打开一个空的编辑窗口让你输入你的源代码。编辑后,我们把我们的实验程序保存为D:\单片机实验\dpj1.asm。 3.将你的源文件加入到你的项目中在你的P roject Workspace窗口双击Target1及Suorce Group1,将你的目标系统一直展开到看到源文件组,如图1(a所示。右击Suorce Group1,出现Add files选项, 选择它可打开一个标准的文件对话框,从对话框中选择你刚刚生成的文件dpj1.asm 。 (a (b

单片机主要使用汇编语言

1.单片机主要使用汇编语言,而编写汇编语言程序设计人员必须精通 (指令系统)和(单片机硬件结构)。 2.CHMOS工艺是(CMOS)工艺和(HMOS)工艺结合,具有(低功 耗)的特点。 3.与8051比较80C51的最大特点是(使用CHMOS工艺)。 4.MCS—51单片机的时钟电路包括2部分,即芯片内的(高增益反相 放大器)和芯片外跨接的(晶体振荡器)与(微调电容)。 5.在MCS—51中,位处理器的数据位存储空间是由(专用寄存器)的 可寻址位和内部RAN为寻址区的(128)个位。 6.MCS—51的4个I/O口中,P0是真正的双向口,而其它的口则为准 双向的,这一区别在口线电路结构中表现在(口的输出缓冲器)的 不同上。 7.在寄存器间接寻址方式中,其“间接”体现在指令中寄存器的内容 不是操作数,而是操作数的(地址)。 8.在直接寻址方式中,只能使用(8)位二进制数作为直接地址,因此 其寻址对象只限于(内部RAM)。 9.在变址寻址方式中,以(累加器A)作变址寄存器,以(DPTR)或 (PC)作基址寄存器。 10.在相对寻址方式中,寻址得到的结果是(程序转移的目的地址)。 11.中断技术是解决资源竞争的有效方法,因此可以说中断技术实质上 是一个资源(共享)技术。 12.中断采样用于判断是否有中断请求信号,但MCS——51中只有(外 中断)才有中断采样的问题。 13.响应中断后,首先把(PC)内容压入堆栈,然后把长指令送(PC), 使程序转向(程序存储器)中的地址区。 14.从单片机的角度看,连接到数据总线的输出口应具有(锁存)功能, 连接到数据总线的输入口应具有(三态缓冲)功能。 15.在MCS—51单片机系统中,采用的编址方式是(统一编址方式)。 16.在查询和中断两种数据输入输出控制方式中,效率较高的是(中断 方式)。 17.输入口扩展是为了实现数据的(缓冲)功能,输出口扩展是为了实 现数据的(锁存)功能。 18.异步串行数据通信侦格式由(起始)位、(数据)位、(奇偶校验) 位和(停止)位组成。 19.串行接口电路的主要功能是(串行)化和(反串行)化,把侦中格 式信息滤除而保留数据位的操作是(反串行)化。 20.MCS—51的串行口在工作方式0下,是把串行口作为(同步移位) 寄存器使用。在串入并出移位下作(并行输出)口使用,在并入串 出移位下作(并行输入)口使用。 21.使用定时器/计数器1设置串行通信波特率时,应把定时器/计数器1 设定为工作方式(2),即(自动重新加载)方式。 22.D/A转换必须设置数据锁存器,这是因为(转换需要一定时间才能 完成,数字量需要稳定一段时间)。 23.对于电流输出的D/A转换器,为了得到电压的转换结果,应使用(运 算放大器)。 24.在脉冲调控法控制电机启动和调节电机转速的控制电路中,可使用 D/A转换器产生(调控脉冲)。 25.使用双缓冲方式的D/A转换器,可以实现多路模拟信号的(同步) 输出。 26.A/D转换器,按转换原理可分为4种,即(计数)式、(双积分)式、 (涿次逼近)式和(并行)式。 27.A/D转换器芯片ADC0809中,可作为查询的状态标志,可作为中断 请求信号使用的(转换结束)信号。28.把数/模转换器转换的数据传送给单片机,可使用的控制方式有(定 时传送)、(查询)和(中断)3中。 29.假定累加器A是内容为30H,执行指令:1000H:MOVC A,·A+PC 后把(1031H)单元送A中。 30.DPTR内容8100H,A内容40H执行MOVC A,·A+DPTR后送入 A的是(8140H)单元的内容。 31.SP=60H,ACC=30H,B=70H,执行PUSH ACC PUSH B后SP 为62H,61H为30H,62H为70H。 32.SP=62H,(61H)=30H,(62H)=70H执行POP DPH POP DPL后 DPTR为7030H,SP为60H。 33.A=50H,B=0A0H执行MUL AB后,B为32H,A为00H,CY为0, OV为1。 34.A=0FBH,B=12H执行DIV AB后,A为0DH,B为11H,CY为0, OV为0。 35.A=83H,R0=17H,(17H)=34H,执行ANL A,#17H ORL 17H, A XRL A,@R0 CPL A 后,A的内容为(CBH)。 1.80C51与87C51的区别在于(内部程序存储器的类型不同)。 2.80C51芯片采用的半导体工艺是(CHMOS)。 3.对程序计数器PC的操作(是自动进行啊)。 4.单片机程序存储器的寻址范围由PC决定,MCS—51的PC为16位, 因此其寻址范围是(64KB)。 5.PC和DPTR的结论中错误的是(它们都具有加“1”功能)。 6.不属于位处理器资源的是(通用寄存器的可寻址位)。 7.在相对寻址方式中,“相对”是指相对于(当前指令的末地址)。 8.对程序存储器的读操作,只能使用(MOVC指令)。 9.执行返回指令时,返回的断点是(调用指令下一条指令的首地址)。 10.可以为访问程序存储器提供和构成地址的有(PC、A、DPTR)。 11.原来寄存器0组为当前寄存器,现要改1组为当前寄存器组,不能 使用指令(MOV PSW。3,1)。 12.不是给程序存储器扩展使用的是(/WR). 13.不是给数据存储器扩展使用的是(/EA). 14.2片INTEL2732(4K×8),除应使用P0的8条外,还至少使用P2口的 口线(5条). 15.中断查询,查询的是(中断标志位). 16.在MCS—51中需要外加电路实现的中断撤除的是(电平方式的外部 中断). 17.执行中断返回指令,要从堆栈弹出断点地址, 从堆栈弹出的断点地址 送给(PC). 18.MCS—51中断优先级叙述中,错误的是(同时同级的多中断请求,将形 成阻塞,系统无法响应). 19.三态缓冲器的输出应具有3种状态,其中不包括(低阻抗状态). 20.在接口电路中的“口”一定的一个(可编址的寄存器). 21.在LED显示中,为了输出位控和段控信号,应使用指令(MOVX). 22.在D/A转换\并分时输入数据应用中,它的2级数据锁存结构可以(保 证各模拟电压能同时输出). 23.把DAC0832连接双缓冲方式数据转换中,错误的是(在程序中使用一 条MOVX指令输出数据). 24.执行MOV SP,#3AH/ MOV A,#20H / MOV B,#30H/ PUSH ACC/ PUSH B/ POP ACC/ POP B后,A和B的内容为(30H 20H) 1.MCS—51单片机的/EA信号有何功能?在使用8031时/EA信 号引脚如何处理? 答:/EA访问程序存储器控制信号,当/EA信号为低电平时,则对RO M的读操作限定在外部程序存储器,而当/EA信号为高电平时,则对RO M的读操作的从内部程序存储器开始,并可延续至外部程序存储器.在 使用8031时/EA信号引脚应接地. 2.内部RAM低128单元划分为哪3个主要部分?说明个部分的 使用特点答:分为寄存器区\位寻址区\用户RAM区 寄存器区:一般有2种使用方法1是以寄存器的形式使用,用寄 存器符号表示,2是以存储单元的形式使用,以单元地址表示. 位寻址区:一种是以位地址的形式,另一种是以存储单元地址加位 的形式表示. 用户RAM区:只能以存储单元的形式使用,其它没有任何规定和 限制. 3.堆栈有哪些功能?堆栈指示器(SP)的作用是什么?在程序设计 时,为什么要对SP重新赋值? 答:堆栈功能:保护断点和保护现场. SP的作用:为了指示栈顶地址所以要设置堆栈指示器(SP) SP的内容一经确定,堆栈的位置也就跟着确定下来,因为堆栈的 位置的浮动的,所以要对SP的初始化赋不同的值. 4.使单片机复位有几种方法?复位后机器的初始状态如何? 答:复位操作有上电自动复位和按键手动复位两重方式.. 复位后单片机 进入初始化操作,其主要功能是把PC初始化为0000H,使单片机从0000H单 元开始执行程序. 1.把长度为10HD的字符串从内部RAM的输入缓冲区inbuf向设在外部 RAM的输出缓冲区outbuf进行传送,一直进行到遇见回车符CR或整个字 符串传送完毕。 MOV R0,#inbuf/ MOV DPTR,#outbuf/ MOV R,#10H/ LOOP1:MOV A, @R0/ CJNE A,#0DH,LOOP2/ SJMP HERE/ LOOP2:MOVX @DPTR A/ INC R0/ INC DPTR/ DJNZ R1,LOOP1/HERE:SJMP HERE / END 2.内部RAM从list单元开始存放一正数表,表中之数作无序排列,并以“— 1”作结束标志。找出最小数。 MOV R0,#list/ LOOP1:MOV A,@R0/ CJNE A,#0FFH,LOOP2/ SJMP HERE/ LOOP2:INC R0/ MOV R1,A/ CLR C/ SUBB A,@R0/ JC LOOP3/ MOV A,@R0/ LOOP3:INC R0/ MOV A,R1/ SJMP L1/ HERE: SJMP HERE/ END 3.搜索一串ASCII码字符中最后一个非空格字符,字符串从外部RAM8100H 单元开始存放,并用一个回车符(0DH)作结束。编程实现搜索并把搜索 到的非格字符的地址存入内部RAM单元40H和41H中,其中高字节放入 41H单元。 MOV DPTR,#8100H/ LOOP1:MOVX A,@DPTR/ INC DPTR/ CJNE A, #0DH,LOOP1/ LOOP2:DEC DPL/ MOVX A,@DPTR/ CLR C/ SUBB A, #20H/ JZ LOOP2/ MOV 41H,DPH/ MOV 40H,DPL/ SJMP $/ END 4.从内部RAM20H单元开始存放一组带符号数,字节个数存在1FH中。请 统计出其中大于0、等于0和小于0的数的数目,并把统计结果分别存入 ONE、TWO、THREE3个单元中。 MOV R0,#20H/ MOV ONE,#00H/ MOV TWO,#00H/ MOV THREE, #00H/ L0:MOV A,@R0/ JNZ L1/ INC TWO/ SJMP L2/ L1:JNB ACC.7, L3/ INC THREE/ SJMP L3/ L3:INC ONE/ L2:INC R0/ DJNZ 1FH, L0/ HERE:SJMP HERE 5.5个双字节数,存放在外部RAM从barf开始的单元中,求它们和,把和 存放在sum单元中,请编程实现。 MOV R0,#barf/ MOV R3,#05H/ MOV R1,#SUM/ MOV R2,#03H/ CLR A/ L1:MOV @R1,A/ DJNZ R2,L1/ L2:CLR C/ MOV R1, #SUM/ MOV A,@R1/ SDDC A,@R0/ MOV @R1,A/ INC R0/ INC R1/ MOV A,@R0/ MOV A,R1,A/ INC R0/ MOV A,#00H/ MOV @R1,A/ INC R0/ DJNZ R3,L2 HERE:SJMP HERE 6.有晶振频率为6MHZ的MCS—51单片机,使用定时器0以定时方法在P1.0 输出周期为400us,占空比为10:1的矩形脉冲,以定时工作方式2编程实现. X1=28-20=236=0ECH X2=28-180=76=4CH ORG 0000H/ AJMP MAIN/ ORG 000BH/ AJMP S1/ ORG 0500H/ MAIN:MOV TMOD,@#02H/ SETB P1.0/ MOV TL0,#0ELH/ MOV TH0,#4CH/ MOV A,#0ECH/ SETB EA/ SETB ET0/ SETB TL0/ HERE:SJMP HERE/ ORG 06OOH/ S1:CPL P1.0/ XCH A,TH0/ RETI 5.什么是指令周期,机器周期和时钟周期?如何计算机器周期的确切时间? 答:指令周期的最大的时序定时单位,执行一条指令所需要的时间称之为指令 周期. 规定一个机器周期的宽度为6个状态,并依次表示为S1~S6.由于一个状态 又包括2个节拍,因此一个机器周期总共有12个节拍,分别记作 S1P1,S1P2,…….S6P2.由于一个机器周期共有12个振荡脉冲周期,因此机 器周期就是振荡脉冲的十二分频.当振荡脉冲频率为12MHZ时,一个机器 周期为1us,当震荡脉冲频率为6MHZ时,一个机器周期为2us. 6.定时的方法有? 答:软件定时;硬件定时;可编程定时器定时. 7.中断响应是有条件的,当存在哪些情况时,中断响应被封锁? 答○1CPU正处在为一个同级或高级的中断服务中;○2查询中断请求的机器 周期不是当前指令的最后一个机器周期;○3当前指令是返回指令(RET,RETI) 或访问IE、IP的指令. 在MCS-51单片机系统中,外接程序存储器和数据存储器共用16位地址线 和8位数据线,为什么不会冲突? 答:指令区分,读外部ROM使用指令“MOVC”读外部RAM使用指令 “MOVX”选通信号,外部ROM的选通信号为PSEN,外部RAM的选 通信号为RD和WR

相关文档
相关文档 最新文档