单片机原理与应用及C51程序设计(第二版)课后答案 下载本文

内容发布更新时间 : 2024/6/11 8:00:07星期一 下面是文章的全部内容请认真阅读。

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 #include #define uchar unsigned char #define IN0 XBYTE[0x0000] static uchar data x[8];

//定义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 //定义绝对地址访问 #define uchar unsigned char #define DAC0832A XBYTE[0x7F00] #define DAC0832B XBYTE[0xDF00] void delay(void); void TXB() { uchar i; while(1) {

DAC0832A=i; DAC0832B=i; i=i+0x20;

delay(); }

//延时

}

void delay() { uchar i;

for (i=0;i<0xff;i++) {;} }

//延时函数