当前位置:文档之家› 5 STC15F2K60S2单片机的程序设计 例题

5 STC15F2K60S2单片机的程序设计 例题

第5章STC15F2K60S2单片机的程序设计例题例5.1 分析ORG在下面程序段中的控制作用ORG 1000HSTART:MOV R0,#60HMOV R1,#61H……ORG 1200HNEXT:MOV DPTR,#1000HMOV R2,#70H……解:以START开始的程序汇编后机器码从1000H单元开始连续存放,不能超过1200H 单元;以NEXT开始程序汇编后机器码从1200H单元开始连续存放。

例5.2 分析END在下面程序段中的控制作用。

START:MOV A,#30H……END STARTNEXT:……RET解:汇编程序对该程序进行汇编时,只将END伪指令前面的程序转换为对应的机器代码程序,而以NEXT标号为起始地址的程序将予以忽略。

因此,若NEXT标号为起始地址的子程序是本程序的有效子程序的话,应将整个子程序段放到END伪指令的前面。

例5.3 分析下列程序中EQU指令的作用AA EQU R1 ;给AA赋值R1DA TA1 EQU 10H ;给DA TA1赋值10HDELAY EQU 2200H ;给DELAY赋值2200HORG 2000HMOV R0,DATA1 ;R0←(10H)MOV A,AA ;A←(R1)LCALL DELAY ;调用起始地址为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 码来表示,既百位数、十位数与个位数。

如何求解呢?(1)用8位二进制数据减100,够减百位数加1,直至不够减为止;再用剩下的数去减10,够减十位数加1,直至不够减为止;剩下的数即为个位数。

(2)用8位二进制数据除以100,商为百位数,再用余数除以10 ,商为十位数,余数为个位数。

很显然,第(1)种方法更复杂,应选用第(2)种算法。

设8位二进制数据存放在20H 单元,转换后十位数、个位数存放在30H单元,百位数存放在31H单元。

参考程序如下:ORG 0000HMOV A, 20H ;取8位二进制数据MOV B, #100DIV AB ;转换数据除以100,A为百位数MOV 31H, A ;百位数存放在31H单元MOV A, B ;取余数MOV B, #10DIV AB ;余数除以10,A为十位数,B为个位数SW AP A ;将十位数从低4位交换到高4位ORL A, B ;十位数、个位数合并为压缩BCD码MOV 30H, A ;十位数、个位数存放在30H(高4位为十位数,低4位为个位数)SJMP $END例5.5 求8位有符号数的补码。

设8位二进制数存放在片内RAM 30H单元内。

解:对于负数的补码为除符号位以外取反加1,而正数的补码就是原码,因此,关键的地方是判断数据的正负,最高位为0,表示为正数,最高位为1,表示为负数。

参考程序如下:ORG 0000HMOV A,30HJNB ACC.7,NEXT ;为正数,不进行处理CPL A ;负数取反ORL A,#80H ;恢复符号位INC A ;加1MOV 30H,ANEXT:SJMP NEXT ;结束END例5.6 试编写计算下式的程序:100 (X≥0)Y =-100 (X < 0)解:该例是一个双分支程序,本题关键是判断X是正数,还是负数?判断方法同例5.5。

设X存在40H单元中,结果Y存放于41H中。

程序流程图如图5.5所示。

图5.5 例5.6程序流程图参考程序如下:X EQU 40H ;定义X的存储单元Y EQU 41H ;定义Y存储单元ORG 0000HMOV A,X ;取XJB ACC.7,BRANCH1 ;若ACC.7为1则转向BRANCH1,否则顺序执行MOV A,#64H ;X≥0,Y=100SJMP COMMON ;转向COMMON(分支公共处)BRANCH1:MOV A,#9CH ;X<0,Y= -100,把-100的补码(9CH)送A COMMON:MOV Y,A ;保存ASJMP $;程序结束END例5.7 设各分支的分支号码从0开始按递增自然数排列,执行分支号存放在R3中,编写多分支处理程序。

解:首先,在程序存储器中建立一个分支表,分支表中按从0开始的分支顺序从起始地址(表首地址,如TABLE)开始存放各分支的一条转移指令(AJMP或LJMP,AJMP占用2个字节,LJMP占用3个字节),各转移指令的目标地址就是各分支程序的入口地址。

根据各分支程序的分支号,转移到分支表中对应分支的入口处,执行该分支的转移指令,再转到分支程序的真正入口处,从而执行该分支程序。

