单片机原理接口与应用李群芳版复习题解答参考 下载本文

XRL A,#0CCH SJMP NEXT

③ 阶梯波

MOV DPTR, #0F7FFH

NEC: MOV A,#0

NEXT: MOVX @DPTR,A

ACALL D1MS ADD A,#33H

CJNE A,#0FFH, NEXTA

NEXTA:MOVX @DPTR,A

ACALL D5MS SJMP NEC

8.2 电路参考教材中图8.8,增加一个地址,使用两条输出指令才能输出一个数据,其他同上。 8.3 电路参考教材中图8.7,地址为7FFFH。

ORG 0000H

MOV DPTR,#7FFFH MOV R0,#20H MOV A, @R0

NEXT: MOV X @DPTR,A

ACALL D1MS INC R0

CJNE R0,#30H,NEXT SJMP $ END

8.4电路参阅教材中图8.11,不同的是将P2。5~P2。7改为P2。0~P2。2,各地址分别为FEFFH、FDFFH、FBFFH。

程序参照教材8.1.2.3节,注意修改RAM地址,循环执行该程序。

8.5电路参阅教材中图8.2,不同的是 延时方式:EOC悬空;查询方式:EOC经非门接单片机P1.0端口

线;中断方式同原图。

下面仅编查询程序。IN2的地址为7FFAH,由于EOC经非门接单片机P1.0端口线, 查询到P1.0为零,即转换结束。

ORG 0000H MOV R7,#0AH MOV R0,#50H

MOV DPTR,#7FFAH

NEXT: MOVX @DPTR,A ;启动转换

JB P1.0,$ ;查询等待 MOVX A,@DPTR ;读入数据 MOV @R0,A INC R0 DJNZ NEXT SJMP $

8.6 ADC0809采集入中模拟信号,顺序采集一次,将采集结果存放于数组ad中。ADC0809模拟通道0~7

的地址为7FF8H~7FFFH,ADC0809的转换结束端EOC经逻辑非后接至外部中断1,电路参考教材中图8.2。程序参考教材第167页的例子,只需修改数据存储区地址。

8.7 电路参考教材中图8.26,增加键盘的行线和数码管个数至8个,减少键盘列线到2根,程序略。

第9章、串行接口技术

9.1-9.3 请参考教材

9.4 电路参照教材中图9.12,另外一片24C04的A1接到VCC其它引脚与第一片完全一样。 9.5 略

9.6 可以,在操作IIC总线时,将SPI总线上的所有器件的从机选择线置高,这样便不会对SPI总

线有影响;在操作SPI总线时,让IIC总线的SDA保持高电平,这样IIC总线得不到起始信号,便不会对IIC总线有影响。

9.7 TLC5615经SPI总线接至单片机(参照教材中图9.26),REFIN作为衰减器的输入,OUT作为衰减

器的输出。根据Vo?2?VREFIN?CODECODECODE,其增益为:。 2??210210299.8 提示:用较快的速度对被测电压进行采样(采样时间间隔恒定为t),将一定时间段(T)内的

获得的采样值(v)的平方对时间积分(实为求和)后除以该时间段的长度,最后开平方,便是被测电压在该时间段内近似的有效值。

V有效值??vi?1k2ik

,其中k=T/t。

应用篇

第10章、单片机的C语言编程——C51

10.1 第6行,缺少“;”;第8行“;”多余;main函数最后缺少“}”。 10.2 xdata的地址范围为0x0000到0xFFFF(共64K),它需要两个字节记录(log265536?16)。 char bdata a;

float xdata b;

int xdata * c(注意不要定义为“xdata int * c”或“int * xdata c”,这样c为自身

在xdata区,指向默认区域的int型数据的指针,与题意不符);

10.4 main()

{ int xdata c; c=DBYTE[0x20]*DBYTE[0x35]; }

10.5 #include

#include sbit P1_0=P1^0; sbit P1_2=P1^2; sbit P1_3=P1^3;

unsigned char * pData=&DBYTE[0x30]; TLC() {

unsigned char k,i; unsigned char d=0; for(k=10;k>0;k--) { P1_3=0; for(i=8;i>0;i--) { d<<=1; 10.3

d|=P1_2; P1_0=1; P1_0=0; } *pData=d; pData++; } }

main() {

P1=0x04; P1_0=0; P1_3=1; TLC(); while(1);

} 10.6 略 10.7 略

10.8 #include

main() {

char i;

for(i=0x10;i<0x16;i++) DBYTE[i]=XBYTE[i]; }

10.9 #include main() { unsigned int * x,* y,* z; x=(unsigned int *)0x20; y=(unsigned int *)0x22; z=(unsigned int *)0x24; if(*x>*y) *z=*x; else *z=*y; while(1); }

10.10 #include

main() {

unsigned char *pBCD=(unsigned char *)0x21; unsigned long *pBinary=(unsigned long *)0x30; unsigned char *pLen=(unsigned char *)0x20; *pBinary=0; while(*pLen) { (*pLen)--; *pBinary*=10; *pBinary+=*(pBCD+*pLen);

} //程序认为BCD码是低位放在低地址的

}

10.11 #include

main() {

unsigned int *pBinary=(unsigned int *)0x30; unsigned char *pBCD=(unsigned char *)0x21; unsigned char *pLen=(unsigned char *)0x20; *pLen=0;

while(*pBinary) { *pBCD=*pBinary; (*pLen)++; pBCD++; *pBinary/=10;

} //程序将BCD码的低位放在低地址 }

第11章、RTX51实时操作系统 略

第12章、以MCU为核心的嵌入式系统的设计与调试

12.1 参见教材第12.2节

12.2 提示,.利用定时/计数器定时100ms,中断10次达1秒,满60秒,分加1秒清0;满60分,小时加1分

清0,同时分,秒均有十位数和个位数,按十进制进位,并送显示,显示可采用6个数码管(或八个数码管),校对可用按键中断方式或按键的查询进行加1校对,用并行口接驱动器(非门或三极管)驱动扬声器进行闹钟,如果采用89C51/S51做,由于片内己有程序存储器,四个口用户均可使用.

12.3 提示,两个定时器同时使用,一个定时器产生节拍,另一个定时器产生音符。 12.4-12.5 略

第13章、单片机实验指导