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语言编写出定时扫描方式下矩阵键盘的处理程序。
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; //定义返回的编码变量
uchar m; //定义行首编码变量
uchar k; //定义行检测码 uchar i,j;
if (checkkey()= =0) return(0xff); //检测有无键按下,无返回0xff else
{delay(200); //延时 if(checkkey()= =0) return(0xff); //检测有无键按下,无返回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. 20.
根据图7.12,编制一个在两个数码管上显示1和2的显示程序。 试编制4?4的键盘扫描程序。
答:图见书图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。然后重复。
MOV R1,#50H MOV R4,#08H
MOV A,#10H
LOOP:
MOV @R1,A ;初始化为全部不显示。 INC R1 DJNZ R4,LOOP
START: MOV R2,#01H MOV R4,#08H
MOV R1,#50H
LOOP2: MOV A,R2 MOV @R1,A MOV R5,#0FFH LOOP1: LCALL DISPLAY DJNZ R5,LOOP1 INC R1 INC R2 DJNZ R4,LOOP2 SJMP START END
第八章
1. 简述逐次逼近型A/D转换器的工作过程。
答:逐次逼近型A/D转换器由比较器、D/A转换器、寄存器及控制电路组成。与计数型相同,也要进行比较以得到转换的数字量,但逐次逼近型A/D转换器是用一个寄存器从高位到低位依次开始逐位试探比较的。转换过程如下:开始时寄存器各位清0,转换时,先将最高位置1,送D/A转换器转换,转换结果与输入的模拟量比较,如果转换的模拟量比输入的模拟量小,则1保留,如果转换的模拟量比输入的模拟量大,则1不保留,然后从第二位依次重复上述过程直至最低位,最后寄存器中的内容就是输入模拟量对应的数字量。一个n位的逐次逼近型A/D转换器转换只需要比较n次,转换时间只取决于位数和时钟周期。逐次逼近型A/D转换器转换速度快,在实际中被广泛使用。
2. 简述ADC0809的工作过程。 答:ADC0809的工作过程如下:
(1) 输入3位地址,并使ALE=1,将地址存入地址锁存器中,经地址译码器译码从8路模拟通道中选通一路模拟量送到比较器。
(2) 送START一高脉冲,START的上升沿使逐次逼近寄存器复位,下降沿启动A/D转换,并使EOC信号为低电平。
(3) 当转换结束时,转换的结果送入到输出三态锁存器中,并使EOC信号回到高电平,通知CPU已转换结束。
(4) 当CPU执行一读数据指令时,使OE为高电平,则从输出端D0~D1读出数据。
3. 设计8路模拟量输入的巡回检测系统,使用查询的方法采样数据,采样的数据存放在片内RAM的8个单元中,分别用汇编语言和C语言编程实现。
答:硬件线路如下:
P0.0 P0.1 P0.2 P0.3 P0.4 P0.5 P0.6 P0.7 ALE 8051 WR P2.7 RD P1.0 分 频 器 D0 D1 D2 D3 D4 D5 D6 D7 ADDA ADDB ADDC CLK ALE START OE EOC IN0 IN1 IN2 IN3 IN4 IN5 IN6 IN7 VREF+ VREF- ADC0809 +5V GND + + 只把EOC信号改成连接到单片机P1.0上,其余与中断方式相同。 汇编语言编程: ADC: LOOP:
#include
ORG 0100H MOV R0,#30H ;设立数据存储区指针 MOV R2,#08H ;设置8路采样计数值 MOV DPTR,#0000H ;送入口地址并指向IN0
MOVX @DPTR,A ;启动A/D转换,A的值无意义 JNB P1.0,$ MOVX A,@DPTR ;读取转换后的数字量 MOV @R0,A ;存入片内RAM单元 INC DPTR ;指向下一模拟通道
INC R0 ;指向下一个数据存储单元 DJNZ R2,LOOP ;8路未转换完,则继续 RET ;返回
C语言编程: