您好,欢迎访问三七文档
当前位置:首页 > 办公文档 > 述职报告 > 单片机教案(汇编语言程序设计)
计算机科学与软件学院计算机基础教学部本章重点教学目标:本章内容是软件编程的关键,地位重要。程序结构(顺序、分支、循环、子程序);应用实例;熟练掌握程序设计的思路方法和技巧;要求掌握典型算法;找到分析问题和解决问题的着眼点;学会抓住不同问题的规律性;举一反三,独立思考,有创意,有新意,独到。一、分清可执行指令和非执行指令及其功能二、将高级语言程序设计方法迁移到汇编语言程序设计中来三、特别注意汇编语言是面向机器的,要记住CPU的资源;存储器结构与寻址方式;I/O口、定时/计数器、中断系统等关键的参数;寄存器间接寻址中指针的选择和使用技巧。四、从宏观上看,MCS-51汇编语言程序的整体结构从微观上看,微机中各组成部分是如何通过程序联系起来。汇编语言程序设计的要点:4.1汇编语言程序设计基础4.2MCS-51单片机汇编语言程序设计第四章汇编语言程序设计4.1.1汇编语言与机器语言4.1.2汇编语言的格式4.1.3伪指令4.1.4汇编语言源程序的汇编4.1.5汇编语言程序设计的一般步骤4.1汇编语言程序设计基础4.2.1简单程序设计4.2.2分支程序设计4.2.3循环程序设计4.2.4查表程序设计4.2.5散转程序设4.2.6子程序设计4.2.7运算程序设计4.2MCS-51单片机汇编语言程序设计•机器语言–计算机唯一能够识别和执行的语言,面向机器,二进制。•汇编语言–“符号语言”,用指令助记符代表机器语言指令,面向机器。–要经过汇编。低级语言适合开发实时控制程序•高级语言–面向算法、过程、对象,类似自然语言,可移植性好,须经解释或翻译后才能被执行。4.1.1汇编语言与机器语言4.1.2汇编语言的格式标号段:LABEL操作码段OPCODE操作数段OPRAND;注释段COMMENT指令格式:•伪指令格式:–名字定义符参数,…,参数;注释或–[标号:]定义符项表;注释1.标号段标号段位于语句的开头,指明标号所在指令的首地址,标号又称为标号地址或符号地址,是一个可选项,只有需要时才设置。•绝对不允许把指令的保留字、寄存器号及伪指令字符作为语句的标号;•标号在同一程序单位中只能出现一次。2、操作码段•操作码段可以是可执行指令的助记符,操作码段用于指示计算机进行何种操作,因此,是任何一条语句中的必选项,汇编语言根据这一字段生成目标代码。•操作码段也可以是伪指令的助记符,对汇编程序下命令,在汇编时起作用。LOOP:MOVA,@R0……DJNZR2,LOOP3、操作数段操作数段用于存放指令的操作数或操作数地址,操作数的个数因指令的不同而不同,通常有三种情况:无操作数RET单操作数JCLOOP双操作数MOVA,B可以采用字母或数字等多种表示形式:(1)操作数是立即数,可用二进制、十进制和十六进制形式(2)作寄存器和特殊功能寄存器名MOVA,PSW(3)标号地址DJNZR7,NEXT(4)带加、减运算符的表达式,例:MOVA,#100-14、注释段:注释指令或程序的含义,便于阅读程序、维护程序。必须用“;”隔开,续行时,也必须以“;”开头。•常数:–01010101B;12D,12;0F1H,59H–67Q;‘A’,‘a’•操作数:–A,B,DPTR•表达式–movA,#(12H-03H)4.1.4汇编语言源程序的汇编汇编可分成两种:人工汇编机器汇编机器汇编是用机器自动把汇编语言源程序翻译成可以运行的目标代码程序,即二进制程序的过程,它是一种用机器来代替人脑的汇编,完成这一汇编过程的软件称为“汇编程序”。汇编机器语言目标程序汇编语言源程序汇编程序汇编机器语言目标程序汇编语言源程序人工查指令机器码表4.1.5汇编语言程序设计的一般步骤•程序设计的方法•程序设计的步骤程序设计的方法•结构化设计•模块化设计•开发方法–自底向上开发•先底层开发–自顶向下开发•先顶层开发–混合方法底顶程序设计的步骤•分析课题,确定算法和思路•根据算法和思路画出流程图•根据流程图编写程序•上机调试,排除错误流程图图例•起止框•处理框•判断框•连线开始结束XX+1YY-1F5?YN程序设计步骤流程图4.1.3伪指令•定义:仅向汇编程序发出的,并仅由汇编程序在汇编过程中识别和执行的一种汇编控制命令,它本身在目标程序中不产生机器码。•汇编起始伪指令:ORG•汇编结束伪指令:END•定义字节伪指令:DB•定义字伪指令:DW•定义位伪指令:BIT•赋值伪指令:EQUDATA汇编起始伪指令•格式:ORG起始地址•功能:指定汇编源程序编译成机器语言程序的起始地址–例如:ORG0000HLJMP0100HORG0100HStart:MOVA,#5AHSJMP$END程序中可以有多条ORG语句,但定义的起始地址既不要交叉,也不要重叠。必须从小地址向大地址分配程序所占空间。汇编结束伪指令•格式:END[起始地址]•功能:停止汇编•示例:ORG0000Hljmp0100HORG0100HStart:movA,#5Ahsjmp$END定义字节伪指令•格式:标号:DB项或项表•功能:把项或项表的数值存入从标号开始的连续单元,其中项或项表可以是一个字节、数或以引号括起来的字符串。ORG1000HDat:DB11h,-1,’A’,’BCD’END该指令只能为程序存储器赋初值,不能为其他存储器赋初值,尤其不能为内部数据存储器赋初值。1000H11HFFH41H42H程序存储器43H44H补码ASCII码‘’定义字伪指令•格式:标号:DW项或项表•功能:把项或项表的数值存入从标号开始的连续单元,其中项或项表是一个字(两字节)。ORG1000HDat:DW1122h,3344h,-1END1000H11H22H33H44H程序存储器FFHFFH定义位伪指令•格式:符号BIT位地址•功能:定义位变量地址UBIT20H.0VBIT20H.1WBIT20H.2XBITP1.0YBITP2.4ZBITP3.2QBITTCON.2赋值伪指令•格式:符号EQU变量值•功能:定义符号变量值XEQU05HYEQU06HNEXTEQU2000H格式:符号DATA变量值功能:定义符号变量值(内部RAM)ONEDATA30H(数据或地址)TWODATAONE+14.2.1简单程序设计语句1语句2语句n结束……Ø特点:从第一条指令开始依次执行每一条指令,直到程序执行完毕,中间没有转移指令,没有分支。只有一个入口一个出口。入口出口1、[例4-3]两位压缩的BCD码转换成相应的ASCII码算法1ANL拆字、ORL#30H拼字算法2DIV拆字、ORL#30H拼字存储两位BCD数指压缩的BCD码占一个单元相应的ASCII码占二个单元2、[例4-4]将8位无符号二进制数转换成三位BCD码算法1DIV100得百位,再DIV10的十位和个位算法2DIV10的个位,再DIV10的十位和百位存储8位无符号二进制数占一个单元个位、十位和百位各占一个单元4.2.2分支程序设计•用条件转移语句实现二分支•用cjne实现三分支•例4-6多分支•用jmp@A+DPTR实现多分支根据不同的条件,执行不同的程序段。JZ、JNZ、JC、JNC、JB、JNB、CJNE、DJNZ正确合理地运用用条件转移语句实现二分支条件语句组1语句组2YesNo入口出口用cjne实现三分支编程要点:cjne=等于≠不等于则:jc小于或jnc大于如何实现≤?≥?ORG0000HCjneR3,#15,NEQsjmpL1;=15NEQ:jnCL1;15sjmpL2;15L1:nop;≥15……L2:≠?Cy=0?语句组1语句组2语句组3入口YesYesNoNoCJNE出口或CY=1?y=000011xxx(R0)x(R1)y2、判正负CJNER0,#0,NZEROCLRCMOVA,R0SUBBA,#0JZZEROMOVA,R0JZZERO其它方法?分析:1、判零MOVA,R0JNBACC.7,positiveCJNER0,#7FH,DO1SJMPpositiveDO1:JCpositive……;negativePositive:….∴0FFH~80Hnegative00H~7FHpositive用cjne实现三分支cjneR0,#0,MP1movR1,#0sjmpMP3MP1:movA,R0jnbACC.7,MP2movR1,#0FFhsjmpMP3MP2:movR1,#01hMP3:sjmp$endy=000011xxx开始结束y0y-1y+1x=0?x0?YYNN(R0)x(R1)y判正负判零分支间隔离ORG1000HONEDATA30HTWODATA31HMAXDATA32HCLRCMOVA,ONESUBBA,TWOJZXMAXJBACC.7,NEGJBOV,YMAXSJMPXMAXNEG:JBOV,XMAXYMAX:MOVA,TWOSJMPRMAXXMAX:MOVA,ONERMAX:MOVMAX,ASJMP$END[例4-6]ONE和TWO单元中的两个带符号数比较大小,将较大者存入MAX单元中。两数相等则任一个存入MAX即可。若X-Y为负,则OV=0,XYOV=1,XY若X-Y为正,则OV=0,XYOV=1,XY用jmp@A+DPTR实现多分支KeyB5:movDPTR,#JMPTBLclrCsubbA,#0AhrlAJMP@A+DPTRJMPTBL:ajmpAAAajmpBBBajmpCCCajmpDDDAAA:……BBB:…键入10,转AAA11,转BBB12,转CCC13,转DDDCCC:……DDD:……(A)=?语句组1语句组2语句组3语句组40AH0BH0CH0DH入口AAABBBCCCDDD4.2.3循环程序设计•循环程序结构•循环程序通常有两种编制方法•循环问题的类型•循环程序设计举例循环程序结构•循环初始化:循环控制变量的初始化、数据变量的初始化•循环工作部分:循环主体,重复执行的部分•循环控制部分:循环变量的修改、终止控制•循环结束:这部分程序用于存放执行循环程序所得结果以及恢复各单元的初值。1、先循环处理后循环控制,称为直到型循环;2、先循环控制后循环处理,称为当型循环。循环程序通常有两种编制方法1、计数型—举例循环次数已知,用计数方法控制循环的终止。2、条件型—循环次数未知,根据某种条件判断是否终止循环。[例4-7]内部RAM块传,遇到“#”字符结束3、计数型+条件型[例4-8]8031外部RAM块传及冒泡排序重点循环问题的类型•单循环程序–例1:多个单字节数求累加和计数型–例2:内部数据区清零计数型–[例4-7]内部RAM块传改为条件型没讲•多重循环程序–例3:50ms延时程序计数型–[例4-7]内部RAM块传计数型+条件型没讲–[例4-8]外部RAM块冒泡排序重点计数型+条件型没讲循环程序设计举例例1:多个单字节数求累加和ORG0000HSUM:movR3,#0movR4,#0movR0,#50HmovR2,#5Loop:movA,R4addA,@R0movR4,AincR0clrAaddcA,R3movR3,AdjnzR2,Loopsjmp$END内部RAM50HR0R4R3R4R3@R0CY+ADDCADD23H98H0A8H0FDH6DH累加和单元要先请零∑例2:内部数据区清零ORG0000HZero:movR0,#30HmovR7,#10movA,#00HLoop:mov@R0,AincR0djnzR7,Loopsjmp$END内部RAM30HR023H98H0A8H0FDH…00000010个例3:50ms延时程序Delay:movR7,#200Del1:movR6,#123nopDel2:djnzR6,Del2djnzR7,Del1sjmp$;(不计入);1us;1us;1us;2us;2usT=[200×(1+1+123×2+2)+1]×1us=50001us=50ms[例4-7]把内部RAM
本文标题:单片机教案(汇编语言程序设计)
链接地址:https://www.777doc.com/doc-3599856 .html