单片机程序.docx

上传人:b****5 文档编号:8280715 上传时间:2023-01-30 格式:DOCX 页数:20 大小:69.15KB
下载 相关 举报
单片机程序.docx_第1页
第1页 / 共20页
单片机程序.docx_第2页
第2页 / 共20页
单片机程序.docx_第3页
第3页 / 共20页
单片机程序.docx_第4页
第4页 / 共20页
单片机程序.docx_第5页
第5页 / 共20页
点击查看更多>>
下载资源
资源描述

单片机程序.docx

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

单片机程序.docx

单片机程序

1、编程将片内RAM30H单元开始的15B的数据传送到片外RAM3000H开始的单元中去。

解:

STRAT:

MOVR0,#30H

MOVR7,#0FH

MOVDPTR,#3000H

LOOP:

MOVA,@R0

MOVX@DPTR,A

INCR0

INCDPTR

DJNZR7,LOOP

RET

2、编程将片内RAM40H单元中的内容送到片外RAM2000H单元中。

解:

ORG0100H

MOVA,40H

MOVDPTR,#2000H

MOVX@DPTR,A

END

3、将内部RAM40H开始的10个字节的数搬到外部RAM2000H处

MOVDPTR,#2000H

MOVR0,#40H

MOVR2,#0AH

LOOP:

MOVA,@R0

MOVX@DPTR,A

INCR0

INCDPTR

DJNZR2,LOOP

SJMP$

END

4、将存于外部RAM8000H开始的50H数据传送0010H的区域,请编程实现。

MOVDPTR,#8000H

MOVR0,#10H

MOVR2,#50H

LOOP:

MOVXA,@DPTR;取数

MOVX@R0,A;存数

1NCDPTR

1NCR0

DJNZR2,LOOP

RET

 

5.片内RAM40H开始的单元内有10B二进制数,编程找出其中最大值并存于50H单元中.

解START:

MOVR0,#40H;数据块首地址送R0

MOVR7,#09H;比较次数送R7

    MOVA,@R0;取数送A

LOOP:

INCR0

MOV30H,@R0;取数送30H

CJNEA,30H,NEHT;(A)与(30H)相比

NEXT:

JNCBIE1(A)≥(30H)转BIR1

MOVA,30H;(A)<(30H),大数送A

 BIE1:

DJNZR7,LOOP;比较次数减1,不为0,继续比较

    MOV50H,A;比较结束,大数送50H

    RET

6.片内RAM30H开始的单元中有10B的二进制数,请编程求它们之和(和<256).

解 ADDIO:

MOVR0,30H

MOVR7,#9

MOVA,@R0

LOOP:

INCR0

ADDA,@R0

DJNZR7,LOOP

MOV30H,A

RET

 

7、设从内存BLOCK单元开始存放一无符号数的数据块,其长度为LEN。

试找出其最小数,并存入MIN单元。

COMP:

MOVA,#0FFH;置比较的初始值

MOVR2,#LEN;置数据块长度

MOVR1,#BLOCK;置地址指针

LOOP:

CLRC

SUBBA,@R1;比较

JCNEXT;若小,则恢复原值

MOVA,@R1

SJMPNEXT1

NEXT:

ADDA,@R1

NEXT1:

INCR1;若大,则取下个数比较

DJNZ:

DJNZR2,LOOP

MOVMN,A;存最小数

SJMP$

8、比较存放在ONE,TWO,TRE三个单元的无符号数,并将小数存放在20H单元中。

MOVA,ONE

CJNEA,TWO,RR

RR:

JCSS

MOVA,TWO

CJNEA,TRE,TT

TT:

JCWW

SJMPUU

SS:

CJNEA,TRE,VV

VV:

JCWW

UU:

MOVA,TRE

WW:

MOV20H,A

9、设在单片机内部RAM中从STR单元开始存放有一数据块,该数据块以#00H结束,试统计其中为#0FFH的单元个数并存入NUM单元。

COUNT:

CLRA;清计数单元

MOVR0,#STR;置地址指针

