《单片微型计算机与接口技术》思考题与习题解答01 下载本文

0RG 0000H MOV A,#08H

M()V DPTR,#TAB MOVC A,@A+DPTR MOV P1,A

MOV R2,#08H AGAIN:M()V A,#01 NEXT:M()V P3,A ACALL DAY RL A

CJNE A,#10H,NEXT DJNZ R2,AGAIN TAB:DB 3FH,06H? END

C语言程序

#include

#definc uint unslgned int #deflne uchar unsigned char main(){ uchar code

tabl[]={0x3f,0s06?} uchar i,m; uint j;

for(m=O;m<8;i++){ P3=0x01:

for(i=0;i<4;i++){ P1=tabl[8] P3<<=1:

for(j=0;j<=25000;j++); }}}

21

5.9 利用89C51/89S51并行口设计8×8的矩阵键盘并用箭头标明信号的方向。

5.9 P1口的8根线接行线,输出行扫描信号,P3口的8根线接列线,输入回馈信号。见习题5.9图。

第6章 中断

6.1 8XXSl有几个中断源?各中断标志是如何产生的,又如何清除? 6.2 8XX51中断源的中断请求被响应时,各中断入口地址是多少?在什么物理存储空间? 6.3 MCS-51系列单片机的中断系统有几个优先级?如何设定? 6.4 简述8XX51中断处理的过程,画出流程图。 6.1~6.4 参见 6.1节~6.2节

6.5 用8XX51的P1口接8个LED发光二极管,由INT0接一消抖开关,开始P1.0的LED亮,以后每中断一次,下一个LED亮,顺序下移,且每次只一个LED亮,周而复始。画出电路图,并编制程序。

6.5 电路设计见习题6.5图 汇编语言程序 ORG 0000H AJMP MAlN 0RG 0003H

RL A ;中断服务 MOV P1.A RETI

MAIN:MOV A,#0FEH

MOV P1,A ;第一灯亮 SETB EA SETB EX0 SETB IT0 SJMP$ C语言程序

#include int0() interrpt 0{

22

P1=P1<<1|0x01; }

main(){ P1=0xfe; EA=1;EX0=1; IT0=1;

do{}whik(1);}

汇编语言中只有一个中断源,不存在占用别的中断源向量地址问题,程序顺序排下,应注意程序的执行过程。C语言无循环移位指令,移位后,后面补零,因此和01相或。

6.6 在题6.5电路的基础上,要求8个LED同时亮或同时灭,每中断一次,变反一次,编出程序。 6.6 略

6.7 要求同题6.6,要求亮、灭变换5次(一亮,一灭为一次),编出程序。 6.7 汇编语言程序 ORG O000H AJMP MAIN

ORG 0003H ;中断服务 XRL P1,#OFFH DJNZ R0,NE

CLR EA NE:RETI

ORG 0030H MAIN: SETB EA SETB EXO SETB ITO

MOV P1,#OFFH MOV R0,#OAH

SJMP$ ;等待中断 C语言程序

#include char i:

ic()itrrupt 0{ i++:

if(i<=10)P1=~P1:

23

eIse EA=O: }

main()

{EA=1;EX0=1;IT0=1; P1=0xff: for(;;);/*等待中断*/

}

因一亮一灭为一次,所以共10次。

6.8 利用8XX51的并行口接2个数码管,显示INT1中断次数(次数不超过FFH)。 6.8两个数码管阳极经驱动器接P1口,阴极分别接P3.0、P3.1。 #include void intr(void) void delay(void);

unsigned char a,b,i=0;

unsigned char code

tab[16]={0x3f,0x06,0x5b,Ox4f,0x66,0x7d,0x07, 0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x73}:

sbit p3_O=P3^0; sbit p3_1=P3^1; main(){ a=tab[O]; b=tab[0]; p3_0=O; p3_1=0; EA=1; EX0=1; IT0=1; for(;;){

p3_O=1; p3_1=0; P1=b: delay();

p3_0=O; p3_1=1; P1=a: delay(); }}

void intr()interrupt 0{ unsigned charj,k; EX0=O; i++;

j=i&0x0f; k=i&0xf0; k>>=4; a=tab[k];

24

b=tab[j]; EX0=1;}

void delay(void){ int x;

for(x=0;x<1000;x++); }

第7章 定时计数器

7.1 8XX51单片机内部设有几个定时/计数器?它们是南哪些专用寄存器组成的? 7.2 8XX51单片机的定时/计数器有哪几种工作方式?各有什么特点?

7.3 定时/计数器用做定时时,其定时时间与哪些因素有关?用做计数时,对外界计数频率有何限制? 7.1~7.3参7.1节

7.4 设单片机的fosc=6MHz,定时器处于不同工作方式时,最大定时范围分别是多少? 7.4 方式0:16.38ms,方式1:131ms,方式2:512us

7.5 利用8XX51的T0计数,每计10个脉冲,P1.0变反一次,用查询和中断两种方式编程。

7.5 使用方式2,计数初值c=100H—OAH=F6H 查询方式: 0RG 0000H MOV TMOD,#06H MOV THO,#0F6H MOV TL0,#0F6H SETB TR0

ABC:JNB TF0,$ CLR TF0 CPL P1.0 SJMP ABC 中断方式: ORG 0000H AJMP MAIN ORG OOOOBH CPL P1.0 RETI

MAIN:MOV TMOD,#06H MOV TH0,#OF6H SETB EA SETB ET0 SETB TR0

SJMP $ ;等待中断 C语言程序查询方式: #include sbit p10=P1^O; main(){

25