单片机练习题参考答案
一、填空题
1.CPU、存储器、I/O口。
2.MOV 、 MOVX 、 MOVC
3.64K 、 64K
4.全“ 1 ”
5.上拉电阻
6.外部中断 0 、外部中断 1 、定时器 0 溢出中断、定时器 1 溢出中断、串
行口中断
7.RETI 、 RET
8.模式设定,定时
9.( A ) =76H , CY=0 , AC=0 , OV=1 , P=1
10.软件消抖动、硬件消抖动
11.独立式、行列式
12.共阴、共阳、静态显示、动态显示
13.00H~07H 、 08H~0FH 、 10H~17H 、 18H~1FH 、 0 、 1
14.低 8 位地址 / 数据复用总线、高 8 位地址总线
15.外部中断 0 、外部中断 1 、定时器 0 溢出中断、定时器 1 溢出中断、串
行口中断、 IE 、低
16.13、–128~+127B 、 2KB 、 64KB
17.复位控制、地址锁存控制、片外取指控制、片外程序存储器选择控制
18.FOSC/12,SCON,TB8
19.00~7FH,20~2FH,00~7FH,64KB
20.49,58H
21.3,256
22.00,07H,高(或“1”)
23.0
24.PSEN
25.ALE,P0口
26.2FFF
27.12,2μs
28.28H;88H。
29.50H;88H。
30.04H;00H;0。
31.PC;PC。
32.A,PC,DPTR。、
33.操作码,操作数,操作码。
34.1031H。
35.程序,数据。
36.地址。
37.00H, 0AAH。
38. (DPH)=3CH,(DPL)=5FH,(SP)=50H。
39.(SP)=62H,(61H)=30H,(62H)=70H。
40.0013H;001BH。
41.外部中断1;定时器T1。
42.PC、PC、程序存储器。
43.1。
44.相等。
45.片选。
46.16KB
47.程序,数据。
48.2KB,14。
49.0FFFH。
50.同步。
二、选择题
1. ③
2. ②
3. ①
4. ③
5. ③
6. ②
7. ②
8. ①
9. ②10. ②11. ① 12. ④ 13. ③14. ①15. ①16.②17. ②18. ③19. ③ 20. ③21. ① 22. ① 23. ②24. ②25. ②26.②27. ③28. ②29. ③30. ②31. ④ 32. ② 33. ①34. ④35.①36. ③37. ②38. ④39. ④40. ①41. ②42. ③43. ③44. ④45. ③
三
1.答:(A)=50H,(SP)=50H,(51H)=30H,(52H)=50H,(PC)=5030H。
2.答:(A)=0CBH。
3.答:A=80H,SP=40H,(51H)=50H,(52H)=80H ,PC=8050H。
4.答:(A )=ACH ,(SP )=60H
5.答:(32H )=24H ,(33H )=01H
程序功能是将30H 和31H 两单元的无符号数相加,结果存于32H 单元,进位存于33H 单元。
6.答:(A)=0CBH,(R0)=17H,(17H)=37H
7.答:(A)=1AH,(10H)=5FH,(2EH)=3DH,(40H)=2EH,(60H)=3DH。
8.答:3.(CY)=1,(AC)=1,(P)=0,(ACC)=00H,(R7)=0FFH。
四、设计编程题
1.试编写一个程序,将内部RAM中45H单元的高4位清“0”,低4位置“1”。答:参考程序如下:
MOV A,45H
ANL A,#0FH
ORL A,#0FH
MOV 45H,A
2.试编写程序,查找在内部RAM的30H~50H单元中是否有0AAH这一数据。若有,则将51H单元置为“01H”;若未找到,则将51H单元置为“00H”。
答:参考程序如下:
START: MOV R0,#30H
MOV R2,#20H
LOOP: MOV A,@R0
CJNE A,#0AAH,NEXT
MOV 51H,#01H
LJMP EXIT
NEXT: INC R0
DJNZ R2,LOOP
MOV 51H,#00H
EXIT: RET
3.试编写程序,查找在内部RAM的20H~40H单元中出现“00H”这一数据的次数,并将查找到的结果存入41H单元。
答:参考程序如下:
START: MOV 41H,#0
MOV R0,#20H
MOV R2,#20H
LOOP: MOV A,@R0
JNZ NEXT
INC 41H
NEXT: INC R0
DJNZ R2,LOOP
RET
4.在内部RAM的21H单元开始存有一组单字节无符号数,数据长度为20H,编写程序,要求找出最大数存入MAX单元。
5.某系统有3个外部中断源1、2、3,当某一中断源发出的中断请求使INT1引脚变为低电平时(见图5-10),便要求CPU进行处理,它们的优先处理次序由高到低为3、2、1,中断处理程序的入口地址分别为1000H、1100H、1200H。试编写主程序及中断服务子程序(转至相应的中断处理程序的入口即可)。
答:参见电路如图5-10所示,参考程序如下:
ORG 0000H
LJMP MAIN
ORG 0013H
LJMP INT_EX1
ORG 0030H
MAIN: CLR IT0 ;采用电平触发,低电平有效中断
SETB EX1 ;允许外部中断1
SETB EA
WAIT: LJMP WAIT ;用原地跳转代替一段用户程序
;以下为外部中断1服务子程序
INT_EX1: JNB P1.2,NEXT1 ;P1.2=0,不是3号中断,跳转NEXT1
LJMP INT_IR3 ;是3号中断,跳转到对应的中断处理程序NEXT1: JNB P1.1,NEXT2 ;P1.1=0,不是2号中断,跳转NEXT2
LJMP INT_IR2 ;跳转到2号中断处理程序
NEXT2: LJMP INT_IR1 ;跳转到1号中断处理程序
ORG 1000H
INT_IR3: 插入相应中断处理程序
RETI ;中断返回
ORG 1100H
INT_IR2: 插入相应中断处理程序
RETI ;中断返回
ORG 1200H
INT_IR1: 插入相应中断处理程序
RETI ;中断返回
6.编写一段程序,功能要求:当P1.0引脚的电平正跳变时,对P1.1的输入脉冲进行计数;当P1.2引脚的电平负跳变时,停止计数,并将计数值写入R0、R1(高位存R1,低位存R0)。
答:将P1.1的输入脉冲接入INT0,即使用T0计数器完成对P1.1口的脉冲计数。参考程序如下:
ORG 0000H
LJMP MAIN
ORG 000BH
LJMP IT0P
MAIN: JNB P1.0,MAIN
MOV TMOD,#05H ;定时器/计数器T0为计数方式1
SETB TR0 ;启动T0,开始计数
SETB ET0 ;允许T0中断
SETB EA ;CPU开中断
WAIT: JB P1.2,WAIT
CLR EA
CLR TR0
MOV R1,TH0
MOV R0,TL0
AJMP $
IT0P: INC R2
RETI
7.试编写一个程序(如将05H和06H拼为56H),设原始数据放在片外数据区2001H单元和2002H单元中,按顺序拼装后的单字节数放入2002H。
答:本题主要考察对外部存储器的读、写操作的编程,只要正确使用MOVX指令就可以了。编程思路:首先读取2001H的值,保存在寄存器A中,将寄存器A的高4位和低4位互换,再屏蔽掉低4位然后将寄存器A的值保存到30H中,然后再读取2002H的值,保存在寄存器A中,屏蔽掉高4位,然后将寄存器A 的值与30H进行“或运算”,将运算后的结果保存在2002H中。
ORG 0000H
MAIN: MOV DPTR,#2001H ;设置数据指针的初值
MOVX A,@DPTR ;读取2001H的值
SWAP A
ANL A,#0F0H ;屏蔽掉低4位
MOV 30H,A ;保存A
INC DPTR ;指针指向下一个片外RAM单元
MOVX A,@DPTR ;读取2002H的值
ANL A,#0FH ;屏蔽掉高4位
ORL A,30H ;进行拼装
MOVX @DPTR,A ;保存到2002H片外RAM单元
END
8.编写程序,将外部数据存储器中的4000H~40FFH单元全部清“0”。
答:本题主要考察对外部数据块的写操作;编程时只要注意循环次数和MOVX 指令的使用就可以了。
ORG 0000H
MAIN: MOV A,#0 ;0给A
MOV 0,#0FFH ;设置循环次数
MOV DPTR,#4000H ;设置数据指针的初值
LOOP: MOVX @DPTR,A ;当前单元清“0”
INC DPTR ;指向下一个单元
DJNZ R0,LOOP ;是否结束
END
9.现有AT89C51单片机、74LS373锁存器、1片2764 EPROM和两片6264 RAM,请用它们组成一个单片机应用系统,要求如下:
(1)画出硬件电路连线图,并标注主要引脚;
(2)指出该应用系统程序存储器空间和数据存储器空间各自的地址范围。
10.假设81C55的TIMERIN引脚输入的脉冲频率为1MHz,请编写在81C55的TIMEROUT引脚上输出周期为10ms的方波的程序(假设I/O口地址为7F00H~7F05H)。
答:将1MHz的脉冲改变为10ms的方波,实际上就是分频。分频前后频率之比为100∶1,这样只要将定时器初值设置为64H就可以了(假设I/O口地址为7F00H~7F05H)。
START: MOV DPTR,#7F04H ;指针指向计数器低8位
MOV A,#64H ;送初值给A
MOVX @DPTR,A ;初值送给计数器低8位
INC DPTR ;指向计数器高8位
MOV A,#40H ;计数器方波输出
MOVX @DPTR,A
MOV DPTR,#7F00H ;指向命令/状态口
MOV A,#0C2H ;设定控制字
MOVX @DPTR,A ;启动计数器
END
11.对于图10-10所示的键盘,采用线反转法原理编写出识别某一按键被按下并得到其键号的程序。
答:先对P1口高4位送低电平,读取P1口低4位的值;再对P1口低4位送低电平,读取P1口高4位的值,将两次读到的值组合在一起就得到了按键的特征码,再根据特征码查找键值。参考程序如下:
KEYIN: MOV P1,#0FH ;反转读键
MOV A,P1
ANL A,#0FH
MOV B,A
MOV P1,#0F0H
MOV A,P1
ANL A,#0F0H
ORL A,B
CJNE A,#0FFH,KEYIN1
RET ;未按键
KEYIN1: MOV B,A ;暂存特征码
MOV DPTR,#KEYCOD ;指向特征码表
MOV R3,#0FFH ;顺序码初始化
KEYIN2: INC R3
MOV A,R3
MOVC A,@A+DPTR
CJNE A,B,KEYIN3
MOV A,R3 ;找到,取顺序码
RET
KEYIN3: CJNE A,#0FFH,KEYIN2 ;未完,再查
RET ;已查完,未找到,以未按键处理 KEYCOD: DB 0E7H,0EBH,0EDH,0EEH ;特征码表
DB 0D7H,0DBH,0DDH,0DEH
DB 0B7H,0BBH,0BDH,0BEH
DB 77H,7BH,7DH,7EH
12.在一个由AT89C51单片机与一片ADC0809组成的数据采集系统中,ADC0809的8个输入通道的地址为7FF8H~7FFFH,试画出有关接口的电路图,并编写每隔1分钟轮流采集一次8个通道数据的程序,共采样50次,其采样值存入片外RAM中以2000H单元开始的存储区中。
答:接口电路可参见图11-17。参考程序如下:
MAIN: MOV R0,#20H
MOV R1,#00H
MOV R2,#00H
MOV R3,#50
MOV R8,#08H
LOOP: MOV DPTR,#7FF8H
LOOP1: MOVX @DPTR,A
MOV R6,#0AH
DELAY: NOP
NOP
NOP
DJNZ R6,DELAY
MOVX A,@DPTR
INC DPTR
MOV R2,DPL
MOV DPH,R0
MOV DPL,R1
MOVX @DPTR,A
INC DPTR
MOV R0,DPH
MOV R1,DPL
MOV DPH,#7FH
MOV DPL,R2
DJNZ R7,LOOP1
LCALL DELAY1M ;延时1分钟
DJNZ R3,LOOP
…………………
13.如图所示的电路,要求开机时灯灭,按一下按钮,灯D1亮,延时10秒后自动熄灭,若在灯亮期间再按一下按钮,则灯立即熄灭。试编写实现上述功能的完整程序。
参考程序如下:
LED BIT P1.0
KEY BIT P3.2
ORG 0
LJMP MAIN
ORG 000BH
LJMP INTT0
ORG 0100H
MAIN:
SETB LED
MOV R2,#200
MOV TMOD,#01
MOV TH0,#50H
MOV TL0,#50H
LOOP: JB KEY,LOOP
CLR LED
SETB TR0
SETB EA
SETB ET0
JNB KEY,$
NOP
JB KEY,$
CLR LED
CLR TR0
CLR EA
JNB KEY,$
LJMP LOOP
INTT0: MOV TH0,#50H
MOV TL0,#50H
DJNZ R2 ,STOP
CLR LED
CLR TR0
CLR EA
CLR ET0
MOV R2,#200
STOP: RETI
END
14.如图所示电路,要求完成实现按钮按压次数的计数及显示,按一次按钮,计数值加1(要求按十进制累加),计数及显示范围是:0~99,超过99则自动归零。请设计实现该功能的完整程序。要求对按钮的检测用中断实现,数码显示用动态扫描(数码管为共阴数码管)。