1单片机汇编部分机械学院尚万峰2强化训练是汇编语言程序设计的提高课程,要求学生通过训练掌握汇编语言程序设计的基本方法及技能,并具有一定微机系统应用软件开发的能力。课程目标前言3课程内容训练题目上机流程汇编语言程序设计方法汇编语言程序示例及报告前言4参训建议1、上机前做好准备,将头脑中对题目的理解、思路、程序都落实在纸上,做到上机时有的放矢,有助于迅速进入状态,避免时间浪费;2、尽量做到独立解决问题,增强自信心;3、上机后要进行总结、修改,达到自我提高的目的;前言5考核方式考勤(上机)40%训练报告40%训练答辩20%前言时间安排-第一周(15周)星期一6.15星期二6.16星期三6.17星期四6.18星期五6.191-2动员、授课机械1-63-408[毛清华/董明C];机械7-8/机电3-205[尚万峰/文建平];机单10-504[王燕]机械1-8班、机电1-2、机单上机(2学时)机械1-8班、机电1-2、机单上机(4学时)自习编程机械1-8班、机电1-2、机单上机(2学时)3-4收实验报告5-6自习编程自习编程收实验报告7-8时间安排-第二周(16周)星期一6.22星期二6.23星期三6.24星期四6.25星期五6.261-2授课机械1-63-208[文建平];机械7-8/机电3-408[董明]机械1-8班、机电1-2、机单上机(2学时)机械1-8班、机电1-2、机单上机(4学时)自习编程机械1-8班、机电1-2、机单上机(2学时)3-4收实验报告5-6自习编程自习编程收实验报告7-81训练题目设计小型数控机床不同功能的16路按键信号,要求实时发出按键声音和显示键号。要求:系统仿真须基于51单片机和汇编语。任务1:键盘扫描控制程序任务2:单片机发出控制命令任务3:LED显示程序任务4:51汇编语言基本数学运算和输入命令任务5:程序存储器表格的使用。2上机流程安装程序,确保自己所用电脑上有keil和proteus软件。设置keil和proteus软件。设计控制电路。编写汇编程序,并调试,生成*.hex文件。导入proteus软件,实现仿真电路和程序联调,验证控制系统仿真功能。2.1安装软件部分电脑上没有装proteus软件,请大家自行安装。如有问题,请迅速联指导老师,勿耽搁。附:答疑办公室:2-10-305室2.2Keil软件使用介绍2.3Proteus软件使用介绍3.汇编语言指令与编程寻址方式;MCS-51指令集;伪指令;汇编语言与简单程序设计.51系列单片机指令集含有111条指令每条指令在执行时要花去一定的时间,以机器周期为单位。按指令执行时间分类:单周期(64条);双周期(45条);4周期(2条)按指令的功能分类,可分为5大类:数据传送类(29条);算术运算类(24条)逻辑运算及移位类(24);控制转移类(17条)位操作类(17条)每条指令在程序存储器ROM中占据一定的空间,以字节为单位。按指令所占字节数分类:单字节(49条);双字节(46条);3字节(16条)ASM-51指令的格式方括符[]表示可选项标号代表指令所在地址,1-8个字母/数字,“:”结尾操作码就是指令功能助记符,指令实体目的操作数源操作数注释,以“;”开头[标号:]操作码[目的操作数][,源操作数][;注释]51单片机指令的寻址方式寄存器寻址立即寻址寄存器间接寻址直接寻址变址寻址(基址寄存器+变址寄存器间接寻址)相对寻址位寻址寻址方式:指令按地址获得操作数的方式七种寻址方式,一条指令可能含多种寻址方式寄存器寻址从寄存器中读取操作数或存放操作数进寄存器例:MOVA,B;(A)←(B)MOV30H,R0;(30H)←(R0)MOVA,R1;(A)←(R1)立即寻址——操作数直接就出现在指令中例:MOVA,#64H;(A)←立即数64HADDA,#05H;(A)←(A)+立即数05H注意:符号“#”表明其后跟的是立即数,立即数——就是数字量本身。寄存器间接寻址寄存器中的内容是一个地址,由该地址单元寻址到所需的操作数注意:1)“间接”表示某寄存器中的“内容”只是一个“单元地址”,这个地址单元中存放的数据才是要找的“操作数”。2)符号“@”表示“在…”,其含义与读音皆同“at”。例:[MOVR1,#30H;(R1)←立即数30H][MOVR1,#30H;(R1)←立即数30H]MOV@R1,#0FH;(30H)←立即数0FHMOVA,@R1;(A)←((30H))=#0FH直接寻址指令中直接给出了操作数所在单元的地址或名称例:MOVR1,1FH;(R1)←(1FH)MOV30H,4AH;(30H)←(4AH)在本单片机中规定:访问特殊功能寄存器SFR只能采用直接寻址方式。例如:MOVA,SP;(A)←(SP)MOVA,81H;(A)←(SP)MOVP1,#5AH;(P1)←(#5AH)MOV90H,#5AH;(P1)←(#5AH)MOVB,30H;(B)←(30H)相同相同变址寻址也称为:基址寄存器+变址寄存器间接寻址以16位的地址指针寄存器DPTR或16位的PC寄存器为基址寄存器,以累加器A为变址寄存器,两者中的“内容”形成一个16位的“地址”,该“地址”所指的存储单元中的内容才是操作数。[设:A中已存有#A4H,DPTR中已存有#1234H]MOVCA,@A+DPTR;(A)←((A)+(DPTR))操作:将A4H+1234H=12D8H单元中的数放进累加器A相对寻址当前PC值加上指令中规定的偏移量rel,构成实际的操作数地址例:SJMPrel操作:跳转到的目的地址=当前16位PC值+rel注意:1)“当前PC值”指程序中下一条指令所在的首地址,是一个16位数;2)符号“rel”表示“偏移量”,是一个带符号的单字节数,范围是:-128—+127(80H—7FH),在实际编程中,“rel”通常用标号代替位寻址指令中直接给出了操作数所在的位地址。例:CLRP1.0;(P1.0)←0SETBACC.7;(ACC.7)←1CPLC;(C)←NOT(C)注意:1)位地址里的数据只可能是一个0或12)有的位地址十分明确,如P1.0,ACC.7等,有的位地址则“不太明确”,如:[MOVA,17H;(A)←(17H),17H是字节地址]MOVACC.0,17H;(ACC.0)←(17H),这里ACC.0是位地址所以该指令中的17H是22H单元的第7位位寻址指令中直接给出了操作数所在的位地址。例:CLRP1.0;(P1.0)←0SETBACC.7;(ACC.7)←1CPLC;(C)←NOT(C)注意:1)位地址里的数据只可能是一个0或12)有的位地址十分明确,如P1.0,ACC.7等,有的位地址则“不太明确”,如:[MOVA,17H;(A)←(17H),17H是字节地址]MOVACC.0,17H;(ACC.0)←(17H),这里ACC.0是位地址所以该指令中的17H是22H单元的第7位MCS-51指令集功能分五类,共111条指令MCS-51指令集(五大类功能)P.49页数据传送类指令:(29条)算术运算类指令:(24条)逻辑运算及移位类指令:(24条)控制转移类指令:(17条)位操作(布尔操作)类指令:(17条)内部存储器间传送:(MOV——16条)外部数据存储器与累加器间传送:(MOVX——4条)程序存储器向累加器传送:(MOVC——2条)数据交换:(XCH,XCHD,SWAP——5条)堆栈操作:(PUSH,POP——2条)(一)数据传送类指令(5种/29条)Acc累加器Direct直接寻址@Ri间接寻址Rn寄存器#data立即数Rn:R0—R7@Ri:@R0,@R1#data:8位立即数#data16:16位立即数direct:直接地址rel:8位带符号偏移量(一)数据传送类指令(5种/29条)内部存储器间传送指令(16条):MOV类指令的操作方向总是后面的操作数指向前面的操作数!例:MOVA,30H——(A)(30H)数据传送类指令(续)外部数据存储器与累加器间传送(4条):MOVX类指令可在累加器与以@DPTR或@Ri所代表的外部RAM之间进行数据传送。例如:MOVXA,@DPTR——(A)((DPTR))MOVXA,@Ri——(A)((Ri))MOVX@DPTR,A——((DPTR))(A)MOVX@Ri,A——((Ri))(A)程序存储器向累加器传送指令(2条):MOVCA,@A+DPTRMOVCA,@A+PC——通常称为查表指令,寻址方式属:“基址寄存器+变址寄存器间接寻址”数据传送类指令(续)@A+DPTR或@A+PC指向程序存储器中的某单元。拟传送给累加器ACC的数据就是程序中事先写进去的表格数据。这些表格数据往往用伪指令DB,DW等定义在程序中。数据传送类指令(续)数据交换指令(5条):XCHA,direct(字节互换)XCHA,@Ri(字节互换)XCHA,Rn(字节互换)(A)(direct)[或((Ri)),或(Rn)]XCHDA,@Ri累加器Acc的低4位与((Ri))的低4位互换,各自的高4位不变SWAPA累加器Acc的低4位与自身的高4位互换堆栈操作指令(2条):PUSH——压栈指令POP——弹栈指令√堆栈区由特殊功能寄存器堆栈指针SP管理√堆栈区可以安排在RAM区任意位置,一般不安排在工作寄存器区和可按位寻址的RAM区,而是放在RAM区的靠后的位置√堆栈总是指向栈顶√通常PUSH与POP两条指令成对使用数据传送类指令(续)例如:设(A)=7BH;(35H)=11H并且知道(SP)=60HPUSHACC;(61H)#7BHPUSH35H;(62H)(35H)即:(62H)#11HPOPACC;(A)(62H)即:(A)#11HPOP5AH;(5AH)(61H)即:(5AH)#7BH(二)算术运算类指令(6种/24条)加法运算:(ADD——4条)带进位加法运算:(ADDC——4条)带借位减法运算:(SUBB——4条)加1/减1操作:(INC,DEC——9条)单字节乘/除法运算:(MUL,DIV——2条)十进制调整:(DAA——1条)(二)算术运算类指令(续)加法运算:(ADD——4条)带进位加法运算:(ADDC——4条)带借位减法运算:(SUBB——4条)所有的加法(ADD)、带进位加法(ADDC)、带借位减法(SUBB)运算都是以A为一个加数或被减数,最终结果也存进A。加法(ADD)、带进位加法(ADDC)以及带借位减法(SUBB)运算中,如果产生了进位或借位,将自动对PSW中的Cy标志位置“1”。带进位加法(ADDC):(A)(A)+(Cy)+(第二操作数)带借位减法(SUBB):(A)(A)-(Cy)-(第二操作数)(二)算术运算类指令(续)加1/减1操作:(INC,DEC——9条)INC,DEC与用加/减法指令做加1/减1操作不同之处在于INC、DEC不影响标志位.单字节乘/除运算:(MUL,DIV——2条)两个单字节数的乘/除法运算只在A与B之间进行。MULAB:(A)与(B)相乘,积为16位数,(A)积的高8位;(B)积的低8位DIVAB:(A)除以(B),结果用2字节表示,(A)商的整数部分;(B)余数(二)算术运算类指令(续)BCD码是指“用二进制表达的十进制数”。如:十进制数20可以用二进制数00010100B表示;也可以用十六进制数14H表示;还可以用BCD码00100000B或20H表示。4个二进制位就可以表示一位BCD码:0000~1001可表示十进制数(BCD数)0~9;8个二进制位就可以表示两位压缩的BCD码:00000000~10011001表示00~99。十进制调整:(DAA——1条)用于两个BCD码之间的相加,这条指令只能跟在ADD或ADDC之后若(A)3~09或(AC)=1则(A)3~0(A)3~0+6;若(A)7~49或(CY)=1则(A)7~4(A)7~4+6;例5:两个十进制数“