您好,欢迎访问三七文档
当前位置:首页 > 电子/通信 > 综合/其它 > 电子教案单片机原理与应用技术
电子教案——单片机原理与应用技术第1页共12页第1章汇编语言程序设计80C51汇编,语言语句结构的基本格式伪指令的功能和应用汇编的概念程序设计的步骤和基本方法顺序程序分支程序循环程序查表程序散转程序§1-1汇编语言一.汇编语言及其语句结标号:操作码[目的操作数,源操作数];注释二.伪指令在汇编时起控制作用,自身并不产生机器码,而仅是为汇编服务的一些指令,称为伪指令。伪指令不属于80C51指令系统。常用的伪指令有以下几种:⒈起始伪指令ORG(Origin)格式:ORG16位地址⒉结束伪指令END格式:功能:汇编语言源程序的结束标志。在END后面的指令,汇编程序不再处理。⒊等值伪指令EQU(Equate)格式:字符名称EQU数据或汇编符号⒋数据地址赋值伪指令格式:字符名称DATA表达式功能:将一个数据或特定的汇编符号赋予规定的字符名称。⒌定义字节伪指令DB(DefineByte)格式:DB8位二进制数表功能:从指定的地址单元开始,定义若干个8位内存单元的数据。数据与数据之间用“,”分割。⒍定义字伪指令DW(DefineWord)格式:DW16位二进制数表功能:从指定的地址单元开始,定义若干个16位数据。⒎定义位地址伪指令格式:字符名称BIT位地址功能:将位地址赋予所规定的字符名称。三.汇编将汇编语言源程序转换为计算机所能识别的机器语言代码程序的过程称为汇编。汇编可分为:⒈手工汇编第2页共12页⒉计算机汇编四.程序设计的基本方法编写程序要求:不仅要完成规定的功能任务,而且还要求:执行速度快、占用内存少、条理清晰、阅读方便、便于移植、巧妙而实用。一般应按以下几个步骤进行:⑴分析问题,确定算法或解题思路⑵画流程图⑶编写源程序⑷汇编和调试第3页共12页§1-2汇编语言程序设计举例一.顺序程序顺序程序是指按顺序依次执行的程序,也称为简单程序或直线程序。顺序程序结构虽然比较简单,但也能完成一定的功能任务,是构成复杂程序的基础。根据不同条件转向不同的处理程序,这种结构的程序称为分支程序。80C51指令系统中的条件转移指令、比较转移指令和位转移指令,可以实现分支程序。【例】已知16位二进制负数存放在R1R0中,试求其补码,并将结果存在R3R2中解:二进制负数的求补方法可归结为“求反加1”,符号位不变。利用CPL指令实现求反;加1时,则应低8位先加1,高8位再加上低位的进位。注意这里不能用INC指令,因为INC指令不影响标志位。程序如下:CONT:MOVA,R0;读低8位CPLA;取反ADDA,#1;加1MOVR2,A;存低8位MOVA,R1;读高8位CPLA;取反ADDCA,#80H;加进位及符号位MOVR3,A;存高8位RET;二.分支程序根据不同条件转向不同的处理程序,这种结构的程序称为分支程序。80C51指令系统中的条件转移指令、比较转移指令和位转移指令,可以实现分支程序。①S0单独按下,红灯亮,其余灯灭;②S1单独按下,绿灯亮,其余灯灭;③其余情况,黄灯亮。第4页共12页解:程序如下SGNL:ANLP1,#11100011B;红绿黄灯灭ORLP1,#00000011B;置P1.0、P1.1输入态,P1.5~P1.7状态不变SL0:JNBP1.0,SL1;P1.0=0,S0未按下,转判S1JNBP1.1,RED;P1.0=1,S0按下;且P1.1=0,S1未按下,转红灯亮YELW:SETBP1.4;黄灯亮CLRP1.2;红灯灭CLRP1.3;绿灯灭SJMPSL0;转循环SL1:JNBP1.1,YELW;P1.0=0,S0未按下;P1.1=0,S1未按下,转黄灯亮GREN:SETBP1.3;绿灯亮CLRP1.2;红灯灭CLRP1.4;黄灯灭SJMPSL0;转循环RED:SETBP1.2;红灯亮CLRP1.3;绿灯灭CLRP1.4;黄灯灭SJMPSL0;转循环课堂练习题:电路及灯亮灭要求同上述【例】题,其中第3、4两条指令JNBP1.0和JNBP1.1按下列要求修改,试重新编程。⑴JBP1.0,¡JBP1.1,¡⑵JBP1.0,¡JNBP1.1,¡⑶JNBP1.0,¡JBP1.1,¡第5页共12页三.循环程序循环程序一般包括以下几个部分:⑴循环初值;⑵循环体;⑶循环修改;⑷循环控制;以上四部分可以有两种组织形式,其结构如图4-6所示.【例】编制一个循环闪烁灯的程序。设80C51单片机的P1口作为输出口,经驱动电路74LS240(8反相三态缓冲/驱动器)接8只发光二极管,如图4-8所示。当输出位为“1”时,发光二极管点亮,输出位为“0”时为暗。试编程实现:每个灯闪烁点亮10次,再转移到下一个灯闪烁点亮10次,循环不止。解:程序如下:FLASH:MOVA,#01H;置灯亮初值FSH0:MOVR2,#0AH;置闪烁次数FLOP:MOVP1,A;点亮LCALLDY1s;延时1sMOVP1,#00H;熄灭LCALLDY1s;延时1sDJNZR2,FLOP;闪烁10次RLA;左移一位第6页共12页SJMPFSH0;循环RET;【例】设Xi均为单字节数,并按顺序存放在以50H为首地址的内RAM存储单元中,数据长度(个数)N存在R2中,试编程求和S=X1+X2+‥‥+XN,并将S(双字节)存放在R3R4中,(设S<65536)。解:程序如下:SXN:MOVR2,#N;置数据长度(循环次数)MOVR3,#00H;和单元(高8位)清0MOVR4,#00H;和单元(低8位)清0MOVR0,#50H;求和数据区首址LOOP:MOVA,R4;读前次低8位和ADDA,@R0;低8位累加MOVR4,A;存低8位和CLRA;ADDCA,R3;高8位加进位MOVR3,A;存高8位和INCR0;指向下一数据循环修改DJNZR2,LOOP;判N个数据累加完否?循环控制RET;退出循环退出循环【例】编写延时10ms子程序,fosc=12MHz。解:fosc=12MHz,一个机器周期为。DY10ms:MOVR6,#20;置外循环次数DLP1:MOVR7,#250;置内循环次数DLP2:DJNZR7,DLP2;2机周×250=500机周DJNZR6,DLP1;500机周×20=10000机周RET;说明:MOVRn指令为1个机器周期;DJNZ指令为2个机器周期;RET指令为2个机器周期;{[(2机周×机周≈10ms【课堂练习题】按下列要求编写延时子程序:⑴延时2ms,fosc=6MHz;⑵延时5ms,fosc=12MHz;⑶延时10s,fosc=12MHz;设80C51单片机的P1口作为输出口,经驱动电路74LS240(8反相三态缓冲/驱动器)接8只发光二极管,如图4-8所示。当输出位为¡°1¡±时,发光二极管点亮,输出位为¡°0¡±时为暗。试编程实现:每个灯闪烁点亮10次,再转移到下一个灯闪烁点亮10次,循环不止。FLASH:MOVA,#01H;置灯亮初值FSH0:MOVR2,#0AH;置闪烁次数FLOP:MOVP1,A;点亮LCALLDY1s;延时1sMOVP1,#00H;熄灭LCALLDY1s;延时1s第7页共12页DJNZR2,FLOP;闪烁10次RLA;左移一位SJMPFSH0;循环RET;【课堂练习题】根据图4-8电路,设计灯亮移位程序,要求8只发光二极管每次点亮一个,点亮时间为250ms,顺序是从下到上一个一个地循环点亮。设fosc=6MHz。【例】已知P1口数据每隔10ms刷新一次,试求其1s内的平均值,平均值存30H。解:本题需求100个数据的平均值,一般有两种方法:一种是全部累加后再平均;另一种是边平均边累加,现给出两种方法的程序。AVRG1:MOVR2,#0;低8位累加寄存器清0MOVR3,#0;高8位累加寄存器清0MOVR4,#100;置平均次数ALOP:MOVA,P1;读P1口数据ADDA,R2;低8位累加MOVR2,A;回存CLRA;高8位与进位累加ADDCA,R3;MOVR3,A;回存LCALLDY10ms;延时10msDJNZR4,ALOP;判100次累加完否?未完继续MOVA,R3;100次累加完,求平均值,被除数→A、BMOVB,R2;MOVR0,30H;置商间址MOVR6,#0;置除数100,除数→R6R5MOVR5,#100;LCALLSUM;(A、B)÷(R6、R5)=商@R0,余数ACJNEA,#50,NEXT;四舍五入NEXT:JCGRET;C=1,<50,舍INC30H;C=0,≥50,入GRET:RET;AVRG2:MOV30H,#0;商累加寄存器清0MOV31H,#0;余数累加寄存器清0MOVR4,#100;置平均次数ALOP:MOVA,P1;读P1口数据MOVB,#100;置除数(平均次数)DIVAB;P1口数据除以100ADDA,30H;商累加第8页共12页MOV30H,A;回存MOVA,B;ADDA,31H;余数累加MOV31H,A;回存CLRC;SUBBA,#100;JCGON;余数累加<100,余数累加寄存器不变INC30H;余数累加≥100,商累加寄存器+1MOV31H,A;减去100后差→余数累加寄存器GON:LCALLDY10ms;延时10msDJNZR4,ALOP;判100次累加完否?未完继续MOVA,31H;100次累加完毕,余数累加四舍五入CJNEA,#50,NEXT;NEXT:JCGRET;C=1,<50,舍INC30H;C=0,≥50,入GRET:RET;【课堂练习题】已知某单片机系统每隔20ms测一次温度,8位温度A/D值存在特殊功能寄存器SBUF中,试分别求其1s和1分内的平均值,分别存30H和31H。当用PC作基址寄存器时,其表格首地址与PC值间距不能超过256字节,且编程要事先计算好偏移量,比较麻烦。因此,一般情况下用DPTR作基址寄存器。解:编程如下:CHAG:MOVDPTR,#TABD;置共阴字段码表首址MOVA,30H;读显示数字MOVCA,@A+DPTR;查表,转换为显示字段码MOV30H,A;存显示字段码RET;TABD:DB3FH,06H,5BH,4FH,66H;0~4共阴字段码表DB6DH,7DH,07H,7FH,6FH;5~9共阴字段码表四.查表程序用于查表的指令有两条:⑴MOVCA,@A+DPTR⑵MOVCA,@A+PC当用DPTR作基址寄存器时,查表的步骤分三步:①基址值(表格首地址)→DPTR;②变址值(表中要查的项与表格首地址之间的间隔字节数)→A;③执行MOVCA,@A+DPTR。当用PC作基址寄存器时,其表格首地址与PC值间距不能超过256字节,且编程要事先计算好偏移量,比较麻烦。因此,一般情况下用DPTR作基址寄存器。【例】在单片机应用系统中,常用LED数码管显示数码,但显示数字(≤9)与显示数字编码并不相同,需要将显示数字转换为显示字段码,通常是用查表的方法。现要求将30H中第9页共12页的显示数字转换为显示字段码并存入30H。已知共阴字段码表首址为TABD。解:编程如下:CHAG:MOVDPTR,#TABD;置共阴字段码表首址MOVA,30H;读显示数字MOVCA,@A+DPTR;查表,转换为显示字段码MOV30H,A;存显示字段码RET;TABD:DB3FH,06H,5BH,4FH,66H;0~4共DB6DH,7DH,07H,7FH,6FH;5~9共阴字段码表【例】用查表程序求0~40之间整数的立方。已知该整数存在内RAM30H中,查得立方数存内RAM30H(高8位)31H。已知立方表(双字节)首地址为TAB。解:编程如下:CUBE:MOVDPTR,#TAB;置立方表首址MOVA,30H;读数据ADDA,30H;数据×2→AMOV30H,A;暂存立方表数据序号MOVCA,@A+DPTR;读立方数据高8位XCHA,30H;存立方数据高8位,立方表数据序号→AINCA;指向立方数据低8位MOVCA,@A+DPTR;读立方数据低8位MOV31H,A;存立方数据低8位RET;TAB:DW0,0,0,1,0,8,0,27,0,64;0~40立方表D
本文标题:电子教案单片机原理与应用技术
链接地址:https://www.777doc.com/doc-2253609 .html