单片机与嵌入式系统4_第1页
单片机与嵌入式系统4_第2页
单片机与嵌入式系统4_第3页
单片机与嵌入式系统4_第4页
单片机与嵌入式系统4_第5页
已阅读5页,还剩47页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第四章

汇编语言程序设计4.1常用的伪指令<1>定义汇编起始位置伪指令ORG

ORGnn;nn为16位地址例如:ORG2000H;定义了下面指令的地址是从2000H开始

MOVSP,#80H;设堆栈

…….<2>赋值伪指令EQU字节名称EQU数据(或地址或汇编符号)例如:LED_ABEQU2000H;LED_AB等于2000HNUMBEQU30HKKEQUR0

一般放在程序开头,赋值后不能更改2/4/2023<3>定义字节常量DB(查表用)

[标号:]DB8位二进数表例如:TAB1:DB12H,34H,77H,……TAB2:DB07H,44H,……<4>定义字常量DW(查表用)

[标号:]DW16位二进数表例如:(每个字占个字节,高8位在先,低8位在后)ORG1000HTAB:DW1234H,3CH,……2/4/2023<5>预留存储空间伪指令DS[标号:]DS表达式从定义地址开始保留DS之后表达式的值所规定的存储单元,以备后用。例如:

ORG

1000HDS

08HDB

30H,8AH

汇编以后,从1000H保留8个单元,然后从1008H开始给内存赋值,即

(1008H)=30H(1009H)=8AH2/4/2023<6>位地址符号伪指令BIT位名称BITI/O口(或位地址)例如:CLKBITP1.4;定义P1.4为CLKAD_CSBITP1.6;定义P1.6为AD_CSFLGBIT00H;定义00H位地址为FLG<7>定义汇编结束指令END

[标号:]END[地址或标号]END指令一定要放到程序的最后,否则不会编译!2/4/20234.2汇编程序设计过程

<1>明确课题的任务(硬件/功能/精度等);<2>按功能,分块规划程序结构(模块设计/子程序);<3>分配存储器资源(定义变量/设堆栈….);<4>根据功能选择合适的指令组合;<5>对源程序进行编译,调试和修改;<6>烧写代码(下载代码….)。2/4/2023中断向量入口地址表中

入口地址

外部中断0

0003H

定时计数器T0溢出

000BH

外部中断1

0013H

定时计数器T1溢出

001BH

串行口中断

0023H

定时计数器T2溢出或T2EX输入负跳变

002BH

2/4/20234.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;跳串口中断程序

………..;

2/4/2023

ORG0100HT_INT0:……..;INT0中断子程序

RETIT_INT1:……;INT1中断子程序

RETIT_T0:……;T0中断子程序

RETIT_T1:……;T1中断子程序

RETIT_CK:……;串口中断子程序

RETI…………;其他子程序……..;MAIN:MOVSP,#90H;设堆栈(主程序部分)MOVIE,#00H;………;其他指令

END;结束2/4/2023顺序程序分支程序单分支双分支多分支循环程序

单重循环多重循环常用程序结构2/4/2023顺序程序例1:4字节(双字)加法。将内部RAM30H开始的4个单元中存放的4字节十六进制数和内部RAM40H单元开始的4个单元中存放的4字节十六进制数相加,结果存放到40H开始的单元中。(如图所示)30H31H33H32H加数

1存放处4FH23HABHA0H43H42H41H40H

7BH

56H

80H

E8H加数

2存放处43H42H41H40HCAH79H2BH89H相加结果存放处+A0AB234FE880567B892B79CA12/4/2023

ORG 0000H MOV A,30H ADD A,40H MOV 40H,A ;最低字节加法并送结果

MOV A,31H ADDC A,41H MOV 41H,A ;第二字节加法并送结果MOV A,32H ADDCA,42H MOV 42H,A ;第三字节加法并送结果

MOV A,33H ADDC A,43H MOV 43H,A;第四字节加法并送结果,进位位在CY中

