间隔不要超过20ms,并保持延时一段时间,以造成视觉暂留效果,给人看上去每个数码管总在亮。 6、89C52中SCON的SM2、TB8、RB8有何作用?
答案:SM2:多机通信控制位。 TB8:发送数据的第9位。 RB8:接收数据的第9位。 7、ADC0809的EOC引脚有何作用?
答案:EOC转换结束信号,是芯片的输出信号。转换开始后,EOC信号变低;转换结束时,EOC返回高电平。这个信号可以作为A/D转换器的状态信号来查询,也可以直接用作中断请求信号。 4、什么是单片机?单片机有哪些特点?
答案:单片机是指将CPU、RAM、ROM、中断系统、定时器以及I/O口等集成在一块芯片上构成的单片微型计算机。它有体积小、成本低、运用灵活、扩展能力强、抗干扰能力强等特点。 8、简述单片机多机通信的原理。
答案:主机首先发送的一帧数据为地址,即某从机机号,其中第9位为1,所有的从机接收到数据后,将其中第9位装入RB8中。各个从机根据收到的第9位数据(RB8中)的值来决定从机可否再接收主机的信息。若(RB8)=0,说明是数据帧,则使接收中断标志位RI=0,信息丢失;若(RB8)=1,说明是地址帧,数据装入SBUF并置RI=1,中断所有从机,被寻址的目标从机清除SM2,以接收主机发来的一帧数据。其他从机仍然保持SM2=1。
9、若晶振为11.059 2MHz,串行口工作于方式1,波特率为4 800b/s。写出用T1作为波特率发生器的方式字和计数初值。
答案:方式字TMOD:0x20 计数初值:设置波特率控制位(SMOD)=0 X=256-11.0592*10^6*(0+1)/(384*4800)=250 所以,(TH1)=(TL1)=250。
10、若定时器T1设置成模式2作波特率发生器,已知fosc=6MHz,求可能产生的最高和最低的波特率。 答案:波特率=fosc*(SMOD+1)/(384*(256-X)) fosc=6*10^6 当SMOD=1,X=255时,波特率有最大值31250
当SMOD=0,X=0时,波特率有最低值61 11、简述行扫描法的工作原理?
答案:行扫描法是:向行线输出全扫描字00H,把全部行线置为低电平,如果有按键按下,总会有一根列线电平被拉至低电平,从而使列输入不全为l。从而得到列号;然后依次给行线送低电平,然后查所有列线状态,称行扫描。如果全为l,则所按下的键不在此行;如果不全为l,则所按下的键必在此行。从而得到行号。
12、常见的模/数转换电路有哪些? 答案:(计数比较型、逐次逼近型、双积分型) 13、为什么要消除键盘的机械抖动?有哪些方法?
答案:键抖动会引起一次按键被误读多次。为了确保CPU对键的一次闭合仅做一次处理,必须去除键抖动。可用硬件或软件两种方法消除。
14、89C52单片机的串行口由哪些功能部件组成?各有什么作用?
答案:89C52通过引脚RXD(P3.0,串行数据接收端)和引脚TXD(P3.1,串行数据发送端)与外界进行通信,单片机内部的全双工串行接口部分,包含有串行发送器和接收器,有两个物理上独立的缓冲器,即发送缓冲器和接收缓冲器SBUF。发送缓冲器只能写入发送的数据,但不能读出;接收缓冲器只能读出接收的数据,但不能写入。控制状态寄存器SCON ,用于定义串行通信口的工作方式和反映串行口状态。 15、什么是堆栈?栈指针SP的作用是什么?
答案:堆栈是在RAM专门开辟的一个特殊用途的存储区。堆栈是按照“先进后出”(即先进入堆栈的数据后移出堆栈)的原则存取数据。堆栈指针SP是一个8位寄存器,其值为栈顶的地址,即指向栈顶,SP为访问堆栈的间址寄存器。
16、MCS-51单片机的P0~P3口用作通用I/O口输入数据时应注意什么?P0口用作输出口输出数据时应注意什么?
答案:MCS-51单片机的P0~P3口用作通用I/O口输入数据时应注意先向口锁存器写1;P0口用作输出口输出数据时应加上拉电阻。
17、简述MCS-51单片机片内RAM存储的空间分配。内部RAM低128字节分为哪几个主要部分。
答案:MCS-51单片机片内RAM分为低128字节、高128字节和SFR。内部RAM分为工作寄存器组区、位寻址区和用户数据区三部分。
18、为什么定时器T1用作串行口波特率发生器时,常选用工作模式2?若已知系统时钟频率和通信用波特率,如何计算其初值?
答案:定时器的模式2是8位自动重装初值的方式,可以产生非常精确的定时时间,所以被用作串行口波特率发生器。
定时器初值计算公式:X=256-fosc*(SMOD+1)/(384*波特率) 19、单片机前向通道的作用是什么?
答案:被测对象的有关参量往往是一些连续变化的模拟量,如温度、压力、流量、速度等物理量,这些模拟量必须转换成数字量后才能输入到计算机进行处理。这就是单片机与被测对象联系的前向通道。
20、MCS-51单片机片内RAM包含哪些可以位寻址的单元。位地址7CH和字节地址7CH如何区别?位地址
7CH具体在片内RAM的什么位置?
答案:MCS-51单片机片内RAM包含位寻址区和SFR中字节地址能够被8整除的SFR。位地址和字节地址的区别在于使用不同的寻址方式,位地址使用位寻址,字节地址使用直接寻址或间接寻址。位地址7CH在片内RAM中字节地址为2FH的第4位。 21、简述按键扫描的过程?
答案:①判断键盘中是否有键按下;②进行行扫描,判断是哪一个键按下,若有键按下,则调用延时子程序去抖动;
③读取按键的位置码;
④将按键的位置码转换为键值
六、编程题
1、设计一个2×2的行列式键盘(同在P1口)电路并编写键扫描程序。 答案:#include
unsigned char row,col=0,k =-1; P1=0xfc;
if((P1&0xfc)==0xfc) return(k); delay20ms();
if((P1&0xfc)==0xfc) return(k);
for(row=0;row<2;row++) {
P1=~(1< while(k&(1<<(col+2))) col++; k=row*2+col; P1=0xfc; while(P1&0xfc!=0xfc); break; } } return k; } 2、编写一密码锁开锁时的密码核对函数,函数入口参数为开锁者输入的6位十进制数(长整型),系统已经保存有10组密码passw,函数的功能是把输入的数与保存的密码逐个比较,正确时返回1,错误时返回0。 答案:bit check_password(long dd) { unsigned char i; for(i=0;i<10;i++) if(passw[i]==dd) return 1; return 0; } 3、使用MCS-51单片机系统的定时器/计数器T1定时中断,从P3.6和P3.7引脚分别输出周期为500μs和1000μs的方波。设晶振频率为6MHz。完成下列问题: (1)使用一个定时器怎样产生两种方波? (2)定时多少μs?定时器初值是什么?使用模式几? (3)编写主函数和T1中断服务函数,使P3.6和P3.7引脚产生方波。(不考虑T0)。 答案:(1)T1定时每次中断对P3.6引脚取反产生周期为500μs的方波,每2次中断对P3.7引脚取反产生周期为1000μs的方波。 (2)定时250μs;初值为131;使用模式2。 (3)C语言程序 #include sbit P37=P3^7; 主函数: main() { TMOD=0x21; TL1=131; TH1=131; EA=1; ET1=1; TR1=1; while(1); } T1中断服务函数: void int_t1( 4、某MCS-51单片机系统使用定时器/计数器T0监测某设备信号,当设备出现故障时其信号为高电平,要求出现故障时,从P3.5引脚输出方波,产生频率为1000Hz的报警声音。设晶振频率为12MHz,不考虑T1。完成下列各问题: (1)怎样使用故障信号控制T0工作产生方波? (2)计算声音信号的周期、T0的定时时间、T0在定时时间内的计数值; (3)选T0以何种模式工作?TMOD赋何值? (4)计算T0初值; (5)编写主函数和T0中断服务函数,使T0以中断方式从P3. 5引脚产生报警声音方波。 答案:(1)用外部门控制T0工作 (2)1ms,500μs,500 (3)模式2,TMOD=0X29 (4)65036 (5)C语言程序 #include { TMOD=0x29; TL0=12, TH0=254; EA=1, ET0=1; TR0=1; while(1); } T0中断服务函数: void int_t0(void) interrupt 1 { TL0=12, TH0=254; P35=~P35 5、编写一函数,对无符号字符型数组用冒泡法从小到大进行排序,函数的入口参数为拟排序的数组aa和数组的长度m。 答案:void sort(unsigned char aa, unsigned char m) { unsigned char I,j,n,tem; for(i=0;i 6、设fsoc=11.059 2MHz,试编写一段程序,其功能为对串行口初始化,使之工作于方式1,波特率为1 200b/s;并用查询串行口状态的方法,读出接收缓冲区的数据并回送到发送缓冲区。 答案:#include void main() {unsigned char c; TMOD=2; TH1=0xe8; TL1=0xe8; TR1=1; SCON=0x50; while(1) { while(!RI); RI=0; c=SBUF; SBUF=c; while(!TI); TI=0; } } 7编写函数,查找code区域中从0x0030开始的100个单元中出现0x55的次数,并将查找的结果从函数中返回。 答案:unsigned char find(void) if(*(p++)==0x55) { unsigned char i, dd=0;dd++; unsigned char code *p;return dd; I=100; p=0x0030;} while(i--) 8、某MCS-51单片机系统使用定时器/计数器T1定时,产生频率为1000Hz的方波声音信号,要求方波信号从P3.5引脚输出。设fosc=6MHz,不考虑T0。完成下列各问题: (1)计算声音信号的周期和T0的定时时间; (2)计算T1在定时时间内的计数值; (3)应该选T1以何种模式工作最恰当?写出模式字TMOD的值; (4)计算T1的定时初值; (5)编写主函数和T1中断服务函数,使T1以中断方式从P3. 5引脚产生方波。 答案:(1)1ms,500μs (2)250 (3)模式2,TMOD=0X25 (4)6 (5)C语言程序 #include T1中断服务函数: void int_t1(void) interrupt 3 { P35=~P35; } 9、使用MCS-51单片机的P3.2引脚测量正脉冲的宽度。设系统振荡频率为12MHz。完成下列问题: (1)测量的原理是什么? (2)如果是使用定时器/计数器实现,是定时还是计数?使用什么模式? (3)编写C语言测量函数(不考虑T1)。 答案:(1)用T0定时,外部门控制工作,脉冲出现期间所计数对应的时间,就是脉冲宽度。 (2)用T0以模式1定时 (3)测量函数 #include unsigned int measure () { TMOD=0x09; TL0=0; TH0=0; while(P32==1); TR0=1; while(P32==0); while(P32==1); TR0= 0; return (TH0*256+TL0); } 10、编写一函数,查找片外RAM区域中从0x0100开始的200个单元中出现0xaa的次数,并将查找的结果从函数中返回。 答案:unsigned char find(void) { unsigned char data i, d=0; unsigned char xdata *p; i=200; p=0x0100; while(i--) if(*(p++)==0xaa) d++; return d; } 11、某MCS-51单片机系统使用定时器/计数器T0定时,从P1.0 产生频率为100kHz等宽矩形波。假定单片机的晶振频率为12MHz,不考虑T1。完成下列各问题: (1)计算方波周期和T0的定时时间; (2)计算T0在定时时间内的计数值; (3)应该选T0以何种模式工作最恰当?写出模式字TMOD的值; (4)计算T0的定时初值; (5)编写主函数和T0中断服务函数,使T0以中断方式从P1.0产生方波。 答案:(1)10μs,5μs (2)5 (3)模式2,TMOD=0X22 (4)251 (5)C语言程序 #include { TMOD=0x22; TL0=251, TH0=251; EA=1, ET0=1; TR0=1; while(1); } T0中断服务函数: void int_t0(void) interrupt 1 { P1_0=~P1_0; } 12、某89C52单片机的P1口接8个发光二极管,拟用T1定时中断,控制P1口每250ms输出一次做右移流水灯显示,电路如图所示。设晶振为6MHz,不考虑T0。完成下列各问题: (1)P1口各位输出高电平还是低电平发光二极管亮? (2)拟使T1定时多少ms、中断多少次使P1输出一次?