单片机原理与应用试题及答案.docx
《单片机原理与应用试题及答案.docx》由会员分享,可在线阅读,更多相关《单片机原理与应用试题及答案.docx(7页珍藏版)》请在冰豆网上搜索。
![单片机原理与应用试题及答案.docx](https://file1.bdocx.com/fileroot1/2022-11/23/6b267d24-b364-4a95-acde-d5117b47bbdd/6b267d24-b364-4a95-acde-d5117b47bbdd1.gif)
单片机原理与应用试题及答案
单片机原理与应用试卷及答案
-、填空题
1、B作为无字符数时,十进制数值为182;作为补码时,十进制数值
为一74.
2、原码01101011B的反码为01101011B补码为01101011B
3、由8051的最小系统电路除芯片外,外部只需要复位电路和时钟(晶振)电路,如果由8031的最小系统,还需要扩展外部ROM电路。
4、若已知8051RAM勺某位地址为09H,则该位所处的单元地址为
5、C51语言中,指令#defineADCXBYTEQXFFEO能够正确编译的前
提是包含头文件,该指令的作用是定义一个外部地址单元为OXFFEO
二、选择题
1、程序和常数都是以(二进制)的形式存放在单片机程序的存储器中。
2、下列哪一个选项的指令语句不是任何时候都可以被C51正确编译
(uchar;k=ox20)
3、当PSW勺RS0和RS1位分别为1和0时,系统选用的寄存器组为(1组)
4、若某存储器芯片地址线为12根,那么它的存储容量为(4KB
5、已知Tosc=12MHZTH1=177TL1=224,TMOD=ox1,则从定时器启动
到正常溢出的时间间隔为(20mS
简答题
1、请简述TTL电平和CMO电平的区别
TTL电平临界值
CMO电平临界值(没有电源电
压为+5v)
VOHn
VOLax
VIHmin
VILmax
CMO电平能驱动TTL电平,但TTL电平不能驱动CMO电平,需要上拉电阻。
2、请简述利用keil开发程序的操作步骤
答:
①新建工程项目②配置工程项目属性③创建源文件④将源文件加
入项目⑤保存项目
3、PSW寄存器有何作用其各位是如何定义的
答:
标志寄存器PSW是一个8位的寄存器,它用于保存指令执行结果
的状态,以供工程查询和判别。
PSW
C
AC
FO
RS
RS0
OV
—
P
1
F0():
用户标志位
RS1RSO(、):
寄存器组选择位0V():
溢出标志位
P():
奇偶标志位
4、为什么MC55单片机的并行口用作输入端时先要给引脚置1
答:
并行口输入端接下拉电阻,将场效应管截止,防止输出端接地
四、编程题
1请用C51编写一段程序,利用定时中断法使P1口外接的8盏LED小灯实现亮灯状态间隔为2秒的流水灯效果。
答:
#include<>
#include<>//中定义了空指令、位测试指令及环移、
出入栈等51汇编中有而标准c中没有的指令
#defineuintunsigned
int;//简化无符号变量的声明关键字
#defineucharunsignedchar;
ucharsec_counter,led_statue;//定义两个变量,
一个用于秒计数,一个用于保存LED当前的亮灯状态
main()
SP=0x60;
TH0=0x3C;
〃12MHz的50ms初值,6MHz的
//转移堆栈区
100ms初值
TL0=0xB0;
TMOD=0x01;
//设置TMOD,使T0为定时方式1
led_statue=0x0fe;
//初始化共阳极亮灯状态,如果外
部LED小灯接法为共阴极,这里值为0x01
sec_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编写程序实现上述功能。
答:
#include<>
#include<>#defineucharunsignedchar
#defineuintunsignedint
sbitdula二P2八6;
sbitwela=P2A7;
//共阴极数码管AbCdEFLH(编码ucharcodeNumTab[]={0x88,0x83,0xc6,
0xa1,0x86,0x8e,0xc7,0x89,0xa3};
*********
毫秒延时函数********/
voiddelayms(uinttms)
{
uinti,j;
for(i=tms;i>0;i--)
for(j=110;j>0;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;
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();}