SJMP$ END源程序:2/4/20232/4/2023分支程序条件成立?程序段下条指令NY程序段1条件成立?程序段2NY程序段2条件N=?程序段N-10N程序段1程序段N1N-1……多分支单分支双分支2/4/2023单分支程序例2:如图所示,设计一段程序实现功能:如果寄存器A中1的个数为奇数,所有的二极管发光;如果全0,则只让D1-VD4发光;否则全灭。2/4/2023开始位P=1?A=0?P2FFHP200HP20FH结束YYNN

ORG0000HMOVA,#00011100BJBP,JISHUJZ QUANMOVP2,#00HSJMP TOendJISHU:MOVP2,#0FFHSJMPTOendQUAN:MOVP2,#0FHTOend:SJMP$END流程图:源程序:判断奇偶标志位的值判断A的值是否为0A有偶数个1,二极管灭A有奇数个1,二极管全亮A为0,D1-D4亮2/4/2023A中1的个数为奇数2/4/2023A中1的个数为02/4/2023A中1的个数为偶数2/4/2023双分支程序例3:内部RAM的40H单元和50H单元各存放了一个8位无符号数,请比较这两个数的大小,比较结果用发光二极管显示(LED为高有效):若(40H)≥(50H),则P2.0管脚连接的D1发光;若(40H)<(50H),则P2.1管脚连接的D2发光。2/4/2023流程图X-YX≥Y,D1点亮CY=1?X<Y,

YND2点亮开始结束

XEQU40HYEQU50HORG 0000HMOVP2,#0MOVX,#78H

MOVY,#0F0HMOVA,X CLRC SUBBA,Y JCL1 ;CY=1,转移到

L1 SETBP2.0 ;CY=0,(40H)≥(50H),点亮P2.0SJMPFIN;直接跳转到结束等待L1:SETBP2.1 ;(40H)<(50H),点亮P2.1FIN:SJMP$END

源程序2/4/2023多分支程序例4:在某单片机系统中,按下一按键,键值(代表哪个键被按下)存放在内部RAM的40H单元内。设计一段程序实现功能:如果(40H)=00H,调用子程序SUB1;如果(40H)=01H,调用子程序SUB2;如果(40H)=02H,调用子程序SUB3;如果(40H)=03H,调用子程序SUB4;如果(40H)=04H,调用子程序SUB5。2/4/2023流程图……..(40H)=?调SUB1调SUB2调SUB3调SUB4调SUB5=00H=02H=03H=04H=01H2/4/2023源程序

……MOVA,40HMOVB,#3MULABMOVDPTR,#TABJMP@A+DPTR……TAB:LJMPSUB1LJMPSUB2LJMPSUB3LJMPSUB4LJMPSUB5(40H)×3传送给A

查表转移转移地址表

对AJMP指令应将分支序号乘以2,转移范围为2KB;

对LJMP指令应将分支序号乘以3,转移范围为64KB。2/4/2023循环程序循环次数够否?循环初始化置循环次数循环体下一条指令NY2/4/2023定时程序:用循环程序将指令重复多次执行,实现软件延时。单重循环延时

例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≈1ms2/4/2023多重循环延时例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延时2/4/2023练习参照下图设计一个彩灯控制程序,让8个led按照自己的设想发光,显示的样式尽可能的丰富。2/4/2023HD-51-A型学习/开发板2/4/2023原理图2/4/2023

ORG 0000HSTART:CLR P1.0 ;第一个LED亮

SETB P1.1;第二个LED灭

LCALL DELAY ;延时0.5秒

SETB P1.0;第一个LED灭

CLR P1.1 ;第二个LED亮

LCALL DELAY ;延时0.5秒

SJMP START ;反复循环

;延时子程序,12M晶振延时约500毫秒DELAY:MOV R4,#4L3:MOV R2,#250L1: MOV R3,#250L2: DJNZ R3,L2 DJNZ R2,L1 DJNZ R4,L3 RET ENDSTART流水灯程序2/4/20232/4/2023LED(LightEmittingDiode)八段数码管数码管外形agdfecbdpabcdefgdp(a)共阴极GNDVccabcdefgdp(b)共阳极2/4/2023编码abcdefg

dpD7D6D5D4D3D2D1D0P2.7P2.6P2.5P2.4P2.3P2.2P2.1P2.0

0

0000011数码管外形agdfecbdp显示字形“0”,编码:03H