LOOP:

CJNE#0FFH,LOOP1;数据为#0FFH则计数单元加1

INCA

LOOP1:

INCR0

CJNE@R0,#000H,LOOP;数据块取完?

MOVNUMA;存统计结果

SJMP$

10、将片内RAM-2单元(如20H)的内容分成两段,并将它们分别存入2单元和3单元。

(高位清零)。

MOVR0,#21H

MOVA,20H

ANLA,#0FH

MOV@R0,A

INCR0

MOVA,20H

SWAPA

ANLA,#0FH

MOV@R0

11、从1加到5,最终结果存入35H,试编写程序。

解:

方法

(1)

ORG1000H

CLRA

MOVR0,#5

L2:

ADDA,R0

DJNZR0,L2

MOV35H,A

END

方法

(2)

ORG1000H

CLRA

MOVR0,#0

L1:

INCR0

ADDA,R0

CJNER0,#5,L1

MOV35H,A

END

12.从内部RAM30H单元开始,有10个单字节数据。

试编一个程序,把其中的正数、负数分别送40H和50H开始的内部RAM单元。

MOVR0,#30H

MOVR1,#40H

MOVA,#50H

MOVR7,#10

LOOP:

MOV20H,@R0

JB20H.7,FSHU

ZSHU:

MOV@R1,20H

INCR1

SJMPNEXT

FSHU:

XCHA,R1

MOV@R1,A

XCHA,R1

INCA

NEXT:

DJNZR7,LOOP

SJMP$

13、编一程序段,将字节地址30H~3FH单元的内容逐一取出减1,然后再放回原处,如果取出的内容为00H,则不要减1,仍将0放回原处。

MOVR7,#10H

MOVR1,#30H

LOOP:

CJNE@R1,#00H,NEXT

MOV@R1,#00H

SJMPNEXT1

NEXT:

DEC@R1

NEXT1:

INCR1

DJNZR7,LOOP

SJMP$

END

14、求平方子程序计算X=a^2+b^2

先建立0~9的平方表(十进制),TAB为表首地址指针。

子程序所完成的功能是用查表的方式求出平方值。

计算X=a^2+b^2时只要两次调用子程序分别求出a^2和b^2,然后相加即可。

(设X,a,b分别存于内部RAM的ONE,TWO和TRE三个单元中)。

子程序入口:

(A)=待查表的数子程序入口:

(A)=平方值

MAIN:

MOVA;ONE;调求平方子程序

ACALLSQR

MOVR1,A

MOVA,TWO

ACALLSQR

ADDA,R1;求平方和

MOVTRE,A

SJMP$

SQR:

INCA;修正查表偏移量(入口A)

MOVCA,@A+PC;查表求平方值(出口A)

RET;返回

TAB:

DB:

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

DB:

25,36,49,64,81

15、编程实现字符串长度统计:

设在单片机内RAM中从STR单元开始有一字符串《以ASCII码存放》,该字符串以$<其值为24H>结束,试统计该字符串的长度,其结果存于LON单元。

START:

CLRA;计数单元清零

MOVR0,#STR

LOOP:

CJNER0,#24H,NEXT;判断字符串是否结束

SJMPCOMP

NEXT:

INTA

INCR0

SJMPLOOP

COMP:

MOVLON,A;将长度存入LON单元

SJMP$

16、将31H、32H单元与41H、40H单元的双字节十进制无符号数相加,结果存入32H,31H,30H单元。

即(31H)(30H)+(41H)(40H)32H、31H、30H。

MOVR0,#30H

MOVR1,#40H

MOVR2,#02H

CLRC

L1:

MOVA,@R0

ADDCA,@R1

DAA

MOV@R0,A

INCR0

INCR1

DJNZR2,L1

CLRA

MOVACC.0,C

MOV@R0,A

17、编程实现逻辑运算:

Q=(U*(V+W))+X.Y)+Z。

设U~Z的位地址为00H~05H.Q的位地址为07H。

