单片机C51编程考证.docx
《单片机C51编程考证.docx》由会员分享,可在线阅读,更多相关《单片机C51编程考证.docx(26页珍藏版)》请在冰点文库上搜索。
![单片机C51编程考证.docx](https://file1.bingdoc.com/fileroot1/2023-7/3/1ee7272e-3d8c-4304-ad50-04e385f51c75/1ee7272e-3d8c-4304-ad50-04e385f51c751.gif)
单片机C51编程考证
1.10习题
一、填空题
1.最早的单片机是4位的。
5.如果某个特殊功能寄存器能被8整除,那么这个特殊功能寄存器便可以进行位寻址。
6.单片机的时钟模式包括片内时钟模式和片外时钟模式两种。
二、选择题
7.51系列单片机可以寻址(A)的程序存储空间。
A.64KBB.32KB
C.8KBD.4KB
8.算术逻辑部件(ALU)不可以执行如下哪个操作(D)。
A.加法B.减法
C.逻辑运算D.傅立叶变换
2.4习题
一、填空题
2.AT89S51具有32个通用I/O引脚,6个中断源,2个定时器/计数器。
3.KeilμVision3集成开发环境中,编译当前文件的快捷键为Ctrl+F7。
二、选择题
1.AT89S51是(A)公司的产品。
A.AtmelB.Cypress
C.MaximD.Freescale
3.9习题
一、填空题
4.多分支结构一般采用JMP来实现。
二、选择题
3.在下面程序运行后,RAM存储单元20H~24H中数值分别变为(A)。
01ORG0000H
02JMPSTART
03ORG1000H
04START:
MOVA,#04H;累加器A赋值
05MOV20H,#20H;RAM的20H单元赋值
06XCHA,20H;直接寻址整字节交换指令
07MOVR2,#05H;寄存器R2赋值
08XCHA,R2;寄存器寻址整字节交换指令
09MOV21H,A;保存数据05H到RAM的21H单元
10MOV10H,#06H;RAM单元赋值
11MOVR0,#10H;寄存器R0赋值
12XCHA,@R0;寄存器间接寻址整字节交换指令
13MOV22H,A;保存数据06H到RAM的22H单元
14MOVA,#00H;累加器A赋值
15MOV11H,#0FH;RAM单元赋值
16MOVR1,#11H;寄存器R1赋值
17XCHDA,@R1;半字节交换指令
18MOV23H,A;保存数据到RAM的23H单元,数据应该为0FH
19MOVA,#0FH;累加器A赋值
20SWAPA;累加器高低字节交换指令
21MOV24H,A;保存数据到RAM的23H单元,数据应该为F0H
22RET
23END
A.0x04H、0x05H、0x06H、0x0FH和0xF0H
B.0x01H、0x05H、0x01H、0x0FH和0xF0H
C.0x04H、0x05H、0x02H、0x0FH和0xF0H
D.0x04H、0x05H、0x06H、0x0FH和0xFFH
4.11习题
二、选择题
4.下面这段程序的运行结果为(A)。
01#include//头文件
02voidmain()//主函数
03{
04inta,b,c,d,e;//声明变量
05floatf1,f2;
06a=7;//变量赋值
07b=9;
08c=!
a;//计算逻辑表达式
09d=a||b;
10f1=2.3;
11f2=5.7;
12e=(f1!
=f2);
13printf("c=%d,d=%d,e=%d\n",c,d,e);//输出结果
14}
A.c=0,d=1,e=1B.c=1,d=1,e=1
C.c=0,d=1,e=0D.c=1,d=0,e=0
四、编程题
编写一个成绩等级的程序。
要求输入学生的成绩范围为0~100,当为90~100时,输出字符A;当为80~90时,输出字符B;当为60~80时,输出字符C。
当小于60时,输出字符D。
答:
#include//头文件
voidmain()//主函数
{
floatscore=92;
if(score>=90)
{
printf(“A”);
}
elseif(score<90&&score>=80)
{
printf(“B”);
}
elseif(score<80&&score>60)
{
printf(“C”);
}
else
{
printf(“D”);
}
}
5.13习题
一、填空题
1.在C51语言的程序中,循环语句一般采用for、do-while和while来实现。
2.字符在C51语言的程序中,跳转语句一般采用goto、break和continue来实现。
二、选择题
2.break语句不能应用于那个语句内部(A)。
A.ifB.for
C.whileD.do-while
3.下面这段程序的运行结果为(A)。
01#include//头文件
02voidmain()//主程序
03{
04charch;
05ch=’a’;//赋值
06switch(ch)//开关语句
07{
08case'a':
//如果为'a',则输出'A'
09printf("ch的大写字符为A");
10break;
11case'b':
//如果为'b',则输出'B'
12printf("ch的大写字符为B");
13break;
14default:
//否则输出这里
15printf("Notaandb");
16break;
17}
18}
A.ch的大写字符为AB.ch的大写字符为B
C.NotaandbD.都不是
四、编程题
编写一个子函数来实现如下函数的计算,其中,x为整数,并计算x=5时的函数值。
01#include//头文件
02intFun(intx)
03{
04inti,y;
05if(x>0)//判断x的值
06{
07y=1;
08for(i=1;i<=x;i++)//阶乘运算
09{
10y=y*(i+1);
11}
11y=y-1;
12}
13else
14{
15y=3*x*x+2*x+1;//计算数学表达式
16}
17returny;//返回语句
18}
19voidmain()//主函数
20{
21intx=5,y;
22y=Fun(x);//函数调用
23printf("y=%d\n",y);//打印输出结果
24}
6.8习题
一、填空题
3.在程序中声明字符串数组时,其长度必须比要存的字符串多一个元素,最后一位元素用来存储空字符“\0”。
5.在C51语言中,虽然不能动态分配数组的大小,但是可以动态分配数组元素的值。
二、选择题
3.访问多维数组元素的时间要(A)访问一维数组元素的时间。
A.大于B.等于
C.小于D.不确定
4.在下面程序运行结果为(C)。
01#include//头文件
02#include//提供字符串操作的头文件
03voidmain()//主函数
04{
05chara[10]={'a','b'};//声明字符串数组,并赋值
06charb[]="good";
07chars[30];
08strcat(a,b);//将字符串b追加到a的末尾
09strcpy(s,a);//将字符串a复制到字符串s
10printf("s=%s\n",s);//输出字符串s
11}
A.s=abB.s=good
C.s=abgoodD.s=abgood\n
}
7.9习题
一、填空题
3.指针变量的专用运算符包括&和*。
4.指针变量可以参与关系和算术运算。
二、选择题
3.在下面程序可能的运行结果为(A)。
01#include//头文件
02voidmain()//主程序
03{
04intch[3][4]={{1,1,3,3},{5,6,7,8},{9,10,1,2}};//定义并初始化二维数组ch
05printf("ch=%d,",ch);//输出ch的值
06printf("*ch=%d\n",*ch);//输出*ch的值
07}
A.a=1000,*a=1000B.a=1000,*a=2000
C.a=2000,*a=1000D.a=1010,*a=2000
8.10习题
二、选择题
4.下面这段程序的运行结果为(A)。
01#include//头文件
02structstudent//声明结构
03{
04intnum;//学号
05charname[20];//姓名
06charsex[2];//性别
07intage;//年龄
08floatscore;//分数
09}class1[5]={//声明结构数组并初始化
10{100"Alice","F",24,90.5},
11{101,"Bob","M",24,88.0},
12{102,"Jack","M",25,95.5},
13{103,"Twis","M",23,69.5},
14{104,"Bohm","M",21,82.5}
15};
16voidmain()//主函数
17{
18inti;
19for(i=0;i<5;i++)//循环
20{
21if(boy[i].score>=95.0)//判断分数是否大于90,如果大于则输出
22printf("%d%s%s%d%f\n",
23class1[i].num,class1[i].name,
24class1[i].sex,class1[i].age,class1[i].score);
25}
26}
A.100AliceF2490.500000B.102JackM2595.500000
C.101BobM2488.000000D.103TwisM2369.500000
9.7习题
一、填空题
2.从数据存储角度来说,结构和联合变量的区别主要在于联合变量的成员占用同一个内存空间,而结构变量中的成员分别独占自己的内存空间,互相不干扰,
二、选择题
2.位域中的一个位段可以存储在(A)。
A.一个字节B.多个字节
C.相邻两个字节D.以上都可以
10.9习题
一、填空题
3.在C51语言中,除了main函数外,各个函数都是平行的。
4.函数的调用方式包括赋值调用、引用调用、递归调用和嵌套调用。
二、选择题
2.toascii(245)的结果为(A)。
A.uB.245
C.UD.127
11.8习题
4.在下面程序运行结果为(A)。
01#include//头文件
02#defineSCORE85//宏定义
03voidmain()//主函数
04{
05#ifdefSCORE//条件编译
06printf("SCOREexisted!
");//如果宏SCORE存在,则执行该语句
07#else
08printf("NoSCORE!
");//如果宏SCORE不存在,则执行该语句
09#endif
10#ifndefGREED
11printf("GREEDisnotdefined!
");//如果宏GREED存在,则执行该语句
12#else
13printf("GREEDisdefined!
");//如果宏GREED不存在,则执行该语句
14#endif
15}
A.SCOREexisted!
GREEDisnotdefined!
B.NoSCORE!
GREEDisnotdefined!
C.SCOREexisted!
GREEDisdefined!
D.NoSCORE!
GREEDisdefined!
四、编程题
使用嵌套汇编的方法编写一个可以精确控制P2端口引脚电平延时的程序。
01#include//头文件
02voidmain()//主函数
03{
04while
(1)
05{
06P2=0x00;//P2端口输出
07#pragmaasm//嵌入汇编语句
08NOP
09NOP
10SETBP2.0//置P2.0为高电平
11NOP
12NOP
13#pragmaendasm//结束汇编语句嵌入
14P2=0x00;//P2端口输出
15}
16}
12.7习题
一、填空题
4.在KeilμVision编译系统中,支持的8051系列单片机存储模式共有如下三种Small模式、Compact模式和Large模式。
二、选择题
2.bdata不可用于那个类型的声明(C)。
A.intB.short
13.8习题
一、填空题
2.T0和T1都具有定时和计数的功能,可以通过特殊功能寄存器来选择。
3.寄存器TMOD的C/
位又称为工作方式选择位,可以选择定时功能或者计数功能。
二、选择题
1.T1不可以工作如下那个模式(D)。
A.工作模式0B.工作模式1
C.工作模式2D.工作模式3
2.以下哪个寄存器可以位寻址(B)。
A.TMODB.TCON
C.TH0D.TL0
3.以下哪个工作模式为16位计数器方式(B)。
A.工作模式0B.工作模式1
C.工作模式2D.工作模式3
4.51系列单片机最多可以使用(B)个定时器/计数器。
A.2B.3
C.1D.4
14.10习题
一、填空题
1.51系列单片机提供了三类中断源,即外部中断源、串行中断源和定时中断源。
2.单片机外部中断源,分别为外部中断0和外部中断1。
二、选择题
4.51系列单片机对中断的查询次序为(C)。
A.外部中断1→T0→外部中断0→T1→串行中断
B.外部中断0→T1→外部中断1→T0→串行中断
C.外部中断0→T0→外部中断1→T1→串行中断
D.外部中断1→T1→外部中断0→T0→串行中断
15.9习题
2.SM0和SM1是串行通信接口工作方式选择位。
二、选择题
3.如下那个寄存器可位寻址(A)。
A.SCONB.PCON
C.SBUFD.以上都可以
4.波特率=fosc·2SMOD/64是如下那个串口工作模式的波特率公式(C)。
A.模式0B.模式1
C.模式2D.模式3
16.7习题
一、填空题
3.中断法是将键盘扫描程序放置在单片机的中断服务例程中的方法。
只有当按键按下的时候,才触发中断,进而扫描键值。
4.阵列式按键键盘是将各个开关排列成行和列的阵列结构,其中,单片机的I/O接口一部分作为行,一部分作为列,按键布置在行线和列线的上。
5.直接式按键键盘就是采用单独的按键开关,直接连接到一个单片机的输入引脚上,每个按键占用一个单片机的I/O接口。
四、编程题
编写一个程序,单片机外接4×4阵列式按键键盘和蜂鸣器,根据按键键值的不同使蜂鸣器响相应的次数。
答:
#include//头文件
#include//头文件
introw;//定义行号
inttier;//定义列号
intKeyScan();//子函数声明
voidDelay();
voidmain()//主函数
{
intKey,i;
while
(1)//开始循环扫描键盘
{
Key=KeyScan();//键盘扫描子函数
for(i=0;i{
P2=0x01;//
Delay();
P2=0x00;//
Delay();
}
}
}
voidDelay()//延时子函数
{
longi;
for(i=10000;i>0;i--);//可以根据系统的时钟频率来调整
}
intKeyScan()//键盘扫描子函数
{
P1=0xF0;//列输出全0
if((P1&0xF0)!
=0xF0)//扫描行,如果不全为0,则进入
{
switch(P1)//获得行号
{
case0x70:
row=1;
break;
case0xB0:
row=2;
break;
case0xD0:
row=3;
break;
case0xE0:
row=4;
break;
default:
break;
}
Delay();//延时去抖动
P1=0x0F;//行输出全0
if((P1&0x0F)!
=0x0F)//扫描列,如果不全为0,则确认按键按下
{
switch(P1)//获得列号
{
case0x07:
tier=1;
break;
case0x0B:
tier=2;
break;
case0x0D:
tier=3;
break;
case0x0E:
tier=4;
break;
default:
break;
}
return4*(row-1)+tier;//扫描到按键,返回键值
}
}
else
{
return0;//未扫描到按键按下,返回0
}
}
17.7习题
一、填空题
1.7段共阳极LED数码管,其中包括了7个条形发光二极管和一个小数点位。
7个发光二极管构成字形“8”,可以用来显示数字,另一个发光二极管构成小数点。
2.共阴极7段LED数码管有发光二极管的阴极为公共端,接GND。
如果发光二极管的阳极为高电平的时候,发光二极管导通,该字段发光;反之,如果发光二极管的阳极为低电平的时候,发光二极管截止,该字段不发光。
5.LED驱动器MAX7219片内具有14个内部数字和控制寄存器。
二、选择题
1.7段共阳极LED数码管显示字符“A”的段码为(A)。
A.88HB.77H
C.66HD.99H
2.7段共阴极LED数码管显示字符“0”的段码为(B)。
A.C0HB.3FH
C.00HD.AAH
3.下列哪个不是MAX7219的特点(D)。
A.可以级联B.驱动8个7段共阴极LED显示器
C.采用三线串行方式D.高速率
4.静态驱动多个LED数码管有哪些(多选)(ABD)。
A.直接驱动B.串行接口扩展I/O接口驱动
C.动态扫描D.使用外部扩展RAM地址来驱动
18.8习题
一、填空题
1.I2C总线全称为芯片间总线(InterIntegrateCircuitBUS),其是Philips公司推出的一种双向二线制总线。
3.引脚地址是由I2C总线外围器件的地址引脚(A2,A1,A0)决定,根据其在电路中接电源正极、接地或悬空的不同,形成不同的地址代码。
4.I2C总线上的数据是伴随着时钟脉冲,一位一位地传送的,每位数据占一个时钟脉冲。
在I2C总线启动后或应答信号后的第1~8个时钟脉冲,对应于要传送字节的8位数据,数据位由低到高传送。
5.AT24C08是Atmel公司典型的I2C串行总线的EEPROM,其具有1024×8位的存储容量,工作于从器件模式模式。
四、编程题
开发一个写I2C总线接口EEPROM的程序,并提供检验功能,当检验失败的时候提供报警。
答:
利用单片机的P1.0、P1.1作为I2C串行总线的SCL、SDA接口,向AT24C08写入8个字节的数据,然后再将写入的数据读出,并比较。
如果读写的数据完全一致,则置P3.7引脚为高电平,发光二极管亮;否则置P3.7引脚为低电平,发光二极管灭。
程序代码示例如下:
#include
/***************************************************