36 错误!使用“开始”选项卡将 标题 1,部分标题 1 应用于要在此处显示的文字。
74LS138 G1 G G2G2Y3 Y2 C Y1 B A Y0 G 74LS 8 373 OE Vcc P2.7 P2.6 P2.5 P2.4~P2.0 5 ALE 8031 8 5 5 5 8 8 A0~A7 CE CE A0~A7 CE A0~A7 A8~A12 A8~A12 A8~A12 6264(1) D0~D7 OE 6264(2) OE D0~D7 8 6264(3) OE D0~D7 8 P0 8 EA PSEN 8 地址空间如下: 第一片:
0000 0000 0000 0000~0001 1111 1111 1111;即0000H~1FFFH; 第二片:
0010 0000 0000 0000~0011 1111 1111 1111;即2000H~3FFFH; 第三片:
0100 0000 0000 0000~0101 1111 1111 1111;即3000H~5FFFH;
15. 试用一片74LS373扩展一个并行输入口,画出硬件连接图,指出相应的控制命令。 答:硬件电路图如下:74LS373的输入端为扩展的输入口,输出端接8051的数据总路线P0口,控制端接高电平,输出允许由片外数据存储器读信号RD和P2.0控制。当片外数据存储器读信号RD和P2.0同为低平时从74LS373中读入输入的数据。
8051 P0.0 P0.1 P0.2 P0.3 P0.4 P0.5 P0.6 P0.7 + RD P2.0 Q0 Q1 74LS Q2 Q3 373 Q4 Q5 Q6 Q7 OE D0 D1 D2 D3 D4 D5 D6 D7 G +5V
错误!使用“开始”选项卡将 标题 1,部分标题 1 应用于要在此处显示的文字。
输入数据的命令如下: MOV DPTR,#0FE00H MOVX A,@DPTR
37
16. 用8255A扩展并行I/O,实现把8个开关的状态通过8个二极管显示出来,画出硬件连接图,用汇编语言和C语言分别编写相应的程序。
答:硬件电路图如下:8051与8255的连接略,设8255的A,B,C和控制控口的地址为7F00H,7F01H,7F02H,7F03H。8255的A口接8个开关,B口接8个发光二极管。
+5V K0 PA0 PA1 PA2 PA3 PA4 系统总线 PA5 PA6 PA7 8255A PB0 PB1 PB2 PB3 PB4 PB5 PB6 PB7 8051 L0 K7 L7 +5V 程序如下: 汇编程序 ORG 0000H LJMP MAIN ORG 0100H
MAIN:MOV DPTR,#7F03H
MOV A,#90H MOVX @DPTR,A
LOOP:MOV DPTR,#7F00H
MOVX A,@DPTR MOV DPTR,#7F01H MOVX @DPTR,A SJMP LOOP
38
错误!使用“开始”选项卡将 标题 1,部分标题 1 应用于要在此处显示的文字。
SJMP $ END
C语言程序: #include
unsigned char i; XBYTE[0x7f03]=0x90; while(1) {
i=XBYTE[0x7f00]; XBYTE[0x7f01]=i; } } }
17. 用汇编语言编写出定时扫描方式下矩阵键盘的处理程序。
该程序放于定时器的中断服务程序中。定时器每10ms中断一次,执行一次中断服务程序。F1和F2标志位用片内RAM的50H和51H单元。 ACALL KS1 JNZ LK1 MOV 50H,#0 ;无键按下,F1的F0标志清0结束 MOV 51H,#0 SJMP OUT
LK1: CJNE 50H,#1,OUT1 ;有键按下检查F1标志是否为1,不为1置1结束。 CJNE 51H,#01,OUT ;再检查F2标志是否为1,为1说明已处理按键则结束。 LK2: MOV R2,#0FEH ;扫描查询键码 MOV R4,#00H LK4: MOV DPTR,#7F00H MOV A,R2 MOVX @DPTR,A INC DPTR INC DPTR
错误!使用“开始”选项卡将 标题 1,部分标题 1 应用于要在此处显示的文字。
MOVX A,@DPTR JB ACC.0,LONE MOV A,#00H AJMP LKP LONE: JB ACC.1,LTWO MOV A,#08H AJMP LKP LTWO:JB ACC.2,LTHR MOV A,#10H AJMP LKP LTHR: JB ACC.3,NEXT MOV A,#18H LKP: ADD A,R4 ;求键码放累加大器A, MOV 51H,#1 ;F2标志置1,结束 SJMP OUT
NEXT: INC R4 MOV A,R2 JNB ACC.7,KEND RL A MOV R2,A SJMP LK4
KEND:SJMP OUT ;扫描完结束 KS1: MOV DPTR,#7F00H ;检查有无按键 MOV A,#00H MOVX @DPTR,A INC DPTR INC DPTR MOVX A,@DPTR CPL A ANL A,#0FH RET OUT1:MOV 50H,#1 OUT:
18. 用C语言编写出定时扫描方式下矩阵键盘的处理程序。
39
F1和F2标志已在主函数前定义。
//************检测有无键按下函数************
uchar checkkey() //检测有无键按下函数,有返回0xff,无返回0 {uchar i;
XBYTE[0x7f00]=0x00; i=XBYTE[0x7f02]; i=i&0x0f;
if (i= =0x0f) return(0); else return(0xff); }
//************键盘扫描函数************
uchar keyscan()//键盘扫描函数,如果有键按下,则返回该键的编码,如果无键按下,则返回0xff {uchar scancode; //定义列扫描码变量 uchar codevalue; //定义返回的编码变量
40 错误!使用“开始”选项卡将 标题 1,部分标题 1 应用于要在此处显示的文字。
//定义行首编码变量 //定义行检测码
uchar m; uchar k; uchar i,j;
if (checkkey()= =0) return(0xff); else
{delay(200); if(checkkey()= =0) return(0xff); else {
scancode=0xfe;m=0x00; for (i=0;i<8;i++) {k=0x01;
XBYTE[0x7f00]=scancode; for (j=0;j<4;j++)
{if ((XBYTE[0x7f02]&k)= =0) {codevalue=m+j; while(checkkey()! =0); return(codevalue); m=m+8; }
else k=k<<1; }
scancode=scancode<<1; }
} } }
19. 试编制4?4的键盘扫描程序。
//检测有无键按下,无返回0xff //延时
//检测有无键按下,无返回0xff
//列扫描码,行首码赋初值
//送列扫描码
//检测当前行是否有键按下 //按下,求编码 //等待键位释放 //返回编码 //计算下一行的行首编码 //行检测码左移一位
//列扫描码左移一位,扫描下一列
20. 根据图7.12,编制一个在两个数码管上显示1和2的显示程序。 答:图见书图7.12 程序:
MOV P1,#11100001B ;在第一个数码管显示1 MOV P1,#11010010B ;在第二个数码管显示2
21. 根据图7.13,用汇编语言编制一个在8个数码管上轮流显示1~8的程序。 答:图见书图7.13
程序如下:显示子程序DISPLAY见书P183,在字段码表最后放不显示的编码00H,显示缓冲区
50H~57H;显示效果:在第一个数码管上显示1后,第一个数码管不显示,然后在第二个数码管上显示2,依此类推,直到在第八个上显示8。然后重复。