单片机原理与应用试卷及答案一、填空题1、10110110B作为无字符数时,十进制数值为182;作为补码时,十进制数值为—74.2、原码01101011B的反码为01101011B;补码为01101011B。3、由8051的最小系统电路除芯片外,外部只需要复位电路和时钟(晶振)电路,如果由8031的最小系统,还需要扩展外部ROM电路。4、若已知8051RAM的某位地址为09H,则该位所处的单元地址为21H。5、C51语言中,指令#defineADCXBYTE[OXFFEO]能够正确编译的前提是包含头文件absacc.h,该指令的作用是定义一个外部地址单元为OXFFEO。二、选择题1、程序和常数都是以(二进制)的形式存放在单片机程序的存储器中。2、下列哪一个选项的指令语句不是任何时候都可以被C51正确编译?(uchar;k=ox20)3、当PSW的RS0和RS1位分别为1和0时,系统选用的寄存器组为(1组)4、若某存储器芯片地址线为12根,那么它的存储容量为(4KB)5、已知Tosc=12MHZ,TH1=177,TL1=224,TMOD=ox10,则从定时器启动到正常溢出的时间间隔为(20ms)三、简答题1、请简述TTL电平和CMOS电平的区别。TTL电平临界值CMOS电平临界值(没有电源电压为+5v)VOHmin2.4v4.99vVOLmax0.4v0.01vVIHmin2.0v3.5vVILmax0.8v1.5vCMOS电平能驱动TTL电平,但TTL电平不能驱动CMOS电平,需要上拉电阻。2、请简述利用keil开发程序的操作步骤。答:①新建工程项目②配置工程项目属性③创建源文件④将源文件加入项目⑤保存项目3、PSW寄存器有何作用?其各位是如何定义的?答:标志寄存器PSW是一个8位的寄存器,它用于保存指令执行结果的状态,以供工程查询和判别。CACFORS1RS0OV—PC(PWS.7):进位标志位AC(PWS.6):辅助进位标志位FO(PWS.5):用户标志位RS1、RS0(PWS.4、PWS.3):寄存器组选择位OV(PSW.2):溢出标志位P(PWS.0):奇偶标志位4、为什么MC551单片机的并行口用作输入端时先要给引脚置1?答:并行口输入端接下拉电阻,将场效应管截止,防止输出端接地。PSWD7D6D5D4D3D2D1D0DOHRS1RS0工作寄存器组000组(00H—07H)011组(08H—0FH)102组(10H—17H)113组(18H—1FH)四、编程题1、请用C51编写一段程序,利用定时中断法使P1口外接的8盏LED小灯实现亮灯状态间隔为2秒的流水灯效果。答:#includereg52.h#includeintrins.h//intrins.h中定义了空指令、位测试指令及环移、出入栈等51汇编中有而标准c中没有的指令#defineuintunsignedint;//简化无符号变量的声明关键字#defineucharunsignedchar;ucharsec_counter,led_statue;//定义两个变量,一个用于秒计数,一个用于保存LED当前的亮灯状态main(){SP=0x60;//转移堆栈区TH0=0x3C;//12MHz的50ms初值,6MHz的100ms初值TL0=0xB0;TMOD=0x01;//设置TMOD,使T0为定时方式1led_statue=0x0fe;//初始化共阳极亮灯状态,如果外部LED小灯接法为共阴极,这里值为0x01sec_counter=40;//秒计数(12MHz时,40*50=2000ms)ET0=1;//T0中断允许EA=1;//总中断允许TR0=1;//启动T0开始计时while(1);//等待中断}voidintt0()interrupt1{TH0=0x3C;//恢复T0初值TL0=0xB0;if(sec_counter--=0){//如果没到1s,则返回,到了1s,则循环移位亮灯状态P1=led_statue;led_statue=_crol_(led_statue,1);sec_counter=40;//恢复2s初值}}2、某系统需要扩展—3*3的键盘陈列,当9个按键依次按下时可分别在7位LED数码管输出AbCdEFLHO,试设计硬件电路图,并用C51编写程序实现上述功能。答:#includereg52.h#includeintrins.h#defineucharunsignedchar#defineuintunsignedintsbitdula=P2^6;sbitwela=P2^7;//共阴极数码管AbCdEFLHo编码ucharcodeNumTab[]={0x88,0x83,0xc6,0xa1,0x86,0x8e,0xc7,0x89,0xa3};/*********毫秒延时函数********/voiddelayms(uinttms){uinti,j;for(i=tms;i0;i--)for(j=110;j0;j--);}/*******显示子函数**********/voiddisplay(ucharnum){P0=NumTab[num];dula=1;dula=0;}/*******键反转法扫描子函数**********/voidkey_CV_Scan(){uchari,j,temp,key;//键反转法,先获取低3位信息,再获取高3位信息while(1)//然后将高低3位组合成一个完整的8位键码{P3=0x0F;temp=P3;if((temp&0x0F)!=0x0F){switch(temp)//判断按下的键在哪一行,得到行号{case0x0b:i=2;break;case0x0d:i=1;break;case0x0e:i=0;break;default:break;}}delayms(10);//软件去抖动P3=0xF0;//反转行和列上的电平temp=P3;if((temp&0xF0)!=0xF0)//判断按下的键在哪一列,得到列号{switch(temp){case0xb0:j=2;break;case0xd0:j=1;break;case0xe0:j=0;break;default:break;}key=3*i+j;//通过行列号来计算键值display(key);//显示键值}}}/**********主函数**************/voidmain(){P0=0x3f;wela=1;wela=0;P0=0xff;dula=1;dula=0;while(1){key_CV_Scan();}}