资源描述
word 文档 可自由复制编辑 单片机十进制加法计算器设计 摘要 本设计是基于 51 系列的单片机进行的十进制计算器系统设计,可以完成计算器的键盘输入,进行加、减、乘、除 3 位无符号数字的简单四则运算,并在LED 上相应的显示结果。设计过程在硬件与软件方面进行同步设计。硬件方面从功能考虑,首先选择内部存储资源丰富的 AT89C51 单片机,输入采用 44 矩阵键盘。显示采用 3 位7 段共阴极 LED动态显示。软件方面从分析计算器功能、流程图设计,再到程序的编写进行系统设计。编程语言方面从程序总体设计以及高效性和功能性对 C语言和汇编语言进行比较分析,针对计算器四则运算算法特别是乘法和除法运算的实现,最终选用全球编译效率最高的 KEIL 公司的Vision3软件,采用汇编语言进行编程,并用 proteus 仿真。引言 十进制加法计算器的原理与设计是单片机课程设计课题中的一个。在完成理论学习和必要的实验后,我们掌握了单片机的基本原理以及编程和各种基本功能的应用,但对单片机的硬件实际应用设计和单片机完整的用户程序设计还不清楚,实际动手能力不够,因此对该课程进行一次课程设计是有必要的。单片机课程设计既要让学生巩固课本学到的理论,还要让学生学习单片机硬件电路设计和用户程序设计,使所学的知识更深一层的理解,十进制加法计算器原理与硬软件的课程设计主要是通过学生独立设计方案并自己动手用计算机电路设计软件,编写和调试,最后仿真用户程序,来加深对单片机的认识,充分发挥学生的个人创新能力,并提高学生对单片机的兴趣,同时学习查阅资料、参考资料的方法。关键词:单片机、计算器、AT89C51芯片、汇编语言、数码管、加减乘除 word 文档 可自由复制编辑 目录 摘 要 .01 引 言 .01 一、设计任务和要求.1、1 设计要求 1、2 性能指标 1、3 设计方案的确定 二、单片机简要原理.2、1 AT89C51的介绍 2、2 单片机最小系统 2、3 七段共阳极数码管 三、硬件设计.3、1 键盘电路的设计 3、2 显示电路的设计 四、软件设计.4、1 系统设计 4、2 显示电路的设计 五、调试与仿真.5、1 Keil C51单片机软件开发系统 5、2 proteus的操作 六、心得体会.参考文献.附录1 系统硬件电路图.附录2 程序清单.word 文档 可自由复制编辑 一、设计任务和要求 1.1 设计要求 本次课程设计,我选择的课题是单片机十进制加法计算器软硬件设计,设计任务为:设计一键盘显示装置,键盘上除需定义10个十进制数字键外还要相应的功能键,其它键不定义无响应。利用此系统可分别可输入十进制被加数与加数,实现两数相加并将结果以十进制形式显示出来。(扩展:多位10进制数相加)1.2 性能指标 本课程设计的十进制加法计算器的计算范围为0255,计算结果全为整数,计算结果溢出结果不显示。1、加法:三位加法,计算结果超过255溢出不显示 2、减法:三位减法,计算结果若小于零溢出不显示 3、乘法:三位数乘法 4、除法:整数除法 5、有清零功能 1.3 设计方案的确定 按照1.1的设计要求,本课题需要使用数码管显示和扩展4*4键盘,由于AT89C51芯片的I口不够多,而且为了硬件电路设计的简单化,故选择串行动态显示和用P1口扩展4*4键盘,扩展的4*4键盘定义十个数字键,六个功能键,使用串行动态显示显示运算结果。主程序进行初始化,采用行列扫描进行查表得出键值,每次按键后调用显示子程序。二、单片机简要原理 在该课程设计中,主要用到一个AT89C51 芯片和串接的共阴数码管。作为该设计的主要部分,下面将对它们的原理及功能做详细介绍和说明。word 文档 可自由复制编辑 2.1 AT89C51的介绍:图一 AT89C51 外形结构和引脚分布图 芯片AT89C51的外形结构和引脚图如图一所示。AT89C51是一种带4K字节闪烁可编程可擦除只读存储器(FPEROMFalsh Programmable and Erasable Read Only Memory)的低电压,高性能CMOS8位微处理器,俗称单片机。该器件采用ATMEL高密度非易失存储器制造技术制造,与工业标准的MCS-51指令集和输出管脚相兼容。由于将多功能8位CPU和闪烁存储器组合在单个芯片中,ATMEL的AT89C51是一种高效微控制器,为很多嵌入式控制系统提供了一种灵活性高且价廉的方案。2.2 单片机最小系统 单片机最小系统就是支持主芯片正常工作的最小部分,包括主控芯片、复位电路和晶振电路。(一)复位电路 word 文档 可自由复制编辑 图二 复位电路 本设计采用上电与手动复位电路,电阻分别选取100和10K,电容选取10uF,系统一上电,芯片就复位,或者中途按按键也可以进行复位。(二)晶振电路 图三 晶振电路 晶振电路是单片机的心脏,它用于产生单片机工作所需要的时钟信号。单片机的晶振选取11.0592MHz,晶振旁电容选取30pF。2.3 七段共阳极数码管 word 文档 可自由复制编辑 图四 七段共阳数码管 图为七段共阳数码管的引脚图,从左到右数码管的段码分别为a,b,c,d,e,f,g和小数点dp,低电平时点亮,最右边为位选端。三、硬件设计 简易数字计算器系统硬件设计主要包括:键盘电路,显示电路以及其他辅助电路。下面分别进行设计。3.1 键盘电路的设计 键盘可分为两类:编码键盘和非编码键盘。编码键盘是较多按键(20个以上)和专用驱动芯片的组合,当按下某个按键时,它能够处理按键抖动、连击等问题,直接输出按键的编码,无需系统软件干预。通用计算机使用的标准键盘就是编码键盘。当系统功能比较复杂,按键数量很多时,采用编码键盘可以简化软件设计。但大多数智能仪器和电子产品的按键数目都不太多(20个以内),为了降低成本和简化电路通常采用非编码键盘。非编码键盘的接口电路有设计者根据需要自行决定,按键信息通过接口软件来获取。本课题需要的是16个按键,故选择用非编码键盘。计算器输入数字和其他功能按键要用到很多按键,如果采用独立按键的方式,在这种情况下,编程会很简单,但是会占用大量的I/O 口资源,因此在很多情况下都不采用这种方式,而是采用矩阵键盘的方案。矩阵键盘采用四条I/O 线作为行线,四条I/O 线作为列线组成键盘,在行线和列线的每个交叉点上设置一个按键。这样键盘上按键的个数就为44个。这种行列式键盘结构能有效地提高单片机系统中I/O 口的利用率。矩阵键盘的工作原理:计算器的键盘布局如图五所示:一般有 16个键组成,在单片机中正好可以用一个P口实现16个按键功能,这种形式在单片机系统中也最常用。word 文档 可自由复制编辑 具体电路连接如图五所示:图五 4*4键盘接口电路 3.2 显示电路的设计 当系统需要显示少量数据时,采用LED数码管进行显示是一种经济实用的方法。数码管显示有静态显示和动态显示两种方法。为了减少端口的使用,故选择动态显示。电路如下图六所示:word 文档 可自由复制编辑 图六 三位数码管的显示电路 四、软件设计 在十进制加法计算器的软件规划要求下,简易计算器的程序主要包括以下功能模块:(1)主模块,为系统的初始化。(2)显示与读键模块,分为判键程序段、运算操作子程序、显示子程序等部分;4.1 系统设计 (一)系统模块图 单片机运算模块显示模块输入模块 图六 系统模块图 word 文档 可自由复制编辑 此系统包括输入、运算和显示模块,由单片机控制。其中通过输入键盘模块将数字09和运算符号“+”、“-”、“*”、“/”输入单片机进行运算;运算模块分别根据输入的运算符进行加减乘除运算;显示模块将运算后的数值通过动态扫描使之在数码管上输出。(二)系统总流程图 主程序主要是用来进行初始化的,调用其他子程序,清空各个标志位,清空缓存区,读取键码,判断功能,在LED上作出回应,主程序流程图如图六所示。(1)数字送显示缓冲程序设计 简易计算器所显示的数值最大位三位。要显示数值,先判断数值大小和位数,如果是超过三位或大于255,将不显示数字。可重新输入数字,再次计算。(2)运算程序的设计 首先初始化参数,送LED三位显示“0”,其它位不显示。然后扫描键盘看是否有键输入,若有,读取键码。判断键码是数字键、清零键还是功能键,是数值键则送LED显示并保存数值,是清零键则做清零处理,是功能键则又判断是“=”还是运算键,若是“=”则计算最后结果并送LED显示,若是运算键则保存相对运算程序的首地址。word 文档 可自由复制编辑 图七 主程序流程图 初始化参数 清零键 LED 显示 输入数值 读取键值 状态清零 数值送显示缓存 开始 按键输入?分析键值 数字键 等待数值输入 结果送显示缓存 保存结果和功能键 根据上次功能键和输入的数据计算结果 功能键 否 是 是数字键 是清零键 是功能键 word 文档 可自由复制编辑 4.2 显示与按键设计(一)LED显示程序设计 LED显示器由七段发光二极管组成,排列成8字形状,因此也称为七段LED显示器。为了显示数字或符号,要为LED显示器提供代码,即字形代码。七段发光二极管,再加上一个小数点位,共计8段,因此提供的字形代码的长度正好是一个字节。简易计算器用到的数字09的共阳极字形代码如下表:显示字型 g f e d c b a 段码 0 0 1 1 1 1 1 1 0c0h 1 0 0 0 0 1 1 0 0f9h 2 1 0 1 1 0 1 1 0a4h 3 1 0 0 1 1 1 1 0b0h 4 1 1 0 0 1 1 0 99h 5 1 1 0 1 1 0 1 92h 6 1 1 1 1 1 0 1 82h 7 0 0 0 0 1 1 1 0f8h 8 1 1 1 1 1 1 1 80h 9 1 1 0 1 1 1 1 90h 表一 共阳极数码管段码对照表(二)读键子程序设计 为了实现键盘的数据输入功能和命令处理功能,每个键都有其处理子程序,为此每个键都对应一个码键码。为了得到被按键的键码,现使用行扫描法识别按键。其程序框图如图八:读键程序使用的是反转法读键,不管键盘矩阵的规模大小,均进行两次读键。第一次所有列线均输出低电平,从所有读入键盘信息(行信息);第二次所有行线均输出低电平,从所有行线读入键盘信息(列信息)。将两次读键信息进行组合就可以得到按键的特征编码,然后通过查表得到按键的顺序编码。将各特征编码按希望的顺序排成一张表,然后用当前读得的特征码来查表。当表中有该特征码时,它的位置就是对应的顺序编码;当表中没有该特征码时,说明这是一个没有定义的键码,与没有按键(0FFH)同等看待。word 文档 可自由复制编辑 图八 计算键值子程序流程图 五、调试与仿真 下面用KEIL uVision3 与 proteus 仿真软件介绍十进制加法计算器的仿真与调试。5.1 Keil C51单片机软件开发系统(一)系统的整体结构 C51工具包的整体结构中,其中uVision是C51 for Windows的集成开发环境(IDE),可以完成编辑、编译、连接、调试、仿真等整个开发流程。开发人员可用IDE本身或其它编辑器编辑C或汇编源文件。然后分别由C51编译器编译生成目标文件(.OBJ)。目标文件可由LIB51创建生成库文件,也可以与库文件一起经L51连接定位生成绝对目标文件(.ABS)。ABS文件由OH51转换成标准的Hex文件,以供调试器dScope51或tScope51使用进行源代码级调试,也可由仿真器使用直接对目 word 文档 可自由复制编辑 标板进行调试,也可以直接写入程序存贮器如EPROM中。(二)采用KEIL 开发的89c51单片机应用程序步骤:1.在uVision 集成开发环境中创建新项目(Project),扩展文件名为.UV2,并为该项目选定合适的单片机CPU器件(本设计采用ATMEL 公司下的AT89C51)2.用uVision 的文本编辑器编写源文件,可以是汇编文件(.ASM),也可以使C语言文件(扩展名.C),并将该文件添加到项目中去。一个项目文件可以包含多个文件,除了源程序文件外,还可以是库文件、头文件或文本说明文件。3.通过uVision 3 的相关选择项,配置编译环境、连接定位器以及Debug调试器的功能。4.对项目中的源文件进行编译连接,生成绝对目标代码和可选的HEX文件,如果出现编译连接错误则返回到第2步,修改源文件中的错误后重构整个项目。5.对没有语法错误的程序进行仿真调试,调试成功后将HEX文件写入到单片机应用系统的ROM中。5.2 proteus的操作 (一)硬件电路图的接法操作 1.放置选择(删除)元器件 2.移动元器件 3.缩放视图 4.连接导线 5.仿真,调试 (二)单片机系统PROTEUS设计与仿真过程 Proteus 强大的单片机系统设计与仿真功能,使它可成为单片机系统应用开发和改进手段之一。全部过程都是在计算机上通过Proteus 来完成的。其过程一般也可分为三步:1.在ISIS 平台上进行单片机系统电路设计、选择元器件、接插件、连接电路和电气检测等,简称Proteus 电路设计。2.在Keil 平台上进行单片机系统程序设计、编辑、汇编编译、代码级调试,最后生成目标代码文件(*.hex)。简称Proteus 源程序设计和生成目标代码文件。3.在ISIS 平台上将目标代码文件加载到单片机系统中,并实现单片机系统的实时交互、协同仿真。它在相当程度上反映了实际单片机系统的运行情况。简称Proteus 仿真。(三)Proteus中课程设计的仿真结果 在Proteus中将硬件电路全部接好以后,将Keil中生成的.hex文件导入到单片机中,点击开始仿真按钮,电路开始仿真。可以观察到:数码管显示“000”;分别依次按下按键“5”、“+”、“6”和“=”,可以看到数码管显示“11”;也可以分别调试其它功能键,结果发现调试结果与预期的理论值相吻合,即本次课设已成功。总的仿真原理电路图见附录 1图九。word 文档 可自由复制编辑 六、心得体会 为期一周的单片机课程设计终于结束了,通过紧张的工作,完成了我们的设计任务-十进制加法计算器。总的来说,这次课程设计是比较成功的。当然,这其中也经历了许多坎坷,但是在我的坚持不懈下,在老师的细心指导下,在同学们的热情帮助下,最终克服了种种困难,取得了成功。刚开始接到这个计算器的课程设计任务时,因为以前做过类似的题目,于是在脑海中初步构建了编写程序的一些控制程序。但是由于缺乏编写大量程序的经验,不能如行云流水般的将全部的各部分代码写出,于是去网上查找相关资料,了解计算器的输入控制原理、运算处理以及显示的原理。了解之后自己尝试编写程序,在此过程中,其中键盘扫描和动态扫描显示扫描程序困扰了我很久,经过三四天的辛苦工作,终于初步把所需要的程序编好了,于是就用Keil uversion3进行仿真,在仿真期间也发现了许多错误,基本上都是平日容易犯的错误,比如忘记了子程序标号、死循环程序、标点符号的漏写等。经过反复的编译差错,仿真编译通过后,于是开始在Proteus中连硬件电路,全部接完电路之后将Keil生成的.Hex文件导入进行仿真,发现软件与硬件不能够对应协调工作,于是分别对软件和硬件进行检查,经过反复的仿真调试,并且在同学的帮助和自己对每个子程序进行仿真观察下,终于在课设快结束时成功的调试出结果了。这就是我这一周课设的经过,看似简单,过程却曲折艰辛。通过这次课程设计,我进一步加深了对电子自动控制的了解。并进一步熟练了对Keil和Proteus软件的操作。在编写程序的过程中,遇到了很多问题,使我发现自己以前学习上存在的不足,对以前所学过的知识理解得不够深刻,掌握得不够牢固,对单片机汇编语言掌握得不够好。通过与同学探讨和请教老师,终于把问题都解决了,并加深了对计算器工作的原理的了解。同时也掌握了做课程设计的一般流程,为以后的设计积累了一定的经验。做课程设计时,先查阅相关知识,把原理吃透,确定一个大的设计方向,在按照这个方向分模块的把要实现的功能用流程图的形式展示。学会了怎么样去制定计划,怎么样去实现这个计划,并掌握了在执行过程中怎么样去克服心理上的不良情绪。总之,通过这次的设计,进一步了解了单片微型计算机及应用原理,收获很大,对软件编程、排错调试、查阅资料等方面得到较全面的锻炼和提高。同时通过本次课程设计的学习,掌握了一种系统的研究方法,可以进行一些简单的编程,我还深深的体会到设计课的重要性和目的性所在。为了完成项目,在网络上找到了许多相关的资料,大大扩充自己的知识面,使许多以前想解决却无法解决的困难迎刃而解。将书本上的理论知识和实际有机地结合起来,从理论中得出结论。锻炼了实际分析问题和解决问题的能力,提高了适应实际的能力,为今后的学习和实践打下了良好的基础。此次课设还巩固和综合运用所学过的原理知识,从而提高自己的实际动手能力和独立思考的能力。参考文献 1 周航慈.单片机应用程序设计技术(修订版).北京航空大学出版社 2 张志良.单片机原理与控制技术.第2版.机械工业出版社 word 文档 可自由复制编辑 3 康华光.电子技术基础(第5版).高等教育出版社出版,2006 4 蒋力培.单片微机系统实用教程(第1版).机械工业出版社 5 姜志海、刘连鑫.单片微型计算机原理及应用.电子工业出版社,2011 附录1 系统硬件电路图 图九 总电路原理图 附录2 程序清单 YJ EQU 50H ;结果存放 YJ1 EQU 51H ;中间结果存放 GONG EQU 52H ;功能键存放 ORG 00H START:MOV R3,#0 ;初始化显示为空 MOV GONG,#0 MOV 32H,#00H MOV 33H,#00H MOV 34H,#00H MLOOP:CALL DISP ;调显示子程序 word 文档 可自由复制编辑 WAIT:CALL TESTKEY ;判断有无按键 JZ WAIT CALL GETKEY ;读键 INC R3 ;按键个数 CJNE A,#0,NEXT1 ;判断是否数字键 LJMP E1 ;转数字键处理 NEXT1:CJNE A,#1,NEXT2 LJMP E1 NEXT2:CJNE A,#2,NEXT3 LJMP E1 NEXT3:CJNE A,#3,NEXT4 LJMP E1 NEXT4:CJNE A,#4,NEXT5 LJMP E1 NEXT5:CJNE A,#5,NEXT6 LJMP E1 NEXT6:CJNE A,#6,NEXT7 LJMP E1 NEXT7:CJNE A,#7,NEXT8 LJMP E1 NEXT8:CJNE A,#8,NEXT9 LJMP E1 NEXT9:CJNE A,#9,NEXT10 LJMP E1 NEXT10:CJNE A,#10,NEXT11 ;判断是否功能键 LJMP E2 ;转功能键处理 NEXT11:CJNE A,#11,NEXT12 LJMP E2 NEXT12:CJNE A,#12,NEXT13 LJMP E2 NEXT13:CJNE A,#13,NEXT14 LJMP E2 NEXT14:CJNE A,#14,NEXT15 LJMP E2 NEXT15:LJMP E3 ;判断是否清除键 E1:CJNE R3,#1,N1 ;判断第几次按键 LJMP E11 ;为第一个数字 N1:CJNE R3,#2,N2 LJMP E12 ;为第二个数字 N2:CJNE R3,#3,N3 LJMP E13 ;为第三个数字 N3:LJMP E3 ;第四个数字转溢出 E11:MOV R4,A ;输入值暂存R4 MOV 34H,A ;输入值送显示缓存 word 文档 可自由复制编辑 MOV 33H,#00H MOV 32H,#00H LJMP MLOOP ;等待再次输入 E12:MOV R7,A ;个位数暂存R7 MOV B,#10 MOV A,R4 MUL AB ;十位数 ADD A,R7 MOV R4,A ;输入值存R4 MOV 32H,#00H ;输入值送显示缓存 MOV 33H,34H MOV 34H,R7 LJMP MLOOP E13:MOV R7,A MOV B,#10 MOV A,R4 MUL AB JB OV,E3 ;输入溢出 ADD A,R7 JB CY,E3 ;输入溢出 MOV R4,A MOV 32H,33H ;输入值送显示缓存 MOV 33H,34H MOV 34H,R7 LJMP MLOOP E3:MOV R3,#0 ;按键次数清零 MOV R4,#0 ;输入值清零 MOV YJ,#0 ;计算结果清零 MOV GONG,#0 ;功能键设为零 MOV 32H,#00H ;显示清空 MOV 33H,#00H MOV 34H,#00H LJMP MLOOP E2:MOV 34H,#00H MOV 33H,#00H MOV 32H,#00H MOV R0,GONG ;与上次功能键交换 MOV GONG,A MOV A,R0 CJNE A,#10,N21 ;判断功能键 LJMP JIA ;N21:CJNE A,#11,N22 LJMP JIAN ;word 文档 可自由复制编辑 N22:CJNE A,#12,N23 LJMP CHENG ;*N23:CJNE A,#13,N24 LJMP CHU ;/N24:CJNE A,#0,N25 LJMP FIRST ;首次按功能键 N25:LJMP DEN ;=N4:LJMP E3 FIRST:MOV YJ,R4 ;输入值送结果 MOV R3,#0 ;按键次数清零 LJMP DISP1 ;结果处理 JIA:MOV A,YJ ;上次结果送累加器 ADD A,R4 ;上次结果加输入值 JB CY,N4 ;溢出 MOV YJ,A ;存本次结果 MOV R3,#0 ;按键次数清零 LJMP DISP1 JIAN:MOV A,YJ SUBB A,R4 ;上次结果减输入值 JB CY,N4 ;负数溢出 MOV YJ,A MOV R3,#0 LJMP DISP1 CHENG:MOV A,YJ MOV B,A MOV A,R4 MUL AB ;上次结果乘输入值 JB OV,N4 ;溢出 MOV YJ,A LJMP DISP1 CHU:MOV A,R4 MOV B,A MOV A,YJ DIV AB ;上次结果除输入值 MOV YJ,A MOV R3,#0 LJMP DISP1 DEN:MOV R3,#0 LJMP DISP1 DISP1:MOV B,#10 MOV A,YJ ;结果送累加器 DIV AB ;结果除10 MOV YJ1,A ;暂存商 MOV A,B ;取个位数 word 文档 可自由复制编辑 MOV 34H,A ;个位数送显示缓存 MOV A,YJ1 JZ DISP11 ;结果是否为一位数 MOV B,#10 MOV A,YJ1 DIV AB MOV YJ1,A MOV A,B MOV 33H,A ;十位送显示缓存 MOV A,YJ1 JZ DISP11 ;结果是否为二位数 MOV 32H,A ;百位数送显示缓存 DISP11:LJMP MLOOP DISP:MOV R0,#34H DIR1:MOV DPTR,#SEGTAB MOV A,R0 MOVC A,A+DPTR MOV P0,A CJNE R0,#34H,DIR2 SETB P2.0 CALL D1MS CLR P2.0 DEC R0 SJMP DIR1 DIR2:CJNE R0,#33H,DIR3 SETB P2.1 CALL D1MS CLR P2.1 DEC R0 SJMP DIR1 DIR3:SETB P2.2 CALL D1MS CLR P2.2 RET D1MS:MOV R7,#02H DMS:MOV R6,#0F0H DJNZ R6,$DJNZ R7,DMS RET SEGTAB:DB 0C0H,0F9H,0A4H,0B0H DB 99H,92H,82H,0F8H DB 80H,90H,88H,83H word 文档 可自由复制编辑 DB 0C6H,0A1H,86H,8EH TESTKEY:ACALL DISP MOV P1,#0FH ;读入键状态 MOV A,P1 CPL A ANL A,#0FH ;高四位不用 RET KEYTABLE:DB 0EEH,0EDH,0DDH,0BDH;键码定义 DB 0EBH,0DBH,0BBH,0E7H DB 0D7H,0B7H,0DEH,0BEH DB 07EH,07DH,07BH,077H GETKEY:MOV R6,#10 ;读键子程序 ACALL DELAY MOV P1,#0FH MOV A,P1 CJNE A,0FH,K12 LJMP MLOOP K12:MOV B,A MOV P1,#0EFH MOV A,P1 CJNE A,#0EFH,K13 MOV P1,#0DFH MOV A,P1 CJNE A,#0DFH,K13 MOV P1,#0BFH MOV A,P1 CJNE A,#0BFH,K13 MOV P1,#07FH MOV A,P1 CJNE A,#07FH,K13 LJMP MLOOP K13:ANL A,#0F0H ORL A,B MOV B,A MOV R1,#16 MOV R2,#0 MOV DPTR,#KEYTABLE K14:MOV A,R2 MOVC A,A+DPTR CJNE A,B,K16 MOV P1,#0FH word 文档 可自由复制编辑 K15:MOV A,P1 CJNE A,#0FH,K15 MOV R6,#10 ACALL DELAY MOV A,R2 RET K16:INC R2 DJNZ R1,K14 AJMP MLOOP ;10ms延时子程序 DELAY:MOV R7,#10 TS1:MOV R6,#0FFH TS2:NOP NOP DJNZ R6,TS2 DJNZ R7,TS1 RET END
展开阅读全文