C51单片微机的程序设计.ppt

上传人:za****8 文档编号:11829386 上传时间:2020-05-03 格式:PPT 页数:71 大小:779.01KB
返回 下载 相关 举报
C51单片微机的程序设计.ppt_第1页
第1页 / 共71页
C51单片微机的程序设计.ppt_第2页
第2页 / 共71页
C51单片微机的程序设计.ppt_第3页
第3页 / 共71页
点击查看更多>>
资源描述
实验一清零、移数、判断,将片内30H40H及片外0010H0100H清零,然后将片内41H47H的内容移到片外0041H0047H,判断:若(0041H)15,则求其平方存到0050H中,并将位00H置1。(0041H)=15,则加15存到0050H中,并将位01H置1。(0041H)15,则减15存到0050H中,并将位02H置1。,实验报告要求:1写明实验日期、桌号2写明实验要求;3编程,加标注4写出调试过程,遇到的问题及解决方法5总结实验目的,写出收获体会,第四章80C51单片微机的程序设计,4.1概述汇编语言格式伪指令语句4.280C51汇编语言程序设计顺序结构程序设计分支结构程序设计循环结构程序设计子程序设计程序设计举例,4.1概述4.1.1汇编语言格式,1.计算机语言机器语言汇编语言高级语言,2.汇编语言语句种类:指令语句伪指令语句宏指令语句的格式:指令语句格式:标号:操作码操作数;注释伪指令语句格式:名字定义符参数;注释,例:把片外存储器2200H单元中的数送入片内70H单元中。标号域操作码域操作数域注释域BEGIN:MOVDPTR,#2200H;(DPTR)=2200HMOVR0,#70H;(R0)=70HMOVXA,DPTR;(A)=(DPTR)MOVR0,A;(R0)=(A),伪指令:仅在汇编时起控制作用,是为汇编服务的一些指令。伪操作:由伪指令确定的操作称为伪操作。“伪”体现在汇编时不产生机器指令代码,不影响程序的执行,仅指明在汇编时执行一些特殊的操作。,4.1.2伪指令语句,ORG(Origin)汇编起始地址伪指令指令格式为:ORG表达式例:ORG1000HSTART:MOVA,12HEND(ENDofassembly)汇编结束伪指令一定放在程序末尾!EQU(EQUate)赋值伪指令指令格式为:标号EQU表达式含义:把表达式赋值于标号,标号和表达式都是不可少。例:AAEQU30HK1EQU40HMOVA,AA;(30H)AMOVA,K1;(40H)A,4、DB(DefineByte)定义字节伪指令指令格式为:标号DB表达式或表达式表例:ORG2000HTABLE:DB73H,04,100,32,005、DW(DefineWord)定义字伪指令指令格式为:标号DW表达式或表达式表例:DW100H,3456H,814表示按顺序存入01H,00H,34H,56H,03H,2EH(DB、DW定义的表一般数的个数不得超过80个),6、DS(DefineStorage)定义存储区伪指令指令格式为:DS含义:通知汇编程序,在目标代码中,以标号为首地址保留表达式值的若干存储单元以备源程序使用。汇编时,对这些单元不赋值。例:BASEDS100H注意:DB、DW、DS等伪指令只能应用于程序存储器,不能用于数据存储器。7、BIT位定义伪指令命令格式为:BIT含义:给字符名称赋予位地址。例:REDBITP1.0SETBRED,例1.伪指令应用ORG8100HBUFFERDS10HDW“AB”DW100H,1ACH,-814说明:从8100H至810FH为缓冲区空间(8110H)=41H(A)(8111H)=42H(B)8112H单元起存放01H、00H、01H、ACH、FCH、D2H,4.280C51汇编语言程序设计,程序结构:顺序结构分支结构循环结构子程序中断服务子程序,汇编和调试,程序设计的基本方法,编写程序要求:不仅要完成规定的功能任务,而且还要求:执行速度快、占用内存少、条理清晰、阅读方便、便于移植、巧妙而实用。一般应按以下几个步骤进行:,分析问题,确定算法或解题思路,画流程图,编写源程序,流程图符号和说明:,ORG0030HSTART:MOVDPTR,#TABLEMOVA,20HMOVCA,A+DPTRMOV21H,ASJMP$ORG0100HTABLE:DB0,1,4,9,16,25END,例1:变量存在内部RAM的20H单元中,其取值范围:05,编程,用查表法求其平方值存到21H中,4.2.1顺序结构程序设计,开始,表格首地址送DPTR,变量送A(20H)A,查平方表(A+DPTR)A,结束,结果送21H单元:A21H,设被加数存放于片内RAM的20H(低位字节)、21H(高位字节),加数存放于22H(低位字节)和23H(高位字节),运算结果的和数存放于20H(低位字节)和21H(高位字节)中。实现16位相加,(如果有进位位保存在10H中)。ORG0100HADD_2:PUSHACC;将A中内容进栈保护MOVR0,20H;将20H地址送R0MOVR1,22H;将22H地址值送R1MOVA,R0;被加数低字节内容送AADDA,R1;低字节数相加MOVR0,A;低字节数和存20H中,例2.不带符号两字节加法,INCR0;指向被加数高位字节INCR1;指向加数高位字节MOVA,R0;被加数高位字节送AADDCA,R1;高字节数带进位相加MOVR0,A;高字节数和存21H中CLRAADDCA,#00HMOV10H,A;进位暂存于10H中POPACC;恢复A原内容RET,设有一个巡回检测报警装置,需对4路输入进行控制,每路设有一个最大额定值,为双字节数。控制时需根据检测的路号找出该路对应的最大额定值。设R2用于寄存检测路号,查找到的对应的最大额定值存放于31H和32H单元中。查找最大允许额定值子程序如下:,例3.查表,地址机器码源程序注释ORG2000H2000EAMOVA,R2;检测路号送A20012AADDA,R2;(R2)22002F531MOV31H,A;距表首址偏移量20042408ADDA,#19H;偏移量(2020H-2007H)200683MOVCA,A+PC;查表,读取第1个字节内容2007C531XCHA,31H;第1字节存入31H单元20092404ADDA,#15H;偏移量(2021H-200CH)200B83MOVCA,A+PC;查表,读取第2字节200CF532MOV32H,A;第2字节存入32H单元200E,地址机器码源程序注释ORG2020H;最大额定值表20201230TAB:DW1230H,;路号020221540DW1540H;路号120242340DW2340H,;路号220262430DW2430H;路号3END说明:rel计算2020H-(2006H+1)=19H(2020H+1)-(200BH+1)=15H,单分支结构程序有两个出口,二选一。位条件转移指令:JC、JNC、JBJNB、JBC等字节条件转移指令:JZ、JNZ、DJNZ、CJNE等有3种典型形式(见图42)。,4.2.2分支结构程序设计,单分支多分支,双分支N分支,ORG0000HSTART:MOVR3,B;保存BMOVB,AMULAB;(B)(A)=a2MOVR0,A;(R1)(R0)=a2MOVR1,BMOVA,R3CJNEA,#0AH,MMN;b10则转移,例、编程计算,结果存在R1R0,Y=a2b(当b10时)Y=a2b(当b10)转MMMOVA,R0CLRC,SUBBA,R3;(R1)(R0)a2-bMOVR0,AMOVA,R1SUBBA,#00HMOVR1,AHERE:AJMPHEREEND,多分支选择结构结构形式见图43。,例1:设变量x以补码形式存放在片内RAM30H单元中,变量y与x的关系是:,编程根据x的值求y值并放回原单元。,ORG1000HSTART:MOVA,30HJZNEXT;x=0,转移ANLA,#80H;保留符号位JZED;x0,转移MOVA,#05H;x0,不转移ADDA,30HMOV30H,ASJMPEDNEXT:MOV30H,#20HED:SJMP$END,例:将ASCII码转换为十六进制数。设ASCII码放在累加器A中,转换结果放到B中。解:由ASCII码表(表1-4)可知,30H39H为09的ASCII码,41H46H为AF的ASCII码。将ASCII码减30H(09)或37H(AF)就可获得对应的十六进制数。程序如下:ASC:CLRCSUBBA,#30H;A-30HCJNEA,#0AH,ASCO;差值10比较,在C中产生10或10标志ASCO:JCASC1;10,已变为ASC码SUBBA,#07H;10,再减7ASC1:MOVB,A;存转换结果RET,S0单独按下,红灯亮,其余灯灭;S1单独按下,绿灯亮,其余灯灭;其余情况,黄灯亮。,已知电路如图4-5所示,要求实现:,解:程序如下SGNL:ANLP1,#11100011B;红绿黄灯灭ORLP1,#00000011B;置P1.0、P1.1输入态,P1.5P1.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;转循环,在单片机系统中设置+、四个运算命令键,它们的键号分别为0、1、2、3。当其中一个键按下时,进行相应的运算。操作数由P1口和P3口输入,运算结果仍由P1口和P3口输出。具体如下:P1口输入被加数、被减数、被乘数和被除数,输出运算结果的低8位或商;P3口输入加数、减数、乘数和除数,输出进位(借位)、运算结果的高8位或余数。键盘号已存放在30H中。,散转程序,散转程序是一种并行多分支程序。,单片机四则运算系统。,分析:-”0”:被加数:从P1口读入加数:从P3口读入和:从P1口输出;进位:从P3口输出-”1”:被减数:从P1口读入减数:从P3口读入差:从P1口输出;借位:从P3口输出-”2”:被乘数:从P1口读入乘数:从P3口读入积的低8位:从P1口输出;积的高8位:从P3口输出-”3”:被除数:从P1口读入除数:从P3口读入商:从P1口输出;余数:从P3口输出,解:程序如下:PRGM:MOVP1,#0FFH;P1口置输入态MOVP3,#0FFH;P3口置输入态MOVDPTR,#TBJ;置“”散转表首地址MOVA,30H;读键号RLA;键号2AADDA,30H;键号3AJMPA+DPTR;散转TBJ:LJMPPRGM0;转PRGM0(加法)LJMPPRGM1;转PRGM1(减法)LJMPPRGM2;转PRGM2(乘法)LJMPPRGM3;转PRGM3(除法)PRGM0:MOVA,P1;读加数ADDA,P3;P1+P3MOVP1,A;和P1CLRA;ADDCA,#00H;进位AMOVP3,A;进位P3AJMPPRGM(RET);,PRGM1:MOVA,P1;读被减数CLRC;CY清零SUBBA,P3;P1-P3MOVP1,A;差P1CLRA;RLCA;借位AMOVP3,A;借位P3AJMPPRGM(RET);PRGM2:MOVA,P1;读被乘数MOVB,P3;置乘数MULAB;P1P3MOVP1,A;积低8位P1MOVP3,B;积高8位P3AJMPPRGM(RET);PRGM3:MOVA,P1;读被除数MOVB,P3;置除数DIVAB;P1P3MOVP1,A;商P1MOVP3,B;余数P3AJMPPRGM(RET);说明:由于LJMP为3字节指令,因此键号需先乘3,以便转到正确的位置。,由40H单元中动态运行结果值来选择分支程序(40H)0,转处理程序0.(40H)n,转处理程序nSTART:MOVDPTR,addr16;指令表首址送DPTRMOVA,40H;40H单元内容送ACLRC;清CYRLCA;A内容左移一位(2)JNCTABLE;若CY0,转TABELINCDPH;若CYl,DPH内容十1TABEL:JMPA十DPTR;多分支转移ADDR16:AJMPLOOP0;转分支程序0AJMPLOOP1;转分支程序1AJMPLOOPn;转分支程序n,例.通过查转移指令表实现多分支程序转移,循环程序一般包括以下4个部分:循环初始化;循环体;循环控制;循环结束;以上四部分可以有两种组织形式。计数循环结构如图44所示,条件循环结构如图4-5所示。,4.2.3循环结构程序设计,计数控制循环结构DJNZRn,rel;以工作寄存器作控制计数器DJNZdirect,rel;以直接寻址单元作控制计数器条件控制循环结构一般常用比较转移指令或条件判跳指令进行控制和实现。循环嵌套结构,循环控制的一般方法:循环次数已知-利用循环次数控制循环次数未知-利用关键字控制,将内部RAM中起始地址为data的数据串送到外部RAM中起始地址为buffer的存储区域中,直到发现$字符,传送停止-循环次数事先不知道先判断,后执行。,ORG1000HMOVR0,#dataMOVDPTR,#bufferLOOP1:MOVA,R0CJNEA,#24H,LOOP2;判断是否为字符SJMPLOOP3;是,转结束LOOP2:MOVXDPTR,A;不是,传送数据INCR0INCDPTRSJMPLOOP1;传送下一数据LOOP3:END,【例412】内部RAM20H单元开始存有8个数,试找出其中最大的数,送入MAX单元。解:程序如下:,ORG1000HDELAY:MOVR6,#200;1TmLOOP1:MOVR7,#248;1TmNOP;1TmLOOP2:DJNZR7,LOOP2;2TmDJNZR6,LOOP1;2TmRET;1Tm,补充例:软件循环延时100mS(晶振12MHz),1Tm=1uS100mS=100000uSMOVRn#data和NOP是单机器周期指令DJNZRn,rel是双机器周期指令200=0C8H;248=0F8H,1+1+248x2=498,(498+2)x200,设80C51单片机的P1口作为输出口,经驱动电路74LS240(8反相三态缓冲/驱动器)接8只发光二极管,如图4-8所示。当输出位为“1”时,发光二极管点亮,输出位为“0”时为暗。试编程实现:每个灯闪烁点亮10次,再转移到下一个灯闪烁点亮10次,循环不止。,【例4.15】编制一个循环闪烁灯的程序。,FLASH:MOVA,#01H;置灯亮初值FSH0:MOVR2,#0AH;置闪烁次数FLOP:MOVP1,A;点亮LCALLDY1s;延时1sMOVP1,#00H;熄灭LCALLDY1s;延时1sDJNZR2,FLOP;闪烁10次RLA;左移一位SJMPFSH0;循环RET;,解:程序如下:,延时子程序可根据延时长短,自行编写。,子程序调用指令:ACALL、LCALL返回RET图46注意:子程序入口保护现场与恢复现场(3)返回子程序名子程序功能子程序入口条件和出口结果子程序所用的寄存器、存储单元、标志位等子程序嵌套,4.2.4子程序设计,应用软件来进行数字滤波。中值滤波就是连续输入三个检测信号值,从中选择一个中间值为有效信号。入口条件:三次采集数据分别存储在内部存储器的20H、21H和22H中。出口结果:中间值在R0寄存器中。使用资源:累加器A、R0及内存20H、21H和22H。,例.中值数字滤波子程序,ORG2100HFILLT:PUSHPSW;PSW及ACC保护入栈PUSHACCMOVA,20H;取第一个数据CLRCSUBBA,21H;与第二个数据比较,JNCLOB1;第一个数据比第二个数据大,转LOB1MOVA,20H;比第二个数据小,交换二个数的位置XCHA,21HMOV20H,ALOB1:MOVA,22HCLRCSUBBA,20H;第三个数据与前二个数据中的较大数比较JNCLOB3;第三个数据大于前二个数据中的大数,转LOB3,MOVA,22HCLRCSUBBA,21H;第三个数据与前二个数据中的较小数比较JNCLOB4MOVA,21H;21H单元中的值是中值MOVR0,ALOB2:POPACC;恢复ACC和PSWPOPPSWRET,LOB3:MOVA,20H;20H单元中的值是中值MOVR0,AAJMPLOB2LOB4:MOVA,22H;22H单元中的值是中值MOVR0,AAJMPLOB2,把外部RAM30H3FH共16个单元中的ASCII码依次转换为十六进制数,并拼装压缩存入内部60H67H共8个单元中。ASCTOH:MOVR0,#30H;设ASCII码地扯指针MOVR1,#60H;设十六进制数地址指针MOVR7,#08H;拼装的十六进制数字节个数。AB:ACALLTRAN;调用转换子程序。SWAPAMOVR1,AINCR0,例.码制转换,ACALLTRAN;调用转换子程序。XCHDA,R1INCR0INCR1DJNZR7,ABHALT:SJMPHALT,TRAN:CLRC;ASCII码数转换为十六进制数子程序MOVXA,R0SUBBA,#30HCJNEA,#0AH,BBAJMPBCBB:JCDONEBC:SUBBA,#07H;0AH,则再减07HDONE:RET,数据排序程序常用的有插入排序法、冒泡排序法、快速排序法、选择排序法、堆积排序法、二路归并排序法及基数排序法等。冒泡法是一种相邻数互换的排序方法。从前向后进行相邻数比较,若数据的大小次序与要求的顺序不符时(逆序),就将二数互换,正序时不交换,假定是升序排序,则通过这种相邻数互换方法,使小数向前移,大数向后移,从前向后进行一次冒泡(相邻数互换),把最大数换到最后,再进行一次冒泡,就会把次大数排在倒数第二,直至冒泡结束。,4.2.5程序设计举例,假定原始数据为5FH,38H,7H,13H,44H,D8H,22H冒泡过程:5FH,38H,7H,13H,44H,D8HH,22H(逆序,则两数互换)38H,5FH,7H,13H,44H,D8H,22H(逆序,则两数互换)38H,7H,5FH,13H,44H,D8H,22H(逆序,则两数互换)38H,7H,13H,5FH,44H,D8H,22H(逆序,则两数互换)38H,7H,13H,44H,5FH,D8H,22H(正序)38H,7H,13H,44H,5FH,D8H,22H(逆序,则两数互换),第一次冒泡结束:38H,7H,13H,44H,5FH,22H,D8H第二次冒泡结束:7H,13H,38H,44H,22H,5FH,D8H第三次冒泡结束:7H,13H,38H,22H,44H,5FH,D8H第四次冒泡结束:7H,13H,22H,38H,44H,5FH,D8H第五次冒泡结束:7H,13H,22H,38H,44H,5FH,D8H,说明:每次冒泡都从向后排定了一个大数(升序),每次冒泡所需进行的比较次数都递减,例如有n个数排序,则第一次冒泡需比较(n-1)次,第二次冒泡则需(n-2)次,实际编程中为了简化程序,往往把各次比较次数都固定为(n-1)次。对于n个数,理论上说应进行(n-1)次冒泡才能完成排序,但实际上往往不到(n-1)次就已排好序。判定排序是否完成的最简单方法是每次冒泡中是否有互换发生,如果有互换发生,说明排序还没完成。控制排序结束常不使用计数方法,而使用设置互换标志的方法,以其状态表示在一次冒泡中有无数据互换进行。,在一组测量数据中,挑选出大于标准m的数值作为合格的产品,而那些小于m的数值作为不合格产品,则被剔除掉。设数据组为X1、X2、X10共10个。ORG0000H0000HC200PX:CLR00;设交换过标志0002H7B09MOVR3,#09H;10个数据比较,第一次;比较两个数据,比较次数为(n-1)次0004H7850MOVR0,#50H;10个单元无符号数存;放首址0006HE6MOVA,R0,例数据排序,0007H08PX1:INCR00008HF9MOVR1,A0009H96SUBBA,R0;DXDX+1000AHE9MOVA,R1000BH4006JCPX2;DXDX+1量交换标志位,20H.0=1,000FHC6XCHA,R0;DX与DX+1交换0010H18DECR00011HC6XCHAVR00012H08INCR00013HE6PX2:MOVA,R0;ADX+10014HDBF1DJNZR3,PX1;比较9次0016H2000E7JB00H,PX;有交换则再比较一遍0019H80FEEND0:SJMPEND0执行结果(50H)中为最小数,(59H)中为最大数。,已知采样值(无符号数)存放在外部RAM1000H100FH中,试编程找出其中的最大值存入内部RAM区的20H中。ORG0000HMOVR0,#10H;采样值数据区长度MOVDPTR,#1000H;采样值存放首址MOV20H,#00H;最大值单元初始值设为最小数LP:MOVXA,DPTR;取采样值CJNEA,20H,CHK;数值比较SJMPLP1;相等,则转移,2.查找无符号数中最大值程序,CHK:JCLP1;A值小,转移MOV20H,A;A值大,则送20HLP1:INCDPTRDJNZR0,LP;继续HERE:SJMPHERE;结束,注:20H中始终存放两个数比较后的大值,比较结束后存放的即是最大值。*若要寻找最小值,只要在初始化时,把可能的最大值放入最小值存放单元,比较转移用的标志位由C改为NC即可。,3.数据搜索程序在数据区中寻找关键字,称为数据搜索。常用的方法有两种,即顺序搜索和对分搜索。顺序搜索:把关键字与数据区中的数据逐个比较,相等者即为找到的关键字。对分搜索:按对分原则进行取数与关键字比较,但前提是数据区中的数已排好序,这样搜索一次后,搜索的数据区范围缩小一半,搜索速度快,已知数据区内有16个数,从内部RAM30H开始存放,要搜索的关键字在20H中,若数据区中搜索到关键字,则在21H中记录关键字在数据区中的序号,若数据区中没有搜索到关键字,则置用户标志F0为1。ORG0000HMOVR0,#30H;数据区首址MOVR1,#16;数据区长度MOV20H,#KEY;关键字送20H单元CLRF0;清用户标志位MOV21H,#01;序号置1,例.搜索关键字,LP:MOVA,R0;取数CJNEA,20H,LP1HERE:SJMPHERE;找到关键字,结束LP1:INC21H;序号加1INCR0;数据区地址指针加1DJNZR1,LP;继续SETBF0;未搜索到关键字,则置位用户标志SJMPHERE,实验一清0、移数,将片内50H5FH及片外0010H004FH单元清0;然后将片内30H3FH的数据移到片外0000H000FH中;判断:若(30H)15,则求其平方存到40H中,并将位00H置1若(30H)=15,则加15存到40H中,并位01H置1若(30H)15,则减15存到40H中,并位02H置1,END,图41汇编过程示意图,图42单分支结构示意图,图43多分支结构示意图,图44计数循环结构示意图,图45条件循环结构示意图,图46子程序调用与返回过程示意图,实验一清0、移数,将片内50H5FH及片外0010H004FH单元清0;然后将片内30H3FH的数据移到片外0000H000FH中;判断:若(30H)15,则求其平方存到40H中,并将位00H置1若(30H)=15,则加15存到40H中,并位01H置1若(30H)15,则减15存到40H中,并位02H置1,实验二加法、排序,有两个长度为10的无符号数分别放在片内30H和40H为首的存储单元中(低位),求其对应项之和(带进位位),放在50H为首的单元中,然后按升序排列放在60H为首的单元中。,实验三查表、散转,设有一表格,表中数为:00H、11H、22H、33H、44H、55H、66H、77H、88H、99H、AAH、BBH、CCH、DDH、EEH、FFH。根据片外0000H单元的低4位的数,取出表中相应的值存到片内30H中;根据片外0000H单元的高4位的数,将片内RAM区中可位寻址的相应的位置1(从位00H位0FH,只可有一个位地址为1),
展开阅读全文
相关资源
相关搜索

当前位置:首页 > 图纸专区 > 课件教案


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!