




免费预览已结束,剩余37页可下载查看
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第4章MCS-51单片机程序设计,4.1MCS-51单片机汇编语言简介汇编语言的形式,汇编语言格式,ORG0000HSTART:MOVA,#00H;A0MOVR2,#0AH;R210MOVR1,#03H;R13LOOP:ADDA,R1;AA+R1DJNZR2,LOOP;若R2-10,则LOOPNOPSJMP$END,(1)标号字段位于语句的开头,指明指令操作码地址,(2)操作码字段必选项不可缺,由汇编程序生成目标代码,(3)操作数字段操作数或操作数地址,通常有单、双和无操作数3种形式,表示形式有5种1)二进制十进制十六进制形式MOVA,#10001010BMOVA,#138MOVA,#8AH,若16进制A-F,则需前加0,如MOVA,#0FFH2)工作寄存器和特殊功能寄存器3)标号地址如MOVA,M14)带加减算符表达式如MOVA,M1+15)采用$符如SJMP$(4)注释字段任选项,以;开始,不产生机器码,汇编语言构成1、指令性语句:产生机器代码2、指示性语句即伪指令:不产生机器代码,几个汇编概念汇编语言程序:用汇编语言编写的、完成特定功能的指令序列。汇编程序:能将汇编语言源程序转换成机器语言目标程序的系统软件。汇编语言程序到机器语言程序的转换过程称为汇编。有两种1、手工汇编:人工查指令表汇编。用于设计短小程序或调试程序的场合。2、机器汇编:用汇编程序进行汇编。汇编的主要任务:1)确定程序中每条汇编语言指令的指令机器码。2)确定每条指令在存储器中的存放地址。3)提供错误信息。4)提供目标执行文件(*.OBJ/*.HEX)和列表文件(*.LST)。,4.2MCS-51单片机汇编语言常用伪指令,伪指令是放在汇编语言源程序中用于指示汇编程序如何对源程序进行汇编的指令,它不同于指令系统中的指令,指令系统中的指令在汇编程序汇编时能够产生相应的指令代码,而伪指令在汇编程序汇编时不会产生代码,只是对汇编过程进行相应的控制和说明。常用的伪指令只有几条。,1ORG伪指令格式:ORG地址(十六进制表示)这条伪指令放于一段源程序或数据的前面,汇编时用于指明程序或数据从程序存储空间什么位置开始存放。ORG伪指令后的地址是程序或数据的起始地址。【例4-1】ORG1000HSTART:MOVA,#7FH指明后面的程序从程序存储器的1000H单元开始存放。,2DB伪指令格式:标号:DB项或项表DB伪指令用于定义字节数据,可以定义一个字节,也可定义多个字节,字义多个字节时,两两之间用逗号间隔,定义的多个字节在存储器中是连续存放的。定义的字节可以是一般常数,也可以为字符,还可以是字符串,字符和字符串以引号括起来,字符数据在存储器中以ASCII码形式存放。在定义时前面可以带标号,定义的标号在程序中是起始单元的地址。【例4-2】ORG3000HTAB1:DB12H,34HDB5,A,abc汇编后,各个数据在存储单元中的存放情况如下:,3DW伪指令格式:标号:DW项或项表这条指令与DB相似,但用于定义字数据。项或项表指所定义的一个字在存储器中占两个字节。汇编时,机器自动按高字节在前,低字节在后,即高字节存放在低地址单元,低字节存放在高地址单元。【例4-3】ORG3000HTAB2:DW1234H,5678H汇编后,各个数据在存储单元中的存放情况如下:,4DS伪指令格式:标号:DS数值表达式该伪指令用在存储器中保留一定数量的字节单元。保留存贮空间主要为以后存放数据。保留的字节单元数由表达式的值决定。【例4-4】ORG2000HTAB1:DB12H,34HDS4HDB5汇编后,存储单元中的分配情况如下:,5EQU伪指令格式:符号EQU项该伪指令的功能是将指令中的项的值赋予EQU前面的符号。项可以是常数、地址标号或表达式。以后可以通过使用该符号使用相应的项。【例4-5】TAB1EQU1000HTAB2EQU2000H汇编后TAB1、TAB2分别等于1000H、2000H。程序后面使用1000H、2000H的地方就可以用符号TAB1、TAB2替换。用EQU伪指令对某标号赋值后,该符号的值在整个程序中不能再改变。,6bit伪指令格式:符号bit位地址bit该伪指令用于给位地址赋予符号,经赋值后可用该符号代替bit后面的位地址。【例4-6】PLGbitF0AIbitP1.0定义后,在程序中位地址F0、P1.0就可以通过FLG和AI来使用。,7END伪指令格式:END该指令放于程序最后位置,用于指明汇编语言源程序的结束位置,当汇编程序汇编到END伪指令时,汇编结束。END后面的指令,汇编程序都不予处理。一个源程序只能有一个END命令,否则就有一部分指令不能被汇编。,4.3MCS-51系列单片机汇编程序设计,4.3.1数据传送程序例【4-7】把片内RAM的40H-4FH的16字节的内容传送到片外RAM的2000H单元位置处。ORG1000HMOVR0,#40HMOVDPTR,#2000HMOVR2,#16LOOP:MOVA,R0MOVXDPTR,AINCR0INCDPTRDJNZR2,LOOPRET,4.3.2运算程序,【例4-8】多字节无符号数加法,设从片内RAM30H单元和40H单元有两个16字节数,把它们相加,结果放于30H单元开始的位置处(设结果不溢出)。处理过程:用R0作指针指向30H单元,用R1作指针指向40H单元,用R2为循环变量,初值为16,在循环体中用ADDC指令把R0指针指向的单元与R1指针指向的单元相加,加得的结果放回R0指向的单元,改变R0、R1指针指向下一个单元,循环16次,在第一次循环前应先将CY清零。程序流程图和程序如下:,程序:ORG1000HMOVR0,#30HMOVR1,#40HMOVR2,#16CLRCLOOP:MOVA,R0ADDCA,R1MOVR0,AINCR0INCR1DJNZR2,LOOPEND,4.3.3数据的拼拆和转换,【例4-9】设在30H和31H单元中各有一个8位数据:(30H)=x7x6xx4xx2x1x0(3lH)=y7y6yy4yy2y1y0现在要从30H单元中取出低5位,并从31H单元中取出低3位完成拼装,拼装结果送40H单元保存,并且规定:(40H)=y2y1y0 x4xx2x1x0利用逻辑指令ANL、ORL、RL等来完成数据的拼拆,处理过程:将30H单元的内容高3位屏蔽;31H单元内容的低5位屏蔽,高低四位交换,左移一位;然后与30H单元的内容相或,拼装后放到40H单元。,程序如下:ORG0100HMOVA,30HANLA,#00011111BMOV30H,AMOVA,31HANLA,#00000111BSWAPA,RLAORLA,40HMOV40H,AEND,【例4-11】一位十六进制数转换成ASC1I码。一位十六进制数有十六个符号09、A、B、C、D、E、F。其中,09的ASCII码为30H39H,AF的ASCII码为41H46H,转换时,只要判断十六进制数是在09之间还是在AF之间,如在09之间,加30H,如在AF之间,加37H,就可得到ASCII码。设十六进制数放于R2中,转换的结果放于R2中。,程序如下:ORG0200HMOVA,R2CLRCSUBBA,#0AH;减去0AH,判断在09之间,还是在AF之间MOVA,R2JCADD30;如在09之间,直接加30HADDA,#07H;如在AF之间,先加07H,再加30HADD30:ADDA,#30HMOVR2,AEND,【例4-12】一位十六进制数转换8段式数码管显示码。一位十六进制数09、A、B、C、D、E、F的8段式数码管的共阴极显示码为3FH、06H、5BH、4FH、66H、6DH、7DH、07H、7FH、67H、77H、7CH、39H、5EH、79H、71H。由于数与显示码没有规律,不能通过运算得到,只能通过查表方式得到。数放在R2中,查得的显示码也放于R2中,用MOVCA,A+DPTR查表。程序如下:ORG0200HCONVERT:MOVDPTR,#TAB;DPTR指向表首址MOVA,R2;转换的数放于MOVCA,A+DPTR;查表指令转换MOVR2,ARETTAB:DB3FH,06H,5BH,4FH,66H,6DH,7DH,07HDB7FH,67H,77H,7CH,39H,5EH,79H,71H;显示码表在这个例子中,编码是一个字节,只通过一次查表指令就可实现转换,如编码是两个字节,则需要用两次查表指令才能查得编码,第一次取得低位,第二次取得高位。,【例4-13】在一温度控制系统中,温度0100C每一个温度值都已经通过温度传感器测得一个两字节的标准电压值。现在R2中给出一个0100C的温度值,取得它的标准电压值放于R3、R4中,低字节放在R3中,高字节放在R4中。通过用MOVCA,A+DPTR查表,两个字节分两次取得,由DPTR指向表首,由放于R2中的温度值得到所查的电压值相对于表首位置的位移量放于累加器A中,由于每一个电压值为两个字节,位移量须用R2中的温度值乘以2得到。第一次取得低字节,第二次位移量加1后查表取得高字节,分别放于R3、R4中。,程序如下:ORG0300HCHECK:MOVDPTR,#TAB;指向表首MOVA,R2;温度值送ARLA;乘2得位移量MOVR1,A;位移量暂存于R1中MOVCA,A+DPTRMOVR3,A;第一次查得内容送R3MOVA,R1;取出暂存的位移量送A,INCA;指向高字节MOVCA,A+DPTRMOVR4,A;第二次查得内容送R4RETTAB:DW0056H,0059H,0067H,0076H;电压值表,3.5.3多分支转移(散转)程序,一用多分支转移指令JMPA+DPTR实现的多分支转移程序,【例4-14】现有128路分支,分支号分别为0127,要求根据R2中的分支信息转向各个分支的程序。即当(R2)=0,转向OPR0(R2)=1,转向OPRl(R2)=127,转向OPR127,先用无条件转移指令(“AJMP”或“LJMP”)按顺序构造一个转移指令表,执行转移指令表中的第n条指令,就可以转移到第n个分支,将转移指令表的首地址装入DPTR中,将R2中的分支信息装入累加器A形成变址值。然后执行多分支转移指令JMPA+DPTR实现转移。程序清单如下:MOVA,R2RLA;分支信息乘2MOVDPTR,#TAB;DPTR指向转移指令表首址JMPA+DPTR;转向形成的散转地址TAB:AJMPOPR0;转移指令表AJMPOPR1AJMPOPR127,转移指令表中的转移指令是由LJMP指令构成,程序如下:ORG0200HMOVDPTR,#TAB;DPTR指向转移指令表首址MOVA,R2;分支信息放累加器A中MOVB,#3MULAB;分支信息乘3XCHA,BADDA,DPH;高字节调整到DPH中MOVDPH,AXCHA,BJMPA+DPTR;转向形成的散转地址TAB:LJMPOPR0;转移指令表LJMPOPR1LJMPOPR2LJMPOPR127,转移指令表中的转移指令是由AJMP指令构成,如果分支数大于128个,如分支数有256个,ORG0200HMOVDPTR,#TAB;DPTR指向转移指令表首址MOVA,R2;分支信息放累加器A中RLA;分支信息乘2JNCNEXTINCDPH;高字节调整到DPH中NEXT:JMPA+DPTR;转向形成的散转地址TAB:LJMPOPR0;转移指令表LJMPOPR1LJMPOPR2LJMPOPR127,二采用RET指令实现的多分支程序,用RET指令实现多分支程序的方法是:先把各个分支的目的地址按顺序组织成一张地址表,在程序中用分支信息去查表,取得对应分支的目的地址,按先低字节,后高字节的顺序压入堆栈,然后执行RET指令,执行后则转到对应的目的位置。,【例4-15】用RET指令实现根据R2中的分支信息转到各个分支程序的多分支转移程序。设各分支的目的地址分别为addr00、addr01、addr02、addrFF。程序如下:MOVDPTR,#TAB3;DPTR指向目的地址表MOVA,R2;分支信息放累加器A中RLA;分支信息乘2JNCNEXTINCDPH;高字节调整到DPH中NEXT:MOVR3,A;变址放于R3中暂存MOVCA,A+DPTR;取目的地址低8位PUSHACC;低8位地址入栈,MOVA,R3;取出R3中变址到累加器AINCA;加1得到目的地址高8位单元的变址MOVCA,A+DPTR;取转向地址低8位PUSHACC;高8位地址入栈RET;转向目的地址TAB3:DWaddr00;目的地址表DWaddrD0lDWaddrFF上述程序执行后,将根据R2中的分支信息转移到对应的分支程序。,4.3.5延时程序设系统时钟频率为12MHZ,下面是延时10ms的程序DEL10ms:MOVR6,#20;1个机器周期DEL1:MOVR7,#249;1个机器周期DJNZR6,$;2个机器周期DJNZR6,DEL1;2个机器周期RET;2个机器周期,4.5MCS-51单片机内部资源及编程,MCS-51单片机的内部资源主要有并行I/O口、定时器/计数器、串行接口以及中断系统,MCS-51单片机的大部分功能就是通过对这些资源的利用来实现的。下面分别对其介绍,并用汇编语言和C语言分别给出相应例子。,4.5.1并行口应用与编程,【例4-25】利用单片机的P1口接8个发光二极管,P0口接8个开关,编程实现,当开关动作时,对应的发光二极管亮或灭。只须把P0口的内容读出后,通过P1口输出即可。汇编程序:ORG0100HMOVP0,#0FFHLOOP:MOVA,P0MOVP1,ASJMPLOOP,4.5.2定时/计数器的初始化编程及应用,一定时/计数器的编程,MCS-51单片机定时/计数器初始化过程如下:1根据要求选择方式,确定方式控制字,写入方式控制寄存器TMOD。2根据要求计算定时/计数器的计数值,再由计数值求得初值,写入初值寄存器。3根据需要开放定时/计数器中断(后面须编写中断服务程序)。4设置定时/计数器控制寄存器TCON的值,启动定时/计数器开始工作。5等待定时/计数时间到,到则执行中断服务程序;如用查询处理则编写查询程序判断溢出标志,溢出标志等于1,则进行相应处理。,二定时/计数器的应用,通常利用定时/计数器来产生周期性的波形。利用定时/计数器产生周期性波形的基本思想是:利用定时/计数器产生周期性的定时,定时时间到则对输出端进行相应的处理。如产生周期性的方波只须定时时间到对输出端取反一次即可。,【例4-26】设系统时钟频率为12MHZ,用定时/计数器T0编程实现从P1.0输出周期为500s的方波。分析:从P1.0输出周期为500s的方波,只须P1.0每250s取反一次则可。当系统时钟为12MHZ,定时/计数器T0工作于方式2时,最大的定时时间为256s,满足250s的定时要求,方式控制字应设定为00000010B(02H)。系统时钟为12MHZ,定时250s,计数值N为250,初值X=256-250=6,则TH0=TL0=06H。,汇编程序:ORG0000HLJMPMAINORG000BH;中断处理程序CPLP1.0RETIORG0100H;主程序MAIN:MOVTMOD,#02HMOVTH0,#06HMOVTL0,#06HSETBEASETBET0SETBTR0SJMP$END,C语言程序:#include/包含特殊功能寄存器库sbitP1_0=P10;voidmain()TMOD=0 x02;TH0=0 x06;TL0=0 x06;EA=1;ET0=1;TR0=1;while(1);voidtime0_int(void)interrupt1/中断服务程序P1_0=!P1_0;,(1)采用中断处理方式的程序:,(2)采用查询方式处理的程序,汇编程序:ORG0000HLJMPMAINORG0100H;主程序MAIN:MOVTMOD,#02HMOVTH0,#06HMOVTL0,#06HSETBTR0LOOP:JBCTF0,NEXT;查询计数溢出SJMPLOOPNEXT:CPLP1.0SJMPLOOPSJMP$END,C语言程序:#include/包含特殊功能寄存器库sbitP1_0=P10;voidmain()chari;TMOD=0 x02;TH0=0 x06;TL0=0 x06;TR0=1;for(;)if(TF0)TF0=0;P1_0=!P1_0;/查询计数溢出,如果定时时间大于65536s,这时用一个定时/计数器直接处理不能实现,这时可用两个定时/计数器共同处理或一个定时/计数器配合软件计数方式处理。,【例4-27】设系统时钟频率为12MHZ,编程实现从P1.1输出周期为1s的方波。根据例5-2的处理过程,这时应产生500ms的周期性的定时,定时到则对P1.1取反就可实现。由于定时时间较长,一个定时/计数器不能直接实现,可用定时/计数器T0产生周期性为10ms的定时,然后用一个寄存器R2对10ms计数50次或用定时/计数器T1对10ms计数50次实现。系统时钟为12MHZ,定时/计数器T0定时10ms,计数值N为10000,只能选方式1,方式控制字为00000001B(01H),初值X:X=65536-10000=55536=1101100011110000B则TH0=11011000B=D8H,TL0=11110000B=F0H。,(1)用寄存器R2作计数器软件计数,中断处理方式。汇编程序:ORG0000HLJMPMAINORG000BHLJMPINTT0ORG0100HMAIN:MOVTMOD,#01HMOVTH0,#0D8HMOVTL0,#0F0HMOVR2,#00HSETBEASETBET0SETBTR0SJMP$INTT0:MOVTH0,#0D8H,MOVTL0,#0F0HINCR2CJNER2,#32H,NEXTCPLP1.1MOVR2,#00HNEXT:RETIEND,C语言程序:#include/包含特殊功能寄存器库sbitP1_1=P11;chari;voidmain()TMOD=0 x01;TH0=0 xD8;TL0=0 xf0;EA=1;ET0=1;i=0;TR0=1;while(1);voidtime0_int(void)interrupt1/中断服务程序TH0=0 xD8;TL0=0 xf0;i+;if(i=50)P1_1=!P1_1;i=0;,(2)用定时/计数器T1计数实现,定时/计数器T1工作于计数方式时,计数脉冲通过T1(P3.5)输入,设定时/计数器T0定时时间到对T1(P3.5)取反一次,则T1(P3.5)每20ms产生一个计数脉冲,那么定时500ms只须计数25次,设定时/计数器T1工作于方式2,初值X=256-25=231=11100111B=E7H,TH1=TL1=E7H。因为定时/计数器T0工作于方式1,定时,则这时方式控制字为01100001B(61H)。定时/计数器T0和T1都采用中断方式工作。,汇编程序如下:ORG0000HLJMPMAINORG000BHMOVTH0,#0D8HMOVTL0,#0F0HCPLP3.5RETI,ORG001BHCPLP1.1RETI,ORG0100HMAIN:MOVTMOD,#61HMOVTH0,#0D8HMOVTL0,#0F0HMOVR2,#00HMOVTH1,#0E7HMOVTL1,#0E7HSETBEASETBET0SETBET1SETBTR0SETBTR1SJMP$END,C语言程序如下:#include/包含特殊功能寄存器库sbitP1_1=P11;sbitP3_5=P35;voidmain(),TMOD=0 x61;TH0=0 xD8;TL0=0 xf0;TH1=0 xE7;TL1=0 xE7;EA=1;ET0=1;ET1=1;TR0=1;TR1=1;while(1);voidtime0_int(void)interrupt1/T0中断服务程序TH0=0 xD8;TL0=0 xf0;P3_5=!P3_5;voidtime1_int(void)interrupt3/T1中断服务程序P1_1=!P1_1;,4.5.4MCS-51中断系统的应用,【例4-32】某工业监控系统,具有温度、压力、PH值等多路监控功能,中断源的连接如图5.26所示。对于PH值,在小于7时
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年护理新员工理论知识考核试题及答案
- 2025年注册验船师资格考试(B级船舶检验专业基础环境与人员保护)综合试题及答案一
- 2025年公路水运工程试验检测人员应试题及答案-道路工程
- 北京市门头沟区2023-2024学年九年级下学期初中学业水平考试(一模)数学考试题目及答案
- 桃夭课件教学课件
- 栽树知识技能培训内容课件
- 公务员沈阳面试题及答案
- 校长防疫知识培训讲话课件
- 2025年金融科技产品经理专业能力测试题库及答案解析
- 2025年教育行业面试官手册及预测题库
- 房屋抵押的合同(标准版)
- 中国土地荒漠化课件
- 2025晋中祁县司法协理员招聘笔试备考试题及答案解析
- 农村自建房租房合同范本
- 虚拟化平台日常运维指南与规范
- 2024年梅州市公务员考试行测真题附答案详解(典型题)
- 2025家电购销合同范本
- (2025)纪检监察应知应会试题库与参考答案
- 非煤矿职工职业卫生培训
- 社区居民高血压防治健康讲座
- 2025年湖北省中考化学试题深度解读及答案详解
评论
0/150
提交评论