单片机复习02.docx

上传人:b****8 文档编号:11244447 上传时间:2023-02-26 格式:DOCX 页数:22 大小:642.04KB
下载 相关 举报
单片机复习02.docx_第1页
第1页 / 共22页
单片机复习02.docx_第2页
第2页 / 共22页
单片机复习02.docx_第3页
第3页 / 共22页
单片机复习02.docx_第4页
第4页 / 共22页
单片机复习02.docx_第5页
第5页 / 共22页
点击查看更多>>
下载资源
资源描述

单片机复习02.docx

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

单片机复习02.docx

单片机复习02

六、编程题(16)

1.如图所示,此中断电路可实现系统的故障显示。

当系统各部分正常工作时,四个故障源的输入均为低电平,显示灯全部不亮。

当有某个部分出现故障时,则相应的故障源输入线由低电平变为高电平,通过INT0向8031申请中断,要求单片机查询其中断,并点亮相应的发光二极管。

试将下面的程序补充完整。

(P1.0、P3.0为一组;P1.1、P3.1为一组;其余类推。

解:

程序:

ORG0000H

AJMPMAIN

ORG0003H;外部中断0中断矢量

AJMPSUBINT0;跳转到外部中断0的服务子程序

MAIN:

SETBEX0

SETBIT0

SETBEA

ANLP1,#0F0H;P1.0,P1.1,P1.2,P1.3为输入

HERE:

SJMPHERE

SUBINT0:

JNBP1.0,L1;查询中断源,(P1.0)=0,转L1

SETBP3.0;是P1.0引起的中断,使P3.0LED亮

L1:

JNBP1.1,L2;查询中断源,(P1.1)=0,转L2

SETBP3.1;是P1.1引起的中断,使P3.0LED亮

L2:

JNBP1.2,L3;查询中断源,(P1.2)=0,转L3

SETBP3.2;是P1.2引起的中断,使P3.0LED亮

L3:

JNBP1.3,L4;查询中断源,(P1.3)=0,转L4

SETBP3.3;是P1.3引起的中断,使P3.0LED亮

L4:

RETI;中断返回

END

2.设时钟频率为6MHz,要求利用定时器T0产生1S(秒)的定时程序。

已知T0工作在方式1时产生100mS(毫秒)的定时时间常数为:

TL0=0B0H,TH0=3CH。

试将下面的程序补充完整。

(提示:

T0一次定时中断产生100mS,中断10次则可产生1S定时。

解:

参考程序:

ORG0000H

AJMPMAIN

ORG000BH;T0的中断地址

LJMPT0SERV;T0的中断子程序实际跳转去处

ORG30H

MAIN:

MOVSP,#60H

MOVB,#10;循环次数10

MOVTMOD,#01H;设置T0工作于模式1

MOVTL0,#0B0H;装入计数值低8位

MOVTH0,#3CH;装入计数值高8位

SETBTR0;启动T0计数

SETBET0;允许T0中断

SETBEA;允许CPU中断

SJMP$;等待CPU中断

T0SERV:

MOVTL0,#0B0H;重新赋计数值

MOVTH0,#3CH

DJNZB,LOOP;检查循环次数

CLRTR0;1S定时时间到,停止T0计数

LOOP:

RETI

END

3.设时钟频率为12MHz,要求利用定时器T1产生0.6S(秒)的定时程序。

已知T1工作在方式1时产生50mS(毫秒)的定时时间常数为:

TL0=0B0H,TH0=3CH。

试将下面的程序补充完整。

(提示:

T1一次定时中断产生50mS,中断12次则可产生0.6S定时。

解:

程序:

ORG0000H

AJMPMAIN

ORG001BH;T1的中断地址

LJMPT1SERV;T1的中断子程序实际跳转去处

ORG30H

MAIN:

MOVSP,#60H

MOVB,#12;循环次数12

MOVTMOD,#10H;设置T1工作于模式1

MOVTL1,#0B0H;装入计数值低8位

MOVTH1,#3CH;装入计数值高8位

SETBTR1;启动T1计数

SETBET1;允许T1中断

SETBEA;开CPU中断

SJMP$;等待中断

T1SERV:

MOVTL1,#0B0H;重新赋计数值

MOVTH1,#3CH

DJNZB,LOOP;检查循环次数

CLRTR1;0.6S定时时间到,停止T1计数

LOOP:

RETI

END

4.如图ADC0809与8031的接口。

要求用中断方式将8路模拟量的采样数据读入,并依次序存入外部扩展存储器(图中未画出)的10H~17H地址单元中。

试将下面的程序补充完整。

解:

根据电路ADC0809的8个通道地址分别为7FF8H~7FFFH。

每一个通道转换结束后,由EOC信号引起INT1中断,并在中断服务程序中读取转换值。

程序:

ORG0000H

AJMPMAIN

ORG0013H

AJMPINT1int

ORG0030H

MAIN:

MOVR0,#10H(1分);数据暂存区首地址

MOVR2,#08H(1分);8路计数初值

SETBIT1;INT1为脉冲触发方式

SETBEA;开系统中断

SETBEX1;开INT1中断

MOVDPTR,#7FF8H;指向ADC0809通道0地址

MOVX@DPTR,A;产生ALE.START信号,启动A/D转换

HERE:

AJMPHERE;等待中断

INT1int:

MOVXA,@DPTR;产生OE信号,读取转换值

MOVX@R0,A;存数

INCDPTR;指向下一个通道

INCR0;指向下一个暂存单元

DJNZR2,DONE;8路未转换完毕

RETI;转换完出口

DONE:

MOVX@DPTR,A;未转换完出口,产生ALE.START

;信号,启动A/D转换

RETI

5.如图所示,此中断电路可实现系统的故障显示。

当系统各部分正常工作时,四个故障源的输入均为低电平,显示灯全部不亮。

当有某个部分出现故障时,则相应的输入线由低电平变为高电平,通过INT0向8031申请中断,要求单片机处理其中断,并点亮相应的发光二极管。

试将下面的程序补充完整。

(P1.0、P1.4为一组;P1.2、P1.5为一组;其余类推。

程序:

ORG0000H

AJMPMAIN

ORG0003H;外部中断0中断矢量

AJMPSUBINT0;跳转到外部中断0的服务子程序

MAIN:

ANLSETBEX0

SETBIT0

SETBEA

ANLP1,#0F0H;P1.0,P1.1,P1.2,P1.3为输入

;P1.4,P1.5,P1.6,P1.7输出为0

HERE:

SJMPHERE

SUBINT0:

JNBP1.0,L1;查询中断源,(P1.0)=0,转L1

SETBP1.4;是P1.0引起的中断,使P1.4LED亮

L1:

JNBP1.1,L2;查询中断源,(P1.1)=0,转L2

SETBP1.5;是P1.1引起的中断,使P1.5LED亮

L2:

JNBP1.2,L3;查询中断源,(P1.2)=0,转L3

SETBP1.6;是P1.2引起的中断,使P1.6LED亮

L3:

JNBP1.3,L4;查询中断源,(P1.3)=0,转L4

SETBP1.7;是P1.3引起的中断,使P1.7LED亮

L4:

RETI;中断返回

END

6.如图为ADC0809与8031的接口。

要求采用查询方式对ADC0809的第一路(IN0)模拟信号每隔20mS采样一次,共采样100次,并将100个采样数据存入外部扩展RAM1000H开始的存储单元。

试将下面的程序补充完整。

解:

根据电路ADC0809的通道0地址为7FF8H。

每一次转换结束后,转换结束的EOC信号提供给P1.0脚,程序检测P1.0的状态即可得知转换是否结束,然后读取转换值。

程序:

ORG0030H

MAIN:

MOVSP,#60H

MOVR6,#10H;外部存储器数据区地址

MOVR7,#00H

MOVR2,#100;采样数据计数初值

MOVDPTR,#7FF8H;指向ADC0809通道0地址

CONV:

MOVX@DPTR,A;启动A/D转换,通道0

LOOP:

MOVA,P1;采集转换器状态P1.0

ANLA,01H;屏蔽无用位

CJNEA,#01,LOOP;等待转换结束

INT1int:

MOVXA,@DPTR;产生OE信号,读取转换值

PUSHDPL;保存DPTR中的ADC地址

PUSHDPH

MOVDPH,R6;采集数据存储地址

MOVDPL,R7

MOVX@DPTR,A;存数

INCDPTR;指向下一个RAM存储单元

MOVR6,DPH;RAM地址存储到R6R7

MOVR7,DPL

POPDPH;恢复ADC地址

POPDPL

LCALLD20mS;调用延时20mS子程序

DJNZR2,CONV;8路未转换完,继续

SJMP$

D20mS:

…..(略)

RET

END

7.如图所示,此中断电路可实现系统的故障显示。

当系统各部分正常工作时,四个故障源的输入均为低电平,显示灯全部不亮。

当有某个部分出现故障时,则相应的输入线由低电平变为高电平,通过INT0向8031申请中断,要求单片机处理其中断,并点亮相应的发光二极管。

试将下面的程序补充完整。

(P1.0、P1.1为一组;P1.2、P1.3为一组;其余类推。

解:

参考程序:

ORG0000H

AJMPMAIN

ORG0003H;外部中断0中断矢量

AJMPSUBINT0;跳转到外部中断0的服务子程序

MAIN:

ANLP1,#55H

SETBIT0

SETBEA

SETBEX0

HERE:

SJMPHERE

SUBINT0:

JNBP1.0,L1;查询中断源,(P1.0)=0,转L1

SETBP1.1;是P1.0引起的中断,使P1.1灯亮

L1:

JNBP1.2,L2;查询中断源,(P1.2)=0,转L2

SETBP1.3;是P1.2引起的中断,使P1.3灯亮

L2:

JNBP1.4,L3;查询中断源,(P1.4)=0,转L3

SETBP1.5;是P1.4引起的中断,使P1.5灯亮

L3:

JNBP1.6,L4;查询中断源,(P1.6)=0,转L4

SETBP1.7;是P1.6引起的中断,使P1.7灯亮

L4:

RETI;中断返回

END

8.如图ADC0809与8031的接口。

要求用查询方式将8路模拟量的采样数据读入,并依次序存入外部扩展存储器80H~87H地址单元中。

试将下面的程序补充完整。

解:

根据电路ADC0809的8个通道地址分别为7FF8H~7FFFH。

每一个通道转换结束后,由EOC信号提供给P1.0脚,程序检测P1.0的状态即可得知转换是否结束,然后读取转换值。

程序:

ORG0030H

MAIN:

MOVR0,#80H;数据暂存区首地址

MOVR2,#08H;8路计数初值

MOVDPTR,#7FF8H;指向ADC0809通道0地址

CONV:

MOVX@DPTR,A;产生ALE.START信号,启动A/D

;转换

LOOP:

MOVA,P1;采集转换器状态P1.0

ANLA,0FEH;屏蔽无用位

CJNEA,#01,LOOP;等待转换结束

INT1int:

MOVXA,@DPTR;产生OE信号,读取转换值

MOVX@R0,A;存数

INCDPTR;指向下一个通道

INCR0;指向下一个暂存单元

DJNZR2,CONV;8路未转换完毕

RET;转换完毕退出

9.采用中断方式利用T1的工作模式1产生10mS(毫秒)的定时,然后在P1.2引脚上输出频率为50Hz的方波。

请将下面的程序补充完整。

(下面的画线处仅表示该处可能需要补充指令,并不表示指令数目的多少,请根据自己的思路编写程序。

已知:

T1工作在模式1产生10mS定时的时间常数为TH1=0D8H,TL1=0F0H。

解:

要在P1.2引脚输出50Hz的方波。

半个周期使P1.2取反一次即可。

程序:

ORG0000H

LJMPMAIN

ORG001BH;T1中断入口

LJMPSUBT1;转向T1中断服务程序

ORG0030H

MAIN:

MOVSP,#60H

MOVTMOD,#10H;设置T1为模式1

MOVTL1,#0F0H;设置初始值

MOVTH1,#0D8H

SETBEA;CPU开中断

SETBET1;允许T1溢出中断

SETBTR1;启动T1

HERE:

SJMPHERE;等待T1中断

SUBT1:

MOVTL1,#0F0H;重装载技术时间常数

MOVTH1,#0D8H

CPLP1.2;在P1.2产生方波

RETI

END

 

10.如图所示,系统中采用8155扩展6位共阴LED,显示缓冲区在内部RAM中7AH开始的连续六个单元。

要求将显示缓冲区的6个字节的数据依次送出显示一遍,试将下面的显示子程序补充完整。

提示:

8155的A口、B口、C口、命令寄存器的地址分别为:

7F01H、7F02H、7F03H、7F00H。

显示缓冲区首地址7AH对应最左一位显示器,其余类推。

解:

提示:

8155的A口.B口.C口.命令寄存器的地址分别为:

7F01H.7F02H.7F03H.7F00H。

显示缓冲区首地址7AH对应最左一位显示器,其余类推。

程序

DIS:

MOVR0,#7FH;显示缓冲区末地址,对应最右边一位显示器

MOVR2,#01H;显示器位控的数据送R2

MOVA,R2

LP0:

MOVDPTR,#7F01H;8155A口地址送DPTR

MOVX@DPTR,A;显示器位控的数据输出

;提示:

下面的指令应为段码显示输出指令

INCDPTR;数据指针指8155PB口

MOVA,@R0;取显示数据

ADDA,#0DH;加入偏移量

MOVCA,@A+PC;取字型码

MOVX@DPTR,A;送出显示

ACALLD1MS;每显示一位,延时1MS,

;提示:

下面的指令应为位控判断与调整指令

DECR0;数据缓冲区地址减

MOVA,R2

JBACC.5,LP1;扫到最左面位?

RLA;未到,左移一位

MOVA,R2

AJMPLP0;6位没有显示完,跳转LP0以显示下一位。

LP1:

RET

LEDDAT:

DB3FH,05H,5BH,4FH,66H,6DH

DB7DH,07H,7FH,6FH,77H,7CH

DB39H,5EH,79H,71H,40H,00H

DIMS:

MOVR7,#02H;延时1MS子程序

DL:

MOVR6,#0FFH

DL1:

DJNZR6,DL1

DJNZR7,DL

RET

END

11.如图为DAC0832与8031的接口。

要求通过DAC0832产生锯齿波,请编写相应的子程序(锯齿波频率不限)。

提示:

D2MS为延迟子程序,可以调用,也可以另行编写。

解:

DAC0832在系统中的地址为7FFFH

源程序:

START:

MOVDPTR,#7FFFH;DAC0832地址

MOVA,#00H;锯齿波最低点

LOOP:

MOVX@DPTR,A

INCA;增加输出电压

ACALLD2MS;延时,改变输出信号频率

AJMPLOOP;循环

D2MS:

MOVR7,#04H;延时2MS字程序

DL:

MOVR6,#0FFH

DL1:

DJNZR6,DL1

DJNZR7,DL

RET

END

12.如图所示,系统中采用8155扩展6位共阴LED,显示缓冲区在内部RAM中60H开始的连续六个单元。

要求将显示缓冲区的6个字节的数据依次送出显示,试将下面的显示子程序补充完整。

提示:

8155的A口、B口、C口、命令寄存器的地址分别为:

7F01H、7F02H、7F03H、7F00H。

显示缓冲区首地址7AH对应最左一位显示器,其余类推。

解:

程序:

DIS:

MOVR0,#65H;显示缓冲区末地址

MOVR2,#01H;显示位寄存器

MOVA,R2

LP0:

MOVDPTR,#7F03H;8155PC口地址

MOVX@DPTR,A;C口输出

DECDPTR;数据指针指8155PA口

DECDPTR

MOVA,@R0;取显示数据

ADDA,#0DH;加入偏移量

MOVCA,@A+PC;取字形码

MOVX@DPTR,A;向PA口输出段显示数据(字型码)

ACALLD1MS;延时1MS

INCR0;数据缓冲区,指向下一位显示数据

MOVA,R2

JBACC.5,LP1;扫到最右面位?

RLA;未到,左移一位

MOVR2,A

AJMPLP0

LP1:

RET

LEDDAT:

DB3FH,05H,5BH,4FH,66H,6DH

DB7DH,07H,7FH,6FH,77H,7CH

DIMS:

MOVR7,#02H;延时1MS字程序

DL:

MOVR6,#0FFH

DL1:

DJNZR6,DL1

DJNZR7,DL

RET

END

13.如图为DAC0832与8031的接口。

要求通过DAC0832产生三角波,请编写相应的程序(三角波频率不限)。

解:

ORG0000H

LJMPMAIN

……

ORG0100H

MAIN:

MOVSP,#50H

MOVDPTR,#7FFFH;DAC0832地址

MOVA,#00H;最低点

UP:

MOVX@DPTR,A(3分)

INCA;增加输出电压

CJNEA,#0,UP(2分)

DOWN:

MOVA,#0FEH;

DOWN1:

MOVX@DPTR,A(2分)

DECA;降低输出电压

CJNEA,#0,DOWN1(2分)

MOVA,#01

AJMPUP(1分)

END

14.采用中断方式利用T0的工作模式0产生1mS(毫秒)的定时,然后在P1.0引脚上输出周期为2mS的方波。

请将下面的程序补充完整。

(下面的画线处仅表示该处可能需要补充指令,并不表示指令数目的多少,请根据自己的思路编写程序。

已知:

T0工作在模式0产生1mS定时的时间常数为TH0=0E0H,TL0=18H。

解:

要在P1.0引脚输出周期为2mS的方波,只要使P1.0每隔1mS取反一次即可。

程序:

ORG0000H

LJMPMAIN

ORG000BH;T0中断入口

LJMPSUBT0;转向T0中断服务程序

ORG0030H

MAIN:

MOVSP,#60H

MAIN:

MOVTMOD,#00H;设置T0为模式0

MOVTL0,#18H;设置初始值

MOVTH0,#0E0H

SETBEA;CPU开中断

SETBET0;允许T0溢出中断

SETBTR0;启动T0

HERE:

SJMPHERE;主程序省略,等待T0中断

SUBT0:

MOVTL0,#018H;重装载技术时间常数

MOVTH0,#0E0H

CPLP1.0;在P1.0产生方波

RETI

END

15.采用查询方式利用T0的工作模式0产生1mS(毫秒)的定时,然后在P1.0引脚上输出周期为2mS的方波。

请将下面的程序补充完整。

已知:

T0工作在模式0产生1mS定时的时间常数为TH0=0E0H,TL0=18H。

解:

要在P1.0引脚输出周期为2mS的方波,只要使P1.0每隔1mS取反一次即可。

程序:

ORG0000H

LJMPMAIN

……

ORG0030H

MAIN:

MOVSP,#60H

MOVTMOD,#00H;设置T0为模式0

MOVTL0,#18H;设置初始值

MOVTH0,#0E0H

SETBTR0;启动T0

LOOP:

JBCTF0,NEXT;查询并清除TF0,定时时间到否?

SJMPLOOP

NEXT:

MOVTL0,#18H;重装计数初值

MOVTH0,#0E0H

CPLP1.0;P1.0引脚取反

SJMPLOOP;重复产生方波

END

16.如图所示,系统中通过P0和P2口扩展6位共阴LED,显示缓冲区在内部RAM中79H开始的连续六个单元。

要求将6个显示缓冲字节单元的内容依次送显示六位显示器显示,显示缓冲区首地址79H对应LED显示器的最左边一位。

请将下面的子程序补充完整。

解:

显示子程序:

DIS:

MOVDPTR,#DISTAB;DPTR作显示字形码表指针

MOVR0,#7EH;显示缓冲区末地址

MOVR2,#01H;显示位寄存器

MOVA,R2

LP0:

NOP

MOVP2,A;P2为LED显示位选择口

MOVA,@R0;取显示数据

MOVXA,@A+DPTR;取字型码

MOVP0,A;送出显示

ACALLD1MS;每显示一位延时1MS,

DECR0;数据缓冲区地址减

MOVA,R2

JBACC.5,LP1;扫到最左面位?

RLA;未到,左移一位

MOVR2,A;保存显示位置

AJMPLP0

LP1:

RET

DISTAB:

DB3FH,05H,5BH,4FH,66H,6DH

DB7DH,07H,7FH,6FH,77H,7CH

DB39H,5EH,79H,71H,40H,00H

DIMS:

MOVR7,#02H;延时1MS字程序

DL:

MOVR6,#0FFH

DL1:

DJNZR6,DL1

DJNZR7,DL

RET

END

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

当前位置:首页 > 成人教育 > 远程网络教育

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

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