参考程序如下:ORG 0000HMOV A, R3 ;取分支号RL A ;分支号乘2,若分支表中用LJMP,则改分支号乘3MOV DPTR, #TABLE ;分支表表首地址送DPTRJMP @A+DPTR ;转到分支表该分支的对应入口处TABLE:AJMP ROUT0 ;分支表,采用短转移指令,每个分支占用2个字节AJMP ROUT1 ;各分支在分支表的入口地址=TAB+分支号×2AJMP ROUT2……ROUT0:……;分支0程序LJMP COMMON ;分支程序结束后,转各个分支的汇总点ROUT1:……;分支1程序LJMP COMMON ;分支程序结束后,转各个分支的汇总点ROUT2:……;分支2程序LJMP COMMON ;分支程序结束后,转各个分支的汇总点……COMMON:SJMP COMMON ;各个分支的汇总点END注意:不管哪个分支程序执行完毕后,都必须回到所有分支公共回合处,如各分支程序中的“LJMP COMMON”指令。

BUFFER的存储区域内,并统计传送字符的个数,直到发现空格字符停止传送。

解:题目中已明确发现空格字符时就停止传送,因此,编程时应先对传送数据进行判断,再决定是否传送。

设DATA为20H,BUFFER为0200H,参考程序如下:ORG 00000HDA TA EQU 20HBUFFER EQU 0200HMOV R2, #00H ;统计传送字符个数计数器清零MOV R0, #DATA ;设置源操作数指针MOV DPTR, #BUFFER ;设置目标操作数指针LOOP0:MOV A, @R0 ;取被传送数据CJNE A, #20H, LOOP1 ;判断是否为空格字符(ASCII码为20H)SJMP STOP ;是空格字符,停止传送LOOP1:MOVX @DPTR, A ;不是空格字符,传送数据INC R0 ;指向下一个被传送地址INC DPTR ;指向下一个传送目标地址INC R2 ;传送字符个数计数器加1SJMP LOOP0 ;继续下一个循环STOP:SJMP $ ;程序结束ENDBUFFER的存储区域内,字符串的结束字符是“$”。

解:程序功能与例5.8基本一致,但字符串的结束字符“$”是字符串中的一员,也是需要传送的,因此,编程时应先传送,再对传送数据进行判断,以判断字符串数据传送是否结束。

设DATA为20H,BUFFER为0200H,参考程序如下:DA TA EQU 20HBUFFER EQU 0200HORG 0000HMOV R0, #DATAMOV DPTR, #BUFFERLOOP0:MOV A, @R0 ;取被传送数据MOVX @DPTR, AINC R0 ;指向下一个被传送地址INC DPTR ;指向下一个传送目标地址CJNE A, #24H, LOOP0 ;判断是否为“$”字符(ASCII码为24H),若不是继续SJMP $ ;是“$”字符,停止传送END例5.10 编程将扩展RAM1000H为起始地址的16个数据传送到片内基本RAM20H为起始地址的单元中。

解:本例中,数据传送的次数是固定的,为16次;因此,可用一个计数器来控制循环体程序的执行次数。

既可以用加1计数来实现控制(采用CJNE指令),也可以采用减1计数来实现控制(采用DJNZ指令)。

一般情况下,采用减1计数控制居多。

参考程序如下:ORG 0000HMOV DPTR,#1000H ;设置被传送数据的地址指针MOV R0,#20H ;设置目的地地址指针MOV R2,#10H ;用R2作计数器,设置传送次数LOOP:MOVX A,@DPTR ;取被传送数MOV @R0,A ;传送到目的地INC DPTR ;指向下一个源操作数地址INC R0 ;指向下一个目的操作数地址DJNZ R2,LOOP ;计数器R2减1,不为0继续,否则结束传送SJMP $END例5.11 已知单片机系统的系统时钟频率12MH Z,试设计一软件延时程序,延时时间为10ms。

解:软件延时程序是应用编程中的基本子程序,是通过反复执行空操作指令(NOP)和循环控制指令(DJNZ)占用时间来达到延时目的的。

因为执行一条指令的时间非常短,一般都需要采用多重循环才能满足要求。

参考程序如下:源程序系统时钟数占用时间DELAY:MOV R1,#100 2 1/6μsDELAY1:MOV R2,#200 2 1/6μsDELAY2:NOP 1 1/12μsNOP 1 1/12μsDJNZ R2,DELAY2 4 1/3μsDJNZ R1,DELAY1 4 1/3μsRET 4 1/3μs外循环内循环。

相关主题