12020/1/4第四章汇编语言程序设计4.1常用的伪指令1定义汇编起始位置伪指令ORGORGnn;nn为16位地址例如:ORG2000H;定义了下面指令的地址是从2000H开始MOVSP,#80H;设堆栈…….2赋值伪指令EQU字节名称EQU数据(或地址或汇编符号)例如:LED_ABEQU2000H;LED_AB等于2000HNUMBEQU30HKKEQUR0一般放在程序开头,赋值后不能更改22020/1/43定义字节常量DB(查表用)[标号:]DB8位二进数表例如:TAB1:DB12H,34H,77H,……TAB2:DB07H,44H,……4定义字常量DW(查表用)[标号:]DW16位二进数表例如:(每个字占个字节,高8位在先,低8位在后)ORG1000HTAB:DW1234H,3CH,……32020/1/45预留存储空间伪指令DS[标号:]DS表达式从定义地址开始保留DS之后表达式的值所规定的存储单元,以备后用。例如:ORG1000HDS08HDB30H,8AH汇编以后,从1000H保留8个单元,然后从1008H开始给内存赋值,即(1008H)=30H(1009H)=8AH42020/1/46位地址符号伪指令BIT位名称BITI/O口(或位地址)例如:CLKBITP1.4;定义P1.4为CLKAD_CSBITP1.6;定义P1.6为AD_CSFLGBIT00H;定义00H位地址为FLG7定义汇编结束指令END[标号:]END[地址或标号]END指令一定要放到程序的最后,否则不会编译!52020/1/44.2汇编程序设计过程1明确课题的任务(硬件/功能/精度等);2按功能,分块规划程序结构(模块设计/子程序);3分配存储器资源(定义变量/设堆栈….);4根据功能选择合适的指令组合;5对源程序进行编译,调试和修改;6烧写代码(下载代码….)。62020/1/4中断向量入口地址表中断源入口地址外部中断00003H定时计数器T0溢出000BH外部中断10013H定时计数器T1溢出001BH串行口中断0023H定时计数器T2溢出或T2EX输入负跳变002BH72020/1/44.3汇编程序的结构CLKBITP1.7;I/O口定义…..NUBEQU2020H;常数或地址定义….………….;定义变量或常数ORG0000H;复位入口地址(上电)LJMPMAIN;跳到主程序ORG0003H;INT0入口地址(P3.2)LJMPT_INT0;跳到INT0中断程序ORG000BH;定时器T0入口地址(P3.4)LJMPT_T0;跳到T0中断程序ORG0013H;INT1入口地址(P3.3)LJMPT_INT1;跳INT1中断程序ORG001BH;定时器T1入口地址(P3.5)LJMPT_T1;跳T1中断程序ORG0023H;串口入口地址(P3.0,P3.1)LJMPT_CK;跳串口中断程序………..;82020/1/4ORG0100HT_INT0:……..;INT0中断子程序RETIT_INT1:……;INT1中断子程序RETIT_T0:……;T0中断子程序RETIT_T1:……;T1中断子程序RETIT_CK:……;串口中断子程序RETI…………;其他子程序……..;MAIN:MOVSP,#90H;设堆栈(主程序部分)MOVIE,#00H;………;其他指令END;结束92020/1/4顺序程序分支程序单分支双分支多分支循环程序单重循环多重循环常用程序结构102020/1/4顺序程序例1:4字节(双字)加法。将内部RAM30H开始的4个单元中存放的4字节十六进制数和内部RAM40H单元开始的4个单元中存放的4字节十六进制数相加,结果存放到40H开始的单元中。(如图所示)30H31H33H32H加数1存放处4FH23HABHA0H43H42H41H40H7BH56H80HE8H加数2存放处43H42H41H40HCAH79H2BH89H相加结果存放处+A0AB234FE880567B892B79CA1112020/1/4ORG0000HMOVA,30HADDA,40HMOV40H,A;最低字节加法并送结果MOVA,31HADDCA,41HMOV41H,A;第二字节加法并送结果MOVA,32HADDCA,42HMOV42H,A;第三字节加法并送结果MOVA,33HADDCA,43HMOV43H,A;第四字节加法并送结果,进位位在CY中SJMP$END源程序:122020/1/4132020/1/4分支程序条件成立?程序段下条指令NY程序段1条件成立?程序段2NY程序段2条件N=?程序段N-10N程序段1程序段N1N-1……多分支单分支双分支142020/1/4单分支程序例2:如图所示,设计一段程序实现功能:如果寄存器A中1的个数为奇数,所有的二极管发光;如果全0,则只让D1-D4发光;否则全灭。30P152020/1/4开始位P=1?A=0?P2FFHP200HP20FH结束YYNNORG0000HMOVA,#00011100BJBP,JISHUJZQUANMOVP2,#00HSJMPTOendJISHU:MOVP2,#0FFHSJMPTOendQUAN:MOVP2,#0FHTOend:SJMP$END流程图:源程序:判断奇偶标志位的值判断A的值是否为0A有偶数个1,二极管灭A有奇数个1,二极管全亮A为0,D1-D4亮162020/1/4A中1的个数为奇数30P172020/1/4A中1的个数为030P182020/1/4A中1的个数为偶数30P192020/1/4双分支程序例3:内部RAM的40H单元和50H单元各存放了一个8位无符号数,请比较这两个数的大小,比较结果用发光二极管显示(LED为高有效):若(40H)≥(50H),则P2.0管脚连接的D1发光;若(40H)<(50H),则P2.1管脚连接的D2发光。202020/1/4流程图X-YX≥Y,D1点亮CY=1?X<Y,YND2点亮开始结束XEQU40HYEQU50HORG0000HMOVP2,#0MOVX,#78HMOVY,#0F0HMOVA,XCLRCSUBBA,YJCL1;CY=1,转移到L1SETBP2.0;CY=0,(40H)≥(50H),点亮P2.0SJMPFIN;直接跳转到结束等待L1:SETBP2.1;(40H)(50H),点亮P2.1FIN:SJMP$END源程序212020/1/4多分支程序例4:在某单片机系统中,按下一按键,键值(代表哪个键被按下)存放在内部RAM的40H单元内。设计一段程序实现功能:如果(40H)=00H,调用子程序SUB1;如果(40H)=01H,调用子程序SUB2;如果(40H)=02H,调用子程序SUB3;如果(40H)=03H,调用子程序SUB4;如果(40H)=04H,调用子程序SUB5。222020/1/4流程图……..(40H)=?调SUB1调SUB2调SUB3调SUB4调SUB5=00H=02H=03H=04H=01H232020/1/4源程序……MOVA,40HMOVB,#3MULABMOVDPTR,#TABJMP@A+DPTR……TAB:LJMPSUB1LJMPSUB2LJMPSUB3LJMPSUB4LJMPSUB5(40H)×3传送给A查表转移转移地址表对AJMP指令应将分支序号乘以2,转移范围为2KB;对LJMP指令应将分支序号乘以3,转移范围为64KB。242020/1/4循环程序循环次数够否?循环初始化置循环次数循环体下一条指令NY252020/1/4定时程序:用循环程序将指令重复多次执行,实现软件延时。单重循环延时例5:假设单片机的fosc=12MHz,计算单片机执行下面程序消耗的时间。DELAY:MOVR5,#TIME;1机器周期MM:NOP;1机器周期NOP;1机器周期DJNZR5,MM;2机器周期RET;2机器周期1T=12/12MHZ=1s执行完以上5条语句,所花时间:Tdelay=(1+(1+1+2)×TIME+2)×1s第一条和第五条指令延时时间可忽略不计Tdelay=4×TIME×1s最长定时:TIME=255时,Tdelay≈1ms262020/1/4多重循环延时例6:假设单片机的fosc=12MHz,计算单片机执行下面程序消耗的时间。DELAY:MOVR3,#TIME1;1机器周期LOOP1:MOVR2,#TIME2;1机器周期LOOP2:NOP;1机器周期NOP;1机器周期NOP;1机器周期NOP;1机器周期NOP;1机器周期NOP;1机器周期DJNZR2,LOOP2;2机器周期DJNZR3,LOOP1;2机器周期RET;2机器周期执行完以上语句(第一条和最后一条语句执行时间忽略不计),所花时间:Tdelay=(1+(6+2)×TIME2+2)×TIME1×1sTIME1=TIME2=250时,Tdelay≈500ms则:MOVR0,#02LOOP3:LCALLDELAYDJNZR0,LOOP3可实现1s延时272020/1/4练习参照下图设计一个彩灯控制程序,让8个led按照自己的设想发光,显示的样式尽可能的丰富。282020/1/4292020/1/4HD-51-A型学习/开发板302020/1/4原理图312020/1/4ORG0000HSTART:CLRP1.0;第一个LED亮SETBP1.1;第二个LED灭LCALLDELAY;延时0.5秒SETBP1.0;第一个LED灭CLRP1.1;第二个LED亮LCALLDELAY;延时0.5秒SJMPSTART;反复循环;延时子程序,12M晶振延时约500毫秒DELAY:MOVR4,#4L3:MOVR2,#250L1:MOVR3,#250L2:DJNZR3,L2DJNZR2,L1DJNZR4,L3RETENDSTART流水灯程序322020/1/4332020/1/4LED(LightEmittingDiode)八段数码管数码管外形agdfecbdpabcdefgdp(a)共阴极GNDVccabcdefgdp(b)共阳极342020/1/4编码abcdefgdpD7D6D5D4D3D2D1D0P2.7P2.6P2.5P2.4P2.3P2.2P2.1P2.000000011数码管外形agdfecbdp显示字形“0”,编码:03H10011111数码管外形agdfecbdp显示字形“1”,编码:9FH00100101数码管外形agdfecbdp显示字形“2”,编码:25H00001101数码管外形agdfecbdp显示字形“3”,编码:0DH10011001数码管外形agdfecbdp显示字形“4”,编码:99H01001001数码管外形agdfecbdp显示字形“5”,编码:49H01000001数码管外形agdfecbdp显示字形“6”,编码:41H00011111数码管外形agdfecbdp显示字形“7”,编码:1FH00000001数码管外形agdfecbdp显示字形“8”,编码:01H00001001数码管外形agdfecbdp显示字形“9”,编码:09H00010001数码管外形agdfecbdp显示字形“A”,编码:11H11000001数码管外形agdfecbdp显示字形“b”,编码:0C1H01100011数码管外形agdfecbdp显示字形“C”,编码:63H10000101数码管外形agdfecbdp显示字形“d”,编码:85H01100001数码管外形agdfecbdp显示字形“E”,编码:61H01110001数码管外形agdfecbdp显示字形“F”,编码:71H00110000数码管外形agdfecbdp显示字形“P.”,编码:30H352020/1/4按键通常,按键所用开关为机械弹性开关,一般为常开型,不按下时触点断开,按下时闭合。按键按下和松开的瞬间,伴随有一连串的抖动,抖动时间一般为5~10ms。检测出键闭合后,再