《实际中U~Z可以是外部输入端口信号或软件设定的一些控制位

MOVC,01H

ORLC,02H

ANLC,00H

MOVF0,C;暂存U*(V+W)的值

MOVC,03H

ANLC,/04H

ORLC,F0

ORLC,/05H

MOV07H,C;保存结果

18已知一MCS—51单片机系统的片内RAM20H单元存放了一个8位无符号数7AH,片外扩展RAM的8000H存放了一个8位无符号数86H,试编程完成以上两个单元中的无符号数相加,并将和值送往片外RAM的01H、00H单元中,同时将所编写程序运行完成后的数据和状态添入下表中给出的PSW的有关位以及寄存器A、DPTR和RAM单元中。

CY

A

DPTR

片外01H

片外00H

片外8000H

 0

01H 

8000H 

0lH 

00H 

 86H

MOVDPTR,#8000H;加数单元地址送DPTR

MOVXA,@DPTR;取加数之一

ADDA,20H;两数相加

MOVR0,#00H;和值的低位送片外00H单元

MOVx@R0,A

INCR0

CLRA;计算和值的高位

ADDCA,#00H

MOVx@R0,A;高位送片外01H单元

RET

19.已知变量X存于VAR单元,函数值Y存于FUNC单元,按下式编程求Y值。

Y=

MOVA,VAR

CJNEA,#0,COMP

SJMPRES;x=0,Y=0

COMP:

JNCPOSI;x>0,Y=1

MOVA,#0FFH;x<0,Y=-1

SJMPRES

POSI:

MOVA,#01H

RES:

MOVFUNC,A

RET

20.已知在R2中存放一个压缩的BCD码,请将它拆成个BCD字节,结果存于SUM开始的单元(低位在前)。

MOVR0,#SUM

MOVA,R2

ANLA,#OFH

MOV@R0,A;存低字节BCD

MOVA,R2

ANLA,#0F0H

SWAPA

1NCR0

MOV@R0,A;存高字节BCD

RET

21将A中的16进制数据(0—FFH)转换为BCD码存放在30H(百位)、31H(十位)、32H(个位)

HEXBCD:

MOVB,#100

DIVAB

MOV30H,A

MOVA,B

MOVB,#10

DIVAB

MOV31H,A

MOV32H,B

RET

22、将二位压缩的BCD码转换为二进制数,入口、出口均是A。

若是非法的BCD码,则A返回值为255。

SUBP:

MOVR1,A

ANLA,#0F0H

SWAPA

CJNEA,#10,NEXT1

NEXT1:

JNCERROR

MOVB,#10

MULAB

XCHA,R1

ANLA,#0FH

CJNEA,#10,NEXT2

NEXT2:

JNCERROR

ADDA,R1

RET

ERROR:

MOVA,#255

RET

23.编制一个循环闪烁灯的程序。

有8个发光二极管,每次其中某个灯闪烁点亮10次后,转到下一个闪烁10次,循环不止。

画出电路图。

(20分)

MOVA,#01H;灯亮初值

SHIFT:

LCAILFLASH;调闪亮10次子程序

RRA;右移一位

SJMPSHIFT;循环

FLASH:

MOVR2,#0AH闪烁10次计数

FLASH1;MOVP1,A;点亮

LCALLDELAY;延时

MOVP1,#00H;熄灭

LCALLDELAY;延时

DJNZR2,FLASH1;循环

RET

24、用8051输出控制8个LED从LED1到LED8、再到LED1…,每次一个LED发光,并不断循环。

一个开关控制引起中断,电平触发,中断后8个LED一起闪5下,然后恢复前面的循环。

写出完整的程序。

(软件延时用循环5*126*200次控制)

ORG0000H

LJMPSTART

ORG3H

LJMPINT00

START:

SETBEA

SETBEX0

CLRIT0

MOVA,#1

AGAIN:

MOVP1,A

ACALLDELAY

RLA

SJMPAGAIN

DELAY:

MOVR1,#5

LOOP1:

MOVR2,#200

LOOP2:

MOVR3,#126

DJNZR3,$

DJNZR2,LOOP2

DJNZR1,LOOP1

RET

INT00:

PUSHACC

PUSH1

PUSH2

PUSH3

MOVR4,#5

AGAIN:

MOVP1,#0FFH

ACALLDELAY

MOVP1,#0

ACALLDELAY

DJNZR4,AGAIN

POP3

POP2

POP1

POPACC

RETI

END

25、利用80C51的P0口控制8个发光二极管LED。

相邻的4个LED为一组,使2组每隔1s交替发光一次,周而复始。

设计出硬件电路图,编写程序。

解:

(1)程序设计(设fosc=12MHz)

ORG0100H

MOVA,#0FH

ABC:

MOVP0,A

ACALLDELAY1S

SWAPA

SJMPABC

DELAY1S:

MOVR5,#04

DEL1:

MOVR6,#250

DEL2:

MOVR7,#250

DEL3:

NOP

NOP

DJNZR7,DEL3

DJNZR6,DEL2

DJNZR5,DEL1

RET

END

(2)硬件电路图如图:

二、定时器,计数器

1、若8051的晶振频率fosc为6MHz,定时器/计数器T0工作在工作方式1,要求产生10ms定时,写出定时器的方式控制字和计数初值(分别写出TH0与TL0值)。

(1)T0:

定时方式,工作在方式1。

方式字TMOD=01H

(2)fosc=6MHz,16位计数器,10ms定时,设计数初值为a,

t=12/fosc*(216-a)10*103=12/6*(216-a)

a=60536=EC78H即TH0=ECHTL0=78H

所以:

TMOD=01HTH0=ECHTL0=78H

 

2、将定时器/计数器做脉冲信号发生器。

编程利用定时器T0定时,在P1.0端输出周期性方波信号,方波周期为2ms,已知晶振频率为6MHz。

解:

1)T0工作模式的设定:

选择模式1(16位方式)(最大定时131ms)

2)定时初值的设定:

X=216-(1ms×6×106/12)=65036=FE0CH,即:

TH0应装0FEH,TL0应装0CH。

ORG0000H

LJMPMAIN

ORG000BH

LJMPG

ORG0500H

MAIN:

MOVTMOD,#01H

MOVTL0,#0CH

MOVTH0,#0FEH

SETBEA

SETBET0

SETBTR0

HERE:

SJMPHERE

G:

MOVTL0,#0CH

MOVTH0,#0FEH

CPLP1.0

RETI

END

3、应用单片机内部定时器T0工作在方式1下,从P1.0输出周期为1ms的方波脉冲信号,已知单片机的晶振频率为6MHZ。

(1)计算时间常数X,应用公式X=216-t(f/12)

(2)写出程序清单

解:

解:

X=216-t(F/12)

=216-1*10-3*6*106/12

=OFEOCH

ORG3000H

START:

MOVTMOD,#01H

MOVTL0,#OCH

MOVTHO,#OFEH

SETBTR0

LOOP:

JBCTFO,DONE

SJMPLOOP

DONE:

MOVTL0,#OCH

MOVTHO,#OFEH

CPLP1.0

SJMPLOOP

4、应用单片机内部定时器T0工作在方式1下,从P1.0输出周期为2ms的方波脉冲信号,已知单片机的晶振频率为6MHZ。

(1)计算时间常数X,应用公式X=216-t(f/12)

(2)写出程序清单

解:

X=216-t(F/12)

=216-1*10-3*6*106/12

=OFEOCH

ORG3000H

START:

MOVTMOD,#01H

MOVTL0,#OCH

MOVTHO,#OFEH

SETBTR0

LOOP:

JBCTFO,DONE

SJMPLOOP

DONE:

MOVTL0,#OCH

MOVTHO,#OFEH

CPLP1.0

SJMPLOOP

5、已知晶振频率为6MHz,在P1.0引脚上输出周期为500微秒的等宽矩形波,若采用T1中断,工作方式2,试写出中断初始化程序

