单片机原理编程题.docx

上传人:b****2 文档编号:24481697 上传时间:2023-05-28 格式:DOCX 页数:48 大小:249.10KB
下载 相关 举报
单片机原理编程题.docx_第1页
第1页 / 共48页
单片机原理编程题.docx_第2页
第2页 / 共48页
单片机原理编程题.docx_第3页
第3页 / 共48页
单片机原理编程题.docx_第4页
第4页 / 共48页
单片机原理编程题.docx_第5页
第5页 / 共48页
点击查看更多>>
下载资源
资源描述

单片机原理编程题.docx

《单片机原理编程题.docx》由会员分享,可在线阅读,更多相关《单片机原理编程题.docx(48页珍藏版)》请在冰豆网上搜索。

单片机原理编程题.docx

单片机原理编程题

一.编程题(每小题8分,共16分)

1.设在内RAM40H开始的存储区有若干个字符和数字,已知最后一个为字符“$“(并且只有一个,试统计这些字符数字的个数,结果存入30H单元中。

参考程序:

ORG0000H

START:

MOVR1,#40H;R1作为地址指针

CLRA;A作为计数器

LOOP:

CJNE@R1,#24H,NEXT;与“$”号比较,不等转移

SJMPNEXT1;找到“$“结束循环

NEXT:

INCA;计数器加1

INCR1;指针加1

SJMPLOOP;循环

NEXT1:

INCA;再加入”$”这个字符

MOV30H,A;存结果

END

2.试编一程序,分别统计在内部RAM的30H~50H单元的数据区中奇数和偶数的个数,并将奇数和偶数的个数分别存放在51H和52H单元中。

参考程序:

ORG0000H

MOV51H,#0H

MOV52#,#0H

!

MOVR1,#30H

MOVR0,#20H

MOVA,@R1

INCR1

ANLA,#01H

JZLOOP1

INC51H

SJMPLOOP2

LOOP1:

INC52H

LOOP2:

DJNZR0,LOOP3

|

RET

3.用8XX51的P1口接8个LED发光二极管,由INT0接一消抖按键开关,开始的LED亮,以后由INT0按键每中断一次,下一个LED亮,顺序下移,且每次只一个LED亮,周而复始。

请编制程序。

参考程序:

ORG0000H

AJMPMAIN

ORG0003H

RLA;中断服务

MOVP1,A

RETI

MAIN:

MOVA,#0FFH

MOVP1,A;第一灯亮

SETBEA

SETBEX0;允许INT0外部中断

SETBIT0;中断触发方式为下降沿触发

SJMP$;等待中断

4.设有100个有符号数,连续存放在以2000H为首地址的存储区中,试编程统计其中正数、负数、零的个数并分别存放在30H、31H、32H单元中。

MOV30H,#0

MOV31H,#0

MOV32H,#0

:

MOVDPTR,#2000H

MOVR1,#100

L4:

MOVXA,@DPTR

INCDPTR

CJNEA,#0,L1

INC32H

SJMPL2

L2:

JCL3

INC30H

SJMPL2

L3:

INC31H

L2:

DJNZR1,L4

SJMP$

5.编程将内部数据存储器20H~24H单元压缩的BCD码转换成ASCⅡ存放在于25H开始的单元。

参考程序:

注意压缩的BCD码为一个字节占两位BCD码。

ORG0000H

MOVR7,#05H;R7为转换字节数

MOVR0,#20H;R0为源操作数地址

MOVR1,#25H;R1为目的操作数地址

NE:

MOVA,@R0

%

ANLA,#0FH;先取低位BCD码

ADDA,#30H;将BCD码转换成ASCⅡ码

MOV@R1,A

INCR1

MOVA,@R0

ANLA,#0F0H;取高位BCD码

SWAPA;半字节交换

ADDA,#30H;将高位BCD码转换成ASCⅡ码

MOV@R1,A

INCR0

~

INCR1

DJNZR7,NE

SJMP$

END

编程题,另外加上第4章课件上的例子。

三、程序解释(每小题5分,共10分)

1.

ORG0200H

MOVDPTR,#1000H

/

MOVR0,#20H

LOOP:

MOVXA,@DPTR

MOV@R0,A

INCDPTR

INCR0

CJNER0,#71H,LOOP

SJMP$

程序功能:

把片外数据存储器1000H~1050H中的内容传送到片内数据存储器20H~70H中。

#

2.ORG0200H

MOVA,R0

ANLA,#0FH

MOVDPTR,#TAB

MOVCA,@A+DPTR

MOVR0,A

SJMP$

TAB:

DB30H,31H,32H,33H,34H,35H,36H,37H,38H,39H;0~9的ASCⅡ码

DB41H,42H,43H,44H,45H,46H;A~F的ASCⅡ码

程序功能:

利用查表的方法实现RO中的十六进制数转换为ASCⅡ码

对每小题程序中划线的指令含义(或指令作用)进行解释,并说明程序的作用。

*********************************

1.程序解释

ORG100H

MOVA,R0;R0的内容送A

ANLA,#0FH

MOVR1,A

MOVA,R0

SWAPA;A的内容高低4位交换

#

ANLA,#0FH

MOVR2,A

SJMP$;等待

END

该程序的作用是:

将原R0中数据按照高低4位分成两个字节,低位字节保存在R1中,高位字节保存到R2中。

2.程序解释

ORG30H

MOVR0,#data1;data1送R0

MOVR1,#data2

MOVR2,#2

CLRC

LOOP:

MOVA,@R0

SUBBA,@R1;(A)-(C)-((R1))→A

MOV@R0,A

INCR0

INCR1

DJNZR2,LOOP;(R2)-1不等于零,跳LOOP处

SJMP$

END

该程序的作用是:

将data1中的双字节数据减去data2中的双字节数据,结果

{

保存到data1中

3.程序解释

ORG30H

VARDATA30H

FUNCDATA31H

MOVA,VAR;30单元的内容送A

JZDONE;A为零转移

JNB,POSI;A的最高位为0(正数)转移

MOVA,#0FFH;提示:

0FFH表示-1

SJMPDONE

-

POSI:

MOVA,#01H

DONE:

MOVFUNC,A

SJMP$

END

该程序的作用是:

判断30H单元中的内容,结果放在31H单元中。

大于0放1,

小于0放-1,等于零放0。

4.程序解释

ORG100H

MOVA,R3

RLA;A左循环一位(即乘2)

\

MOVDPTR,#BRTAB;绝对转移地址表起始地址送DPTR

JMP@A+DPTR;(PC)=(A)+(DPTR)

……

BRTAB:

AJMPROUT000

AJMPROUT001

AJMPROUT002

……

AJMPROUT127

END

该程序的作用是:

本程序完成128分支转移操作,根据R3中的数值转移到

相应的128个分支程序中。

5.程序解释

ORG0030H

MOVR0,#22H;立即数22H送R0

MOV@R0,#00H

INCR0;R0中的内容加1

MOV@R0,#01H

INCR0

MOV@R0,#02H;02H送24H单元

SJMP$

>

END

该程序的作用是:

向单片机内部RAM的22H,23H,24H单元分别送

数据00,01,02。

6.程序解释

ORG0030H

MOVA,20H

MOVB,21H

DIVAB;A除以B

MOV31H,A;商送30H单元

IMOV31H,B;余数送31H单元

/

SJMP$

END

该程序的作用是:

将20H单元中有一个二进制数除以21H单元中二进制数,商保存到30H单元,余数保存到31H。

7.程序解释

CHENGJIDATA1000H

GRADADATA20H

GRADBDATA21H

MOVGRADA,#00H

MOVGRADB,#00H

MOVR2,#100

;

MOVDPTR,#CHENGJI;1000H送DPTR

LOOP:

MOVXA,@DPTR

CJNEA,#60,LOOP1

LOOP1:

JNCNEXT1

INCGRADB;21H单元的内容加1

SJMPNEXT

NEXT1:

INCGRADA

NEXT:

INCDPTR

DJNZR2,LOOP;(R2)-1→R2不为零,转移

SJMP$

END

该程序的作用是本程序完成对100个数(如100个学生成绩)的过滤统计,成绩在60以上的学生统计到GRADA,<60的学生统计到GRADB。

8.程序解释

LENDATA20H

SUMDATA21H

BLOCKDATA22H

CLRA;A清0

MOVR2,LEN

MOVR1,#BLOCK

LOOP:

ADDA,@R1;(A)+((R1))→A

|

INCR1

CHECK:

DJNZR2,LOOP;LEN个单元未加完,继续

MOVSUM,A

SJMP$

END

该程序的作用是:

完成BLOCK单元开始的LEN单元中数据个数的累加,累加结果保存到SUM单元中。

9.程序解释

XXDATA40H

YYDATA41H

MOVA,XX

[

JZDONE

MOVR0,#0FFH;提示:

0FFH表示-1

JNB,NEG;若A<0,则转向NEG

MOVR0,#01H;01送R0

NEG:

MOVA,R0

DONE:

MOVYY,A;(A)送41H单元

SJMP$

END

该程序的作用是:

判断40H单元中的内容,结果放在41H单元中。

大于0放1,

小于0放-1,等于0放0。

10.程序解释

ONEDATA30H

TWODATA31H;TWO地址定义为31H

MAXDATA32H

CLRC;C清零

MOVA,ONE

SUBBA,TWO;(A)-(31H)结果送A

JNCXMAX

YMAX:

MOVA,TWO

SJMPDONE

XMAX:

MOVA,ONE

DONE:

MOVMAX,A

该程序的作用是:

本程序完成ONE和TWO的两个单元中的数的比较,大数存入

MAX单元中。

11.程序解释

BLOCK1DATA20H

BLOCK2DATA40H

MOVR0,#BLOCK1

MOVR1,#BLOCK2

MOVR2,#03

CLRC

LOOP:

MOVA,@R0;被加数送A

ADDCA,@R1;带进位加法

MOV@R0,A;和送(R0)

INCR0

INCR1

DJNZR2,LOOP1

SJMP$

END

-

该程序的作用是:

内部RAM中BLOCK1(20H)开始的三字节数与BLOCK2(40H)开始的两个三字节数相加,和数存放到BLOCK1开始的单元。

12.程序解释

SHIFT:

MOVDPTR,#TABJ

MOVA,R2

RLA;A乘2

ADDA,R2

JMP@A+DPTR;跳转到(A)+(DPTR)→PC

TABJ:

LJMPPRG0;跳转到PRG0

LJMPPRG1

……

<

LJMPPRGN

该程序的作用是:

根据内部RAM中R2数据转向不同的子程序,R2=0转PRG0,R2=1转PRG1,…R2=N转PRGN

13.程序解释

START:

CLRA

MOVR2,#10

MOVR1,#21H;21H送R1

NEXT:

ADDA,@R1;(A)+((R1))→A

INCR1

DJNZR2,NEXT;未加完,跳转

MOV22H,A

SJMP$

END

该程序的作用是:

完成21H单元开始的10个数据块的累加,结果保存到22H单元。

14.程序解释

LENDATA20H

MAXDATA21H

ADDRDATA30H

MOVMAX,#00H

MOVR0,#ADDR

LOOP:

MOVA,@R0

CJNEA,MAX,NEXT1;(A)与(MAX)比较,不等去NEXT

NEXT1:

JCNEXT;C=1去NEXT

MOVMAX,A

NEXT:

INCR0;R0内容加1

DJNZLEN,LOOP

SJMP$

END

该程序的作用是:

内部RAM中ADDR(30H)开始的x个数据的比较,将最大的数字送MAX单元。

x由LEN(20H)单元给出。

15.程序解释

MOVA,R0

`

ANLA,#0FH;0FH与A相与,结果送A

MOVDPTR,#ASCTAB

MOVCA,@A+DPTR;查表

MOVR0,A;查表结果存入R0

SJMP$

ASCTAB:

DB‘0’,‘1’,‘2’,‘3’,‘4’

DB‘5’,‘6’,‘7’,‘8’,‘9’

DB‘A’,‘B’,‘C’,‘D’,‘E’,‘F’

END

该程序的作用是:

将R0中低4位的0~F的十六进制数据转换成ASCTAB中的编码存放到R0中。

16.程序解释

ORG100H

MERG:

MOVXA,@R0;读片外RAM第一字节

ANLA,#0FH

SWAPA;高低4位相互交换

MOVB,A

INCR0

MOVXA,@R0

ANLA,#0FH

ORLA,B;A或B,结果送A

;

DECR0

MOVX@R0,A

SJMP$

END

该程序的作用是:

将R0指向的两个字节的低4位和并为一个字节,保存到原R0指向的存储单元。

17.程序解释

START:

MOVDPTR,#DTATAB

MOVA,R4;(R4)→A

ADDA,DPL;(DPL)+(A)→A

MOVDPL,A

{

CLRA;清A

ADDCA,DPH

MOVDPH,A

CLRA

MOVCA,@A+DPTR

MOVR5,A

RET

DTATAB:

DB……;元素表格,高字节在前

DB……

END

该程序的作用是:

根据R4中的内容(元素序号)在DTATAB表格中查表,将查表得到的数据存入R5中。

18.程序解释

START:

MOVA,R0

ACALLSQR;调用子程SQR

MOVR2,A

MOVA,R1

ACALLSQR

ADDA,R2;(R2)+(A)→A

MOVR2,A

SJMP$

:

SQR:

ADDA,#01H

MOVCA,@A+PC;查平方表

RET

SQRTAB:

DB0,1,4,9,16;平方表

DB25,36,49,64,81

END

该程序的作用是:

将R0和R1中的两个个位数进行平方元算,然后相加,和存入R2中。

19.程序解释

MOVR2,#0AH

$

MOVR0,#50H

CLRA

LOOP:

MOV@R0,A;(A)→(R0)

INCR0

DJNZR2,LOOP;(R2)-1不等于0,跳转

RET;子程序返回

END

该程序的作用是:

将50H~59H单元置0

20.程序解释

CONT:

MOVR0,#10;10送R0

MOV31H,#00H

MOVR1,#01H

CLOP:

MOVA,R1

CLRC

RLCA;乘2

ADDA,31H;(A)+(31H)结果送A

MOV31H,A

INCR1

DJNZR0,CLOP

RET

END

该程序的作用是:

将1~10十个数乘2后再累加,结果送31H单元。

21.程序解释

DLAY:

MOVR7,#02H;02H送R7

DL:

MOVR6,#0FFH

DL1:

DJNZR6,DL1;(R6)-1不为零转移。

DJNZR7,DL

RET

END;程序结束伪指令

<

该程序的作用是:

利用R6,R7实现双循环延时子程序

22.程序解释

MATHDATA1000H

PASSDATA20H

NOPASSDATA21H

MOVPASS,#00H

MOVNOPASS,#00H

MOVR2,#0C8H

MOVDPTR,#MATH

LOOP:

MOVXA,@DPTR;片外单元((DPTR))→A

CJNEA,#60,LOOP1;(A)不等于60转移

LOOP1:

JNCNEXT1

NEXT:

INCNOPASS

SJMPNEXT2

NEXT1:

INCPASS;PASS单元内容加1

NEXT2:

INCDPTR

DJNZR2,LOOP

RET

END

该程序的作用是:

完成1000H开始的200(C8H)个数的过滤统计,在60及以上的统计到PASS,<60的到NOPASS。

?

23.程序解释

CLEAN:

MOVDPTR,#1000H;设置数据区首地址

MOVR2,#51H

CLRA

CLOOP:

MOVX@DPTR,A;0→(DPTR)

INCDPTR

DJNZR2,CLOOP;R2-1不为零转移

RET

END

该程序的作用是:

将外部RAM1000H~1050H单元的内容清零。

24.程序解释

DMOV:

MOVDPTR,#2000H

MOVR2,#00H

DLOOP:

MOVXA,@DPTR;设置源数据区首地址

MOVDPH,#30H;置目的数据区高8位地址

MOVX@DPTR,A

MOVDPH,#20H

INCDPTR;指向下一个数据单元

DJNZR2,DLOOP

\

END

该程序的作用是:

将2000H~20FFH的数据块传送到3000H~30FFH单元

25.程序解释

LOK1:

MOV21H,0

MOVR2,#08H;置统计次数

MOVA,20H

LOOP:

RLCA;A的内容带进位作循环

JNCLP1

INC21H

LP1:

DJNZR2,LOOP;次数未完继续

RET

该程序的作用是:

求20H单元数据中”1”的个数,并将统计结果存入21H。

26.程序解释

SUMDATA31H

BLOCKDATA33H

CLRA

CLRC

MOVSUM,A

~

MOVSUM+1,A

MOVR2,#10

MOVR1,#BLOCK;33H送R1

LOOP:

MOVA,SUM

ADDA,@R1;(A)+((R1))→A

MOVSUM,A

MOVA,SUM+1

ADDCA,0;加进位位到高字节

MOVSUM+1,A

INCR1

\

DJNZR2,LOOP

SJMP$

END

该程序的作用是:

完成BLOCK开始的10个字节数据的累加,结果(双字节)保存到(SUM+1)(SUM)。

27.程序解释

ORG0000H

SJMPMAIN;跳转到MAIN

ORG0003H

………..

ORG0030H

Main:

……;主程序

SUBINT0:

……

RETI;INT0中断返回

SUB_T0:

……

SUB_INT1:

……

SUB_T1:

……

SUB_UART:

……

该程序的作用是:

8031/8051系统程序框架,包括主程序及全部中断服务程序框架。

28.程序解释

TB:

MOVA,R2

ADDA,R2

MOVR3,A

ADDA,#6

MOVCA,@A+PC;查第一字节

XCHA,R3;交换A,R3内容,保存在R3

ADDA,#3

MOVCA,@A+PC

MOVR4,A

RET

~

TAB:

DW1520,3721,……

DW……

该程序的作用是:

根据R2内容为索引,在TAB检索数据,检索结果存放到R3R4中。

(TAB中内容为双字节数据)

29.程序解释

DATLENDATA21H

SEACH:

MOVR0,#30H;30H送R0

MOV20H,#0FFH

SLOP:

MOVA,@R0

CJNEA,20H,NEXT;A与20H单元内容比较

NEXT:

JNCSLP1;(A)大,跳转

[

MOV20H,A

SLP1:

INCR0

DJNZDATLEN,SLOP

RET

END

该程序的作用是:

将30H开始的DATLEN个数据中最小的数搜出,保存到20H单元。

30.程序解释

ORG100H

DATAXDATA10H

DATAYDATA11H

CLRC;清C

MOVA,DATAX

RLCA;A左循环

JNCPOSI

CLRA

SJMPDONE

POSI:

MOVA,#01H

DONE:

MOVDATAY,A;(A)送DATAY

SJMP$

END

该程序的作用是:

判断10H单元的内容,结果送11单元,大于等于零时送1,小于零时送零。

31.程序解释

ORG100H

MOVA,R0

CJNEA,#3AH,NEXT1;(A)与3AH比较

JNCERR

CJNEA,#30H

JCERR;有借位,跳转

CLRC

SUBBA,#30H;转换ASCII码为十进制数字

*

SJMPDONE

ERR:

MOVA,#0FFH

DONE:

MOVR0

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 工程科技 > 交通运输

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1