内容发布更新时间 : 2024/11/17 0:34:41星期一 下面是文章的全部内容请认真阅读。
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); 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。然后重复。
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) (2) (3) (4) 3.
输入3位地址,并使ALE=1,将地址存入地址锁存器中,经地址译码器译码从8路模拟通道中选通一路模拟量送到比较器。 送START一高脉冲,START的上升沿使逐次逼近寄存器复位,下降沿启动A/D转换,并使EOC信号为低电平。 当转换结束时,转换的结果送入到输出三态锁存器中,并使EOC信号回到高电平,通知CPU已转换结束。 当CPU执行一读数据指令时,使OE为高电平,则从输出端D0~D1读出数据。
设计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: ORG 0100H
;设立数据存储区指针 ;设置8路采样计数值 ;送入口地址并指向IN0
MOV R0,#30H MOV R2,#08H MOV DPTR,#0000H
MOVX @DPTR,A JNB P1.0,$
MOVX A,@DPTR MOV @R0,A INC DPTR INC R0 DJNZ R2,LOOP RET
LOOP:
;启动A/D转换,A的值无意义
;读取转换后的数字量
;存入片内RAM单元
;指向下一模拟通道 ;指向下一个数据存储单元
;8路未转换完,则继续
;返回
C语言编程:
#include
//定义IN0为通道0的地址 //定义8个单元的数组,存放结果
//定义绝对地址访问
sbit P10=P1^0;
uchar xdata *ad_adr; uchar i=0; void adc(void) { i=0;
ad_adr=&IN0; for (i=0;i<8;i++) {
*ad_adr=i;
while(!P10);
//启动当前通道转换 //等待转换
//指针指向通道0
//定义指向通道的指针
x[i]=*ad_adr; ad_adr++;
//接收当前通道转换结果 //指向下一个通道
} } 4.
DAC0832有几种工作方式?这几种方式是如何实现的?
答:DAC0832具有直通方式、单缓冲方式和双缓冲方式3种工作方式。这三种方式是通过改变控制引脚ILE、、、和的连接
方法,控制DAC0832的8位DAC寄存器和8位D/A转换寄存器的通行来实现。如果这两个寄存器直接导通则为直通方式,如果一个直接导通一个选通或两个连在一起选通则为单缓冲方式,如果两个寄存器先8位DAC寄存器选通,再8位D/A转换寄存器选通则为双缓冲方式。
5.
利用DAC0832芯片,采用双缓冲方式,产生梯形波,分别用汇编语言和C语言编程实现。
WR1WR2CSXFER答:硬件电路图如图8.8。8位输入锁存器的地址为7F00H,8位DAC寄存器的地址为0BF00H。设一个周期有8梯。参考程序如下: 汇编语言编程:
MOV DPTR,#7F00H LOOP:
MOV A,#00H MOVX @DPTR,A MOV MOVX @DPTR,A ACALL ADD SJMP LOOP
DELAY:
MOV R7,#0FFH DJNZ R7,$ RET
C语言编程:
DELAY A,#20H DPTR,#0BF00H
#include
DAC0832A=i; DAC0832B=i; i=i+0x20;
delay(); }
//延时
}
void delay() { uchar i;
for (i=0;i<0xff;i++) {;} }
//延时函数