单片微机原理与接口技术-基于STC15系列单片机(第3版)5 STC15F2K60S2单片机的程序设计 例题_第1页
单片微机原理与接口技术-基于STC15系列单片机(第3版)5 STC15F2K60S2单片机的程序设计 例题_第2页
单片微机原理与接口技术-基于STC15系列单片机(第3版)5 STC15F2K60S2单片机的程序设计 例题_第3页
单片微机原理与接口技术-基于STC15系列单片机(第3版)5 STC15F2K60S2单片机的程序设计 例题_第4页
单片微机原理与接口技术-基于STC15系列单片机(第3版)5 STC15F2K60S2单片机的程序设计 例题_第5页
已阅读5页,还剩12页未读 继续免费阅读

下载本文档

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

文档简介

PAGEPAGE92第5章STC15F2K60S2单片机的程序设计例题例5.1分析ORG在下面程序段中的控制作用ORG1000HSTART:MOVR0,#60H MOVR1,#61H …… ORG1200HNEXT: MOVDPTR,#1000H MOVR2,#70H ……解:以START开始的程序汇编后机器码从1000H单元开始连续存放,不能超过1200H单元;以NEXT开始程序汇编后机器码从1200H单元开始连续存放。例5.2分析END在下面程序段中的控制作用。START:MOVA,#30H ……ENDSTARTNEXT:……RET解:汇编程序对该程序进行汇编时,只将END伪指令前面的程序转换为对应的机器代码程序,而以NEXT标号为起始地址的程序将予以忽略。因此,若NEXT标号为起始地址的子程序是本程序的有效子程序的话,应将整个子程序段放到END伪指令的前面。例5.3分析下列程序中EQU指令的作用AA EQUR1 ;给AA赋值R1DATA1EQU10H ;给DATA1赋值10H DELAY EQU2200H ;给DELAY赋值2200HORG2000HMOVR0,DATA1 ;R0←(10H)MOVA,AA ;A←(R1)LCALLDELAY ;调用起始地址为2200H的子程序END解:经EQU定义后,AA等效于R1,DATA1等效于10H,DELAY等效于2200H,该程序在汇编时,自动将程序中AA换成R1、DATA1换成10H、DELAY换成2200H,再汇编为机器代码程序。使用赋值伪指令EQU的好处在于程序占用的资源数据符号或寄存器符号用占用源的英文或英文缩写字符名称来定义,后续编程中凡是出现该数据符号或寄存器符号就用该字符名称代替,这样,采用有意义的字符名称进行编程,更容易记忆和不容易混淆,也便于阅读。例5.4试将8位二进制数据转换为十进制(BCD码)数据。解:8位二进制数据对应的最大十进制数是255,说明一个8位二进制数据需要3位BCD码来表示,既百位数、十位数与个位数。如何求解呢?用8位二进制数据减100,够减百位数加1,直至不够减为止;再用剩下的数去减10,够减十位数加1,直至不够减为止;剩下的数即为个位数。用8位二进制数据除以100,商为百位数,再用余数除以10,商为十位数,余数为个位数。很显然,第(1)种方法更复杂,应选用第(2)种算法。设8位二进制数据存放在20H单元,转换后十位数、个位数存放在30H单元,百位数存放在31H单元。参考程序如下:ORG0000HMOVA,20H;取8位二进制数据MOVB,#100DIVAB;转换数据除以100,A为百位数MOV31H,A;百位数存放在31H单元MOVA,B;取余数MOVB,#10DIVAB;余数除以10,A为十位数,B为个位数SWAPA;将十位数从低4位交换到高4位ORLA,B;十位数、个位数合并为压缩BCD码MOV30H,A;十位数、个位数存放在30H(高4位为十位数,低4位为个位数)SJMP$END例5.5求8位有符号数的补码。设8位二进制数存放在片内RAM30H单元内。解:对于负数的补码为除符号位以外取反加1,而正数的补码就是原码,因此,关键的地方是判断数据的正负,最高位为0,表示为正数,最高位为1,表示为负数。参考程序如下:ORG0000HMOVA,30HJNBACC.7,NEXT ;为正数,不进行处理CPLA ;负数取反ORLA,#80H ;恢复符号位INCA ;加1MOV30H,ANEXT: SJMPNEXT ;结束 END例5.6试编写计算下式的程序:100(X≥0)Y=-100(X<0)解:该例是一个双分支程序,本题关键是判断X是正数,还是负数?判断方法同例5.5。设X存在40H单元中,结果Y存放于41H中。程序流程图如图5.5所示。图5.5例5.6程序流程图参考程序如下:XEQU 40H;定义X的存储单元YEQU 41H;定义Y存储单元ORG 0000H MOVA,X ;取X JBACC.7,BRANCH1 ;若ACC.7为1则转向BRANCH1,否则顺序执行MOVA,#64H ;X≥0,Y=100 SJMPCOMMON ;转向COMMON(分支公共处)BRANCH1: MOVA,#9CH ;X<0,Y=-100,把-100的补码(9CH)送ACOMMON: MOVY,A ;保存ASJMP$ ;程序结束 END 例5.7设各分支的分支号码从0开始按递增自然数排列,执行分支号存放在R3中,编写多分支处理程序。解:首先,在程序存储器中建立一个分支表,分支表中按从0开始的分支顺序从起始地址(表首地址,如TABLE)开始存放各分支的一条转移指令(AJMP或LJMP,AJMP占用2个字节,LJMP占用3个字节),各转移指令的目标地址就是各分支程序的入口地址。根据各分支程序的分支号,转移到分支表中对应分支的入口处,执行该分支的转移指令,再转到分支程序的真正入口处,从而执行该分支程序。参考程序如下:ORG 0000H MOVA,R3;取分支号 RLA;分支号乘2,若分支表中用LJMP,则改分支号乘3 MOVDPTR,#TABLE;分支表表首地址送DPTR JMP@A+DPTR;转到分支表该分支的对应入口处TABLE: AJMPROUT0;分支表,采用短转移指令,每个分支占用2个字节 AJMPROUT1;各分支在分支表的入口地址=TAB+分支号×2 AJMPROUT2 ……ROUT0:……;分支0程序LJMPCOMMON;分支程序结束后,转各个分支的汇总点ROUT1:……;分支1程序LJMPCOMMON;分支程序结束后,转各个分支的汇总点ROUT2:……;分支2程序LJMPCOMMON;分支程序结束后,转各个分支的汇总点……COMMON:SJMPCOMMON;各个分支的汇总点END注意:不管哪个分支程序执行完毕后,都必须回到所有分支公共回合处,如各分支程序中的“LJMPCOMMON”指令。例5.8将内部RAM中起始地址为DATA的字符串数据传送扩展RAM中起始地址为BUFFER的存储区域内,并统计传送字符的个数,直到发现空格字符停止传送。解:题目中已明确发现空格字符时就停止传送,因此,编程时应先对传送数据进行判断,再决定是否传送。设DATA为20H,BUFFER为0200H,参考程序如下:ORG 00000HDATAEQU20HBUFFEREQU0200HMOVR2,#00H;统计传送字符个数计数器清零MOVR0,#DATA;设置源操作数指针MOVDPTR,#BUFFER;设置目标操作数指针LOOP0:MOVA,@R0;取被传送数据CJNEA,#20H,LOOP1;判断是否为空格字符(ASCII码为20H)SJMPSTOP;是空格字符,停止传送LOOP1:MOVX@DPTR,A;不是空格字符,传送数据INCR0;指向下一个被传送地址INCDPTR;指向下一个传送目标地址INCR2;传送字符个数计数器加1SJMPLOOP0;继续下一个循环STOP:SJMP$;程序结束END例5.9将内部RAM中起始地址为DATA的字符串数据传送扩展RAM中起始地址为BUFFER的存储区域内,字符串的结束字符是“$”。解:程序功能与例5.8基本一致,但字符串的结束字符“$”是字符串中的一员,也是需要传送的,因此,编程时应先传送,再对传送数据进行判断,以判断字符串数据传送是否结束。设DATA为20H,BUFFER为0200H,参考程序如下:DATAEQU20HBUFFEREQU0200HORG0000HMOVR0,#DATAMOVDPTR,#BUFFERLOOP0:MOVA,@R0;取被传送数据MOVX@DPTR,AINCR0;指向下一个被传送地址INCDPTR;指向下一个传送目标地址CJNEA,#24H,LOOP0;判断是否为“$”字符(ASCII码为24H),若不是继续SJMP$;是“$”字符,停止传送END例5.10编程将扩展RAM1000H为起始地址的16个数据传送到片内基本RAM20H为起始地址的单元中。解:本例中,数据传送的次数是固定的,为16次;因此,可用一个计数器来控制循环体程序的执行次数。既可以用加1计数来实现控制(采用CJNE指令),也可以采用减1计数来实现控制(采用DJNZ指令)。一般情况下,采用减1计数控制居多。参考程序如下:ORG 0000H MOVDPTR,#1000H;设置被传送数据的地址指针 MOVR0,#20H;设置目的地地址指针 MOVR2,#10H;用R2作计数器,设置传送次数LOOP: MOVXA,@DPTR;取被传送数 MOV@R0,A;传送到目的地 INCDPTR;指向下一个源操作数地址 INCR0;指向下一个目的操作数地址 DJNZR2,LOOP;计数器R2减1,不为0继续,否则结束传送 SJMP$END例5.11已知单片机系统的系统时钟频率12MHZ,试设计一软件延时程序,延时时间为10ms。解:软件延时程序是应用编程中的基本子程序,是通过反复执行空操作指令(NOP)和循环控制指令(DJNZ)占用时间来达到延时目的的。因为执行一条指令的时间非常短,一般都需要采用多重循环才能满足要求。参考程序如下:源程序 系统时钟数占用时间DELAY: MOVR1,#100 21/6μsDELAY1: MOVR2,#200 21/6μs内循环外循环DELAY2: 内循环外循环NOP11/12μs NOP 11/12μs DJNZR2,DELAY241/3μsDJNZR1,DELAY1 41/3μs RET 41/3μs例5.12编程实现C=a2+b2。设a、b均小于10且分别存于扩展RAM的1000H、1001H单元,要求运算结果C存于外部RAM1002H单元。解:本题可利用子程序完成求单字节数据的平方,然后通过调用子程序求出a2和b2。参考程序如下:;主程序ORG 0000HSTART:MOVDPTR,#1000H MOVXA,@DPTR ;取a的值 LCALLSQUARE ;调用子程序求a的平方 MOVR1,A ;a2暂存于R1中 INCDPTR MOVXA,@DPTR;取b的值 ACALLSQUARE ;调用子程序求b的平方ADDA,R1 ;A←a2+b2 INCDPTR MOVX@DPTR,A ;存结果 SJMP$;子程序如下ORG 2500HSQUARE: INCA;表首地址与查表指令相隔1个字节,故加1调整MOVCA,@A+PC ;使用查表指令求平方RETTAB:DB0,1,4,9,,16,25,36,49,64,81ENDSQR子程序的入口参数和出口参数都是通过A进行传递的。例5.13有两个32位无符号数分别存放在片内基本RAM20H和30H为起始地址的存储区域内,低字节在低地址,高字节在高地址。编程将两个32位无符号数相加结果存在扩展RAM0020H为起始地址的存储区域中。解:入口时,R0、R1、DPTR分别指向被加数、加数、和的低字节地址,R7传递运算字节数,出口时,DPTR指向和的高字节地址。参考程序如下:;主程序ORG 0000HMOVR0,#20HMOVR1,#30HMOVDPTR,#0020HMOVR7,#04HLCALLADDITIONSJMP$;子程序ADDITION:CLRC;ADDITION1:MOVA,@R0;取被加数ADDCA,@R1;与加数相加MOVX@DPTR,A;存和INCR0;修改指针,指向下一位操作数INCR1INCDPTRDJNZR7,ADDITION1;判断运算是否结束CLRAADDCA,#00HMOVX@DPTR,A;计算与存储最高位的进位位RETEND例5.14把内部RAM中20H单元中的十六进制数转换为2位ASCII码,存放在R0指示的连续单元中。解:参考程序如下:;主程序ORG 0000HMOVA,20H;取转换数据SWAPA;高、低4位对调PUSHACC;参数(转换数据)入栈LCALLHEX_ASC;调用十六进制转ASCII码子程序POPACC;取转换后数据MOV@R0,A;存高位十六进制数转换结果INCR0;修改指针,指向低位十六进制数转换结果存放地址PUSH20H;参数(转换数据)入栈LCALLHEX_ASC;调用十六进制转ASCII码子程序POPACC;取转换后数据MOV@R0,A;存低位十六进制数转换结果SJMP$;程序结束;子程序HEX_ASC:MOVR1,SP;取堆栈指针DECR1DECR1;R1指向被转换数据XCHA,@R1;取被转换数据,同时保存A值ANLA,#0FH;取1位十六进制数ADDA,#2;偏移量调整,所加值为MOVC指令与下一DB伪指令间字节数MOVCA,@A+PC;查表XCHA,@R1;存结果于堆栈,同时恢复A值RET;子程序返回;16位十六进制数码对应的ASCII码ASC_TAB:DB30H,31H,32H,33H,34H,35H,36H,37HDB38H,39H,41H,42H,43H,44H,45H,46H一般说来,当相互传递的数据较少时,采用寄存器传递方式可以获得较快的传递速度。当相互传递的数据较多时,宜采用存储器传递。如果是子程序嵌套,宜采用堆栈方式。例5.15用4个按键控制8只LED灯的显示,按下S1键,B3、B4对应灯亮;按下S2键,B2、B5对应灯亮;按下S3键,B1、B6对应灯亮;按下S4键,B0、BD7对应灯亮;不按键,B2、B3、B4、B5对应灯亮。解:设P1口控制8只LED灯,低电平驱动;KEY_S1、KEY_S2、KEY_S3、KEY_S4按键分别接P3.0、P3.1、P3.2、P3.3引脚,低电平有效。参考程序如下:#include<REG51.H> #defineuintunsignedint sbitKEY_S1=P3^0; /*定义输入引脚*/sbitKEY_S2=P3^1; sbitKEY_S3=P3^2; sbitKEY_S4=P3^3; /*――――――――延时子函数――――――――――*/voiddelay(uintk) /*定义延时子函数*/{ uinti,j; for(i=0;i<k;i++){ for(j=0;j<121;j++) {;}} } /*―――――――主函数―――――――――――*/voidmain(void) /*定义主函数*/{ delay(50); /*调用延时子函数*/while(1) { if(!KEY_S1){P1=0xe7;} /*按S1键,P1口B3、B4对应灯亮*/ elseif(!KEY_S2){P1=0xdb;} /*按S2键,P1口B2、B5对应灯亮*/ elseif(!KEY_S3){P1=0xbd;} /*按S3键,P1口B1、B6对应灯亮*/ elseif(!KEY_S4){P1=0x7e;} /*按S4键,P1口B0、B7对应灯亮*/ else{P1=0xc3;} /*不按键,P1口B2、B3、B4、B5对应灯亮*/ delay(5); } } 例5.16用4个按键控制8只LED灯的显示,按下S1键,B3、B4对应灯亮;按下S2键,B2、B5对应灯亮;按下S3键,B1、B6对应灯亮;按下S4键,B0、B7对应灯亮;当不按键或多个键同时按下时,B2、B3、B4、B5对应灯亮。解:功能与例5.15基本一致,例5.15中是采用分支语句if实现的,现采用开关语句switch语句实现。设P1口控制8只LED灯,低电平驱动;KEY_S1、KEY_S2、KEY_S3、KEY_S4按键分别接P3.0、P3.1、P3.2、P3.3引脚,低电平有效。参考程序如下:#include<REG51.H> #defineucharunsignedcharsbitKEY_S1=P3^0; /*定义输入引脚*/sbitKEY_S2=P3^1; sbitKEY_S3=P3^2; sbitKEY_S4=P3^3; /*――――――――――――――――――*/voidmain(void) { uchartemp;P3=0xff; /*将P3口置成输入状态*/ while(1) { temp=P3; /*读P3口的输入状态*/ switch(temp&=0x0f) /*屏蔽高4位*/ { case0x0e:P1=0xe7;break; /*按S1键,P1口B3、B4对应灯亮*/ case0x0d:P1=0xdb;break;/*按S2键,P1口B2、B5对应灯亮*/ case0x0b:P1=0xbd;break;/*按S3键,P1口B1、B6对应灯亮*/ case0x07:P1=0x7e;break;/*按S4键,P1口B0、B7对应灯亮*/default:P1=0xc3;break; /*不按键或同时按下多个按键时,P1口B2、B3、B4、B5对应灯亮*/ }}} 例5.17定义一组数字,上电复位运行,LED数码管按数组所列数字顺序显示;按下控制键,LED数码管按数组中数字由小到大显示。解:设LED数码管为共阴极数码管,用P0口控制,P0.0~P0.7与数码管的a、b、c、d、e、f、g、dp引脚对应相接,实现显示的字形控制;P2.0~P2.4与数码管(0~4)的公共端对应相接,实现显示位的控制。参考程序如下:#defineuintunsignedint sbitKEY_S1=P3^2; ucharcodeSEG7[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};/*定义显示段码数组*/ucharcodeACT[5]={0xfe,0xfd,0xfb,0xf7,0xef};/*定义显示位码数组*/uintdataa[10]={222,111,0,333,444,555,888,666,777,999};/*定义显示数字数组*//*――――――――――――――延时子函数―――――――――――――――*/voiddelay(uintk) /*定义延时子函数*/{ uinti,j; for(i=0;i<k;i+

温馨提示

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

评论

0/150

提交评论