rebuf[i]=spiin(); }
8.用P1口模拟I2C从外部接收一组数据,遇到“$”结束。引脚自定义。 unsigned char xdata buffer[100] ; void main() {
unsigned char temp=0; unsigned char i=0; temp=rxbyt();
while(temp!=’$’) {
buffer[i]=temp; i++; } }
第9章 习题答案
1.为什么要消除键盘的机械抖动?有哪些方法?
答: 键抖动会引起一次按键被误读多次。为了确保CPU对键的一次闭合仅做一次处理,必须去除键抖动。在键闭合稳定时,读取键的状态,并且必须判别;在键释放稳定后,再作处理。按键的抖动,可用硬件或软件两种方法消除。如果按键较多,常用软件方法去抖动,即检测出键闭合后执行一个延时程序,产生12~20 ms的延时,让前沿抖动消失后,再一次检测键的状态,如果仍保持闭合状态电平,则确认为真正有键按下。当确认有键按下或检测到按键释放后,才能转入该键的处理程序。
2.试说明非编码键盘的工作原理。如何判断按键释放?
答: 非编码键盘的单片机系统中,键盘处理程序首先执行有无键按下的程序段,当确认有按键按下后,下一步就要识别哪一个按键被按下。对键的识别常用逐行扫描查询法或行列反转法。在获取键号后,继续扫描端口,直到状态改变,去抖动后,再次确认状态改变,即可判断按键释放。
3.试述A/D转换器的种类和特点。
答: 模/数(A/D)转换电路的种类很多,例如,计数比较型、逐次逼近型、双积分型等等。逐次逼近型A/D转换器.在精度、速度和价格上都适中,是最常用的A/D转换器件。双积分A/D转换器,具有精度高、抗干扰性好、价格低廉等优点,但转换速度低。
4.设计一个2×2的行列式键盘(同在P1口)电路并编写键扫描程序。
36
+5V 89C52 P1.0 P1.1 P1.2 P1.3
#include
unsigned char key() {
unsigned char row,col=0,k =-1; P1=0xf0;
if((P1&0xf0)==0xf0) return(k);
delay20ms(); if((P1&0xf0)==0xf0) return(k);
for(row=0;row<2;row++) {
P1=~(1< if(k!=0xf0) { while(k&(1<<(col+2))) col++; k=row*2+col; P1=0xf0; while((P1&0xf0)!=0xf0); break; } } return(k); } 5.试设计一个LED显示器/键盘电路。 37 +5V 100Ω P0.0 P0.1 P0.2 P0.3 P0.4 P0.5 P0.6 P0.7 7407 89C52 +5V 5.1kΩ P2.7 P2.6 P2.5 P2.4 P2.3 P2.2 P2.1 P2.0 a b 7407 e f g dp c d 7406 6.在一个fosc为12MHz的89C52系统中接有一片ADC0809,它的地址为7FFFH,试编写ADC0809初始化程序和定时采样通道2的程序(假设采样频率为1ms/次,每次采样4个数据)。 #include #include define DAC0809 XBYTE[0x7fff] unsigned char xdata buffer[4] _at_ 0xa0; void main() { TMOD=0x01; TH0=0xFC; TL0=0x18; EA=1; ET0=1; TR0=1; DAC0809=2; while(1); } void time0_srv() interrupt 1 { unsigned char i; TH0=0xFC; TL0=0x18; for(i=0;i<4;i++) 38 buffer[i]=DAC0809; } 7.试说明TLC2543的特点和与89C52的接口方式。 答:TLC2543的特性如下: 12位A/D转换器(可8位、12位和16位输出); 在工作温度范围内转换时间为l0μs; 11通道输入; 3种内建的自检模式; 片内采样/保持电路; 最大±l/4 096的线性误差; 内置系统时钟; 转换结束标志位; 单/双极性输出; 输入/输出的顺序可编程(高位或低位在前); 可支持软件关机: 输出数据长度可编程。 TLC2543与89C52的接线很简单,用SPI接口。 8.DAC0832与89C52单片机连接时有哪些控制信号?其作用是什么? 答:ILE:数据锁存允许信号,高电平有效。 CS:输入寄存器选择信号,低电平有效。 WR1:输入寄存器的“写”选通信号,低电平有效。 WR2:DAC寄存器的“写”选通信号,低电平有效。 XFER:数据传送信号,低电平有效。 9.在一个89C52单片机与DAC0832组成的应用系统中,DAC0832的地址为7FFFH,输出电压为0~5V。试编写产生矩形波,其波形占空比为1:4,高电平时电压为2.5V,低电平时电压为1.25V的转换程序。 #include #define DAC0832 XBYTE[0x7FFF] void main() { unsigned char i; while(1) { DAC0832=127; delay(); DAC0832=63; for(i=0;i<3;i++) delay(); } } 39 10.试说明TLC5615的特点。 答:10位CMOS电压输出; 5 V单电源工作; 与微处理器3线串行接口(SPI); 最大输出电压是基准电压的2倍; 输出电压具有和基准电压相同的极性; 建立时间12.5μs; 内部上电复位; 低功耗,最高为l.75 mW; 引脚与MAX515兼容。 11.以DAC0832为例,说明D/A的单缓冲与双缓冲有何不同。 答:若应用系统中只有一路D/A转换或虽然是多路转换,但并不要求同步输出时,则采用单缓冲器方式接口,当地址线选通DAC0832后,只要输出控制信号,DAC0832就能一步完成数字量的输入锁存和D/A转换输出。 对于多路D/A转换接口,要求同步进行D/A转换输出时,必须采用双缓冲器同步方式接法。DAC0832采用这种接法时,数字量的输入锁存和D/A转换输出是分两步完成的,即CPU的数据总线分时地向各路D/A转换器输入要转换的数字量并锁存在各自的输入寄存器中,然后CPU对所有的D/A转换器发出控制信号,使各个D/A转换器输入寄存器中的数据同时打入DAC寄存器,实现同步转换输出。 40