MOVTMOD,#20H

MOVTL1,#06H

MOVTH1,#06H

SETBEA

SETBET1

SETBTR1

SJMP$

 

6、按以下要求编写8051单片机定时器的初始化程序:

(1)T0作为定时,定时时间为10ms.

(2)T1作为计数,记满1000溢出。

(1)1.MOVR7,#10H

MOVR1,#30H

LOOP:

CJNE@R1,#00H,NEXT

MOV@R1,#00H

SJMPNEXT1

NEXT:

DEC@R1

NEXT1:

INCR1

DJNZR7,LOOP

SJMP$

END

1T0的工作方式0时:

tmax=213×=213×2us=16.384ms

定时10ms可达要求,则X=213-=213-=3192=C78H=6318H

②T0工作在方式1时:

tmax=216×=216×2us=131.072ms

定时10ms也可达要求,则X=216-=EC78H

③T0工作在方式2或3时:

tmax=28×=28×2us=512us

定时500us,循环20次,X=28-=06H

(2)方式0:

213-100=8092=1F9CH=FC1CH

X=M-计数值方式1:

216-100=FF9CH

方式2或3:

28-100=9CH

DELAY:

MOVTMOD#00H(#01H/#10H/#11H)

(MOVR3,#14H)

MOVTH0,#63H

MOVTL0,#18H

SETBTR0

LP1:

JBCTF0,CLOSE

SJMPLP1

CLOSE:

SJMP$

RET

 

三、绘图

阅读下列硬件图,补齐连接线(5分),并回答问题(各5分):

1、 ALE、PSEN、WR、RD的功能

ALE作地址锁存的选通信号,以实现低八位地址的锁存,PSEN信号作扩展程序存储器的读选通信号

WR、RD作为扩展数据存储器和I/O端口的读写选通信号。

2、 图中各芯片的功能

 74LS373:

地址锁存器,用来锁存P0口发送的地址低8位

2764:

容量为8KB的程序存储器(EPROM)用来存储程序

6264:

容量为8KB的数据存储器(RAM)用来存储数据

 8031:

不含程序存储器的8位单片机芯片,是不带I/O设备的微型计算机。

3、2764、6264的地址范围(P2.5取”0”)

2764:

8000H~9FFFH6264:

4000H~5FFFH

1.已知如图,8155的PA口用于输出,PB口用于输入,PC口用于输出,请:

(1)写出8155的各I/O口的口地址和存储器的地址范围。

2.已知如图并给出下列程序,请在读图并理解程序后回答下列问题:

(1)程序功能为_______。

(2)ADC0809的口地址为_______。

(3)EOC的作用是_______。

(4)程序运行结果存于_______。

ADC:

MOVDPTR,#7FFOH

MOVR0,#0A0H

MOVR2,#8

MOVA,#0

LOOP:

MOVX@DPTR,A

JBP3.3,$

MOVXA,@DPTR

MOVX@R0,A

1NCDPTR

1NCR0

DJNZR2,LOOP

AJMPADC

(1)巡回采集8个通道的数据

(2)ADC0809口地址为7FF0H~7FF7H(或7FF8~7FFFH)

(3)EOC为A/D转换结束信号,用来引起中断或查询,以便读取A/D的转换结果。

(4)结果存入外部RAM的A0H~A7H。

3、在两个8051间用模式2进行串行通信,A机并行采集外部开关的输入,然后串行传输给B机;B机接收后并行输出控制LED发光。

画出连接示意图,写出完整的程序。

(共15分)

A机程序ORG0000H

AJMPSTART

ORG4100H

START:

MOVP1,#0FFH

MOVSCON,#80H

AGAIN1:

MOVSBUF,P1

JNBTI,$

CLRTI

SJMPAGAIN1

END

B机程序ORG0000H

AJMPSTART

ORG4100H

START:

MOVSCON,#90H

AGAIN1:

JNBRI,$

MOVP1,SBUF

CLRRI

SJMPAGAIN1

END

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

当前位置:首页 > 初中教育

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

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