1

0011111数码管外形agdfecbdp显示字形“1”,编码:9FH

0

0100101数码管外形agdfecbdp显示字形“2”,编码:25H

0

0001101数码管外形agdfecbdp显示字形“3”,编码:0DH

1

0011001数码管外形agdfecbdp显示字形“4”,编码:99H

0

1001001数码管外形agdfecbdp显示字形“5”,编码:49H

0

1000001数码管外形agdfecbdp显示字形“6”,编码:41H

0

0011111数码管外形agdfecbdp显示字形“7”,编码:1FH

0

0000001数码管外形agdfecbdp显示字形“8”,编码:01H

0

0001001数码管外形agdfecbdp显示字形“9”,编码:09H

0

0010001数码管外形agdfecbdp显示字形“A”,编码:11H

1

1000001数码管外形agdfecbdp显示字形“b”,编码:0C1H

0

1100011数码管外形agdfecbdp显示字形“C”,编码:63H

1

0000101数码管外形agdfecbdp显示字形“d”,编码:85H

0

1100001数码管外形agdfecbdp显示字形“E”,编码:61H

0

1110001数码管外形agdfecbdp显示字形“F”,编码:71H

0

0110000数码管外形agdfecbdp显示字形“P.”,编码:30H2/4/2023按键通常,按键所用开关为机械弹性开关,一般为常开型,不按下时触点断开,按下时闭合。按键按下和松开的瞬间,伴随有一连串的抖动,抖动时间一般为5~10ms。检测出键闭合后,再执行一个10ms左右的延时程序,以避开抖动时间,等信号稳定后再进行按键查询,如果仍保持闭合,则确认有键按下,否则认为是抖动。2/4/2023例:按键则数码管增一开始K1按下?数码管初始显示为0延时10ms再次判断K1按下?K1抬起?数码管增1显示是否否是是否2/4/2023按键则数码管增一程序K1BITP1.4SMG_SELBITP1.7SMGDATA30H ORG0000H LJMPMAIN ORG0030HMAIN:MOVP2,#03H;初始显示0 CLRSMG_SEL;选通数码管

L1:JBK1,L1;K1未按下,等待

ACALLDELAY;K1按下,延时去抖动

JBK1,L1;再判K1是否按下,未按下则认为是抖动

JNBK1,$ ;判按键是否松开,没松开则等待

L2:INCSMG;数码管增一

MOVA,SMG ANLA,#0FH ACALLDISP;调用显示子程序

SJMPL12/4/2023按键则数码管增一程序(续);-------------延时子程序------------------DELAY:MOVR7,#20DL1:MOVR6,#00DJNZR6,$ DJNZR7,DL1 RET;------------显示子程序-------------------DISP:MOVDPTR,#DISP_CODE;DISP_CODE为编码表首地址

MOVCA,@A+DPTR MOVP2,A RETDISP_CODE:DB03H,9FH,25H,0DH,99H,49H,41H,1FHDB01H,09H,11H,0C1H,63H,85H,61H,71H ;对应数码:0123456789AbCdEF ENDMAIN2/4/2023外扩RAM、ROM时,使用锁存器2/4/20238D锁存器2/4/2023一、扩展的基本信息(1)地址总线(AddressBus,AB)

A15….A8,A7…A0

(2)数据总线(DataBus,DB)

D7….D0

(3)控制总线(ControlBus,CB)

/WR、/RD、/PSEN、/EA、ALE2/4/20232/4/20232/4/2023外部数据和常数访问方法1.外部数据访问

MOVXA,@DPTRMOVX@DPTR,AMOVXA,@RiMOVX@Ri,A2.常数访问

MOVCA,@A+DPTRMOVCA,@A+PC2/4/2023

复习单片机I/O端口逻辑结构

8051有4个8位并行I/O端口,记做P0、P1、P2和P3。这四个口都是准双向的I/O口,共占有32条管脚,每一条I/O线都能独立的用作输入或输出。

1、P0口(I/O、总线)2/4/20232、P1口(I/O口)2/4/20233、P2口(I/O口、总线)2/4/20234、P3口(I/O口、复用功能)2/4/2

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论