PIC单片机课程期末复习题.docx
《PIC单片机课程期末复习题.docx》由会员分享,可在线阅读,更多相关《PIC单片机课程期末复习题.docx(20页珍藏版)》请在冰豆网上搜索。
PIC单片机课程期末复习题
PIC单片机课程期末复习题
一、PIC单片机硬件部分
1.PIC16F87X单片机的工作电压为5V,共有40个引脚,有5组端口,33个可编程的I/O引脚。
2.单片机为满足嵌入式应用要求不断地增强其控制功能与外围接口功能,因此国际上已将单片机也叫做MCU。
3.单片机由5大功能部件组成:
运算器、控制器、存储器、输入设备和输出设备。
4.运算器(ALU)--主要完成算术逻辑运算,
控制器--是向各个部件发出控制指令,以协调各部分工作,自动执行命令。
存储器—分为数据存储器(RAM)和程序存储器(ROM)。
RAM是存储临时数据或中间结果,ROM是存储程序和数表。
5.PIC单片机中控制器主要部件由时钟电路、复位电路、指令寄存器和程序(PC)计数器构成。
6.PIC16F877A的RA端口中,RA4引脚不能作为模拟量输入通道。
7.PIC16F877A的RB端口中具有电平变化中断的引脚是:
RB4~RB7四个引脚。
8.假设PIC单片机的系统振荡频率为4MHz,那么执行一条非转移类指令的真实时间应该是1
。
9.PIC单片机上电复位后,所有的I/O引脚都将被置成输入方式。
10.堆栈的操作原则是先进后出,后进先出。
11.在PIC单片机程序计数器PC中存放的内容是下一条将要执行的指令的地址。
12.时序电路涉及的3个基本概念是振荡周期、机器周期和指令周期。
13.振荡电路工作方式有XT(晶体管/陶瓷谐振器)、HS(高速晶体管/陶瓷谐振器)、LP(低功耗晶体管/陶瓷谐振器)和RC(阻容振荡器)4种基本类型。
14.PIC单片机端口驱动能力:
高电平输出允许20mA,而低电平输出允许25mA。
15.对于端口B,如果8个引脚都作为输入,则它的初始化程序是:
TRISB=0xFF;如果8个引脚都作为输出,则它的初始化程序是:
TRISB=0x00;
16.如果希望屏蔽输入数据的低四位,可采用与数据0xF0相“与”。
17.在单片机的存储器中,RAM是随机存储器,ROM是只读存储器
18.如果一台计算机所配置的存储器首地址为0000H,末地址为2FFFH,那么它的存储容量为12KB。
19.PIC单片机内置的AD转换器共有8个模拟输入通道,每一通道是10位ADC。
20.PIC单片机有3个定时器/计数器,分别是:
TMR0、TMR1和TMR2
21.在5个I/O端口中,PORTB具有可编程内部弱上拉电路,实际上若上拉电路就是I/O引脚通过一个10K的电阻接至高电平。
。
22在PIC16F87X单片机定时器中,唯有TMR2不可设置用于计数,但却可以用于定时。
23TMR1定时器的预分频比率,除了有:
1:
1和1:
2以外,还有1:
4和1:
8
24定时器/计数器TMR1模块的内部结构也分为4部分,即输入信号选择控制电路、预分频器、同步控制电路和累加计数寄存器。
25.如果包括预分频器功能,当单片机系统时钟频率为4MHz时,TMR0所能产生的最大定时时间为65536
。
26.逐次逼近型ADC是由采样保持电路、电压比较电路、逐次逼近寄存器、数/模转换器DAC和锁存器等部分组成。
27.PIC16F877A单片机的ADC转换器具有10位的分辩率。
28.键盘扫描程序是控制系统中一个很重要的监控扫描子程序,在节点接通和断开时为了防止错判,常调用一个10~20
的延时程序来防止抖动。
29.在RB端口内部引脚嵌入了可编程输入弱上拉电路功能模块。
30.在PIC16F877A单片机ADC转换模块中,配置有8个模拟量输入通道,分别由RA和RE两个端口中的引脚承担.
31.PIC16F877A单片机共有3个定时/计数器
32.TMR0的位宽度为8。
33.如果外接一个10位的A/D转换器,当输入模拟电压为5V时,该器件最小分辨率是4.88mV。
34.所谓“串行通信”是指将一个数据字按顺序逐位分时的传输方式。
35.PIC16F87X单片机配置的ADC模/数转换器,就其工作原理来说,主要采用逐次逼近工作方式。
36.当单片机进入中断服务程序后,为了保证下一次正确响应中断,必须完成的工作内容是清除中断标志位。
37.A/D转换器的3个主要的技术指标分别是转换时间和转换速率、分辨率和转换精度。
38.中断源向CPU提出的处理请求,称为中断申请。
39.实现中断处理功能的部件称为中断系统。
40.PIC单片机C语言编程环境是MATLAB调试环境和HI-TECH编译器。
二、pic语言基础部分
1.c语言程序是由函数构成的。
2.函数是c语言的基本理论。
3.一个c源程序是由一个主函数main()和若干个其他函数组成。
4.在一个c语言程序中,只能有一个主函数。
5.c语言程序的执行总是从main函数开始的。
6.c语言中的标识符只能由字母、数字和下划线组成,且第一个字符必须为字母或下划线。
7.程序有三种基本结构,分别是顺序结、分支(选择)结构、循环结构。
8.语言while(!
e);中的表达式(!
e)等价于e==0。
9.语言while(e);中的表达式(e)等价于e==1。
10.如果inta,b=528:
;那么a=b/10%10;的结果是2.
11.a+=b;等价于a=a+b;a%=b;等价于a=a%b;
12.a<<=2;等价于a=a<<2;a>>2,等价于a=a>>2;
13.若有说明:
inta[10];则在下面的四个选项中,对a数组元素的正确引用是a[6]。
A.a[10]B.a[6]C.a[5]D.a[4.5]
14.设有程序段
Voidmain()
{
Intk=10
While(k=0)k=k+1
}
则循环体语句一次也不执行。
15.表示图中坐标轴上阴影部分的正确表达式是(x>=a)&&(x<=b)
三、程序分析题
1.#include
main()
{inta[5]={1,5,2,4,3},i,j,t;
for(j=1;j<=4;j++)
for(i=0;i<=4-j;i++)
if(a[i]{t=a[i];a[i]=a[i+1];a[i+1]=t;}
for(i=0;i<5;i++)
printf("%d",a[i]);
}
这个程序实现什么功能?
并写出程序执行后的结果是多少?
重新排序数组。
54321
2.voidmain()
{
inta=50,b=10,c;
c=y(a,b);
printf(“yis%d\n”,c);
}
y(intx,inty)
{
intz;
z=(x>y)?
x:
y ;
return(z) ;
}
这个程序实现什么功能?
执行完程序后,c=?
比较大小并送出最大值。
yis50.c=50;
3.main()
{
inti;
for(i=1;i+1;i++)
{
if(i>4)
{
printf(“%d\n”,i);
break;
}
printf(“%d\n”,i++);
}
}
该程序运行后结果是多少?
135
4.int*Point1;
intDispBuf[5]={0x1001,0x1002,0x1003,0x1004,0x1005};
voidmain()
{inttmp;
unsignedchari;
Point1=&DispBuf[0];
for(i=0;i<=5;i++)
{tmp=*Point1;
Point1++;
}
}
执行完程序后,tmp=?
5.voidmain()
{intn;x=0;
for(n=1;n<=30;n++)
{
if(n%9!
=0)continue;
x++;
printf(“%d”,x);
}
}
该程序的功能是什么?
程序执行后,x的值是多少?
1到30中能够被9整除的数的个数。
X=3
6.voidmain()
{intx,y=0;x=1;
while(x<=15)
{y=y+x;x++;
}
printf(“%d”,y);
}
该程序执行的功能是什么?
程序执行后,y的值是多少?
1加到15的值送给Y,y=120
7.inta=1,b=3,c=5,d=4;
if(a
if(celse
if(aif(belsex=3;
elsex=6;
elsex=7;
执行完程序后,x的值是____2____。
8.voidmain()
{
inta=50,b=8,c=10,x;
if(a>b)
if(a>c)x=a;
else
x=c;
else
if(b>c)
x=b;
else
x=c;
printf(“xis%d\n”,x);
}
该程序完成什么样的功能?
执行程序后,x的值是多少?
三个数比较的最大值。
。
X=50
9、voidmain()
{inta,b;
int*Point1,*Point2;
init_comms();//初始化串行口
a=100;
b=10;
Point1=&a;//把变量a的地址赋给Point1
Point2=&b;//把变量b的地址赋给Point2
printf("%d,%d\n",a,b);
printf("%d,%d\n",*Point1,*Point2);
for(;;){}
}
该程序完成什么样的功能?
执行程序后,a、b、*Point1、*Point2的值是多少?
10、voidmain()
{floata;
a=fadd(12.3,334.5);
fun();
for(;;)
{;}
}
Voidfun()
{folata;
a=fadd(111.3,34.5);
}
floatfadd(floata,floatb)
{returna+b;
}
该程序的功能是什么?
程序执行后,main@a的值是多少?
11.intmax(uintValues[],uchari)
{uintMaxDat ;
MaxDat=Values[0] ;
for(i=1 ;i<10 ;i++)
if(MaxDatMaxDat=Values[i] ;
returnMaxDat ;
}
voidmain()
{uintMaxNum;
uintScore[10]={10,11,23,44,9,6,223,456,34,10};
MaxNum=max(Score,10);
for(;;)
{;}
}
该程序完成什么样的功能?
执行程序后,MaxNum的值是多少?
12、voidmain()
{inta,b;
int*Point1,*Point2;
init_comms();
a=100;
b=10;
Point1=&a;
Point2=&b;
printf("%d,%d\n",a,b);
printf("%d,%d\n",*Point1,*Point2);
for(;;){}
}
该程序完成什么样的功能?
执行程序后,x的值是多少?
四、编程题
1.根据下图编写程序:
每按下一次K0键时,LED灯的循环点亮方向与前一次相反(初始时的方向是由RC0---RC7循环点亮)。
要求:
①画出程序设计的流程图;
②用PICC语言编写相应的程序,并标出注释。
#include
#defineucharunsignedchar
#defineuintunsignedint
#definekeyRD0
voiddelay_1ms(void);
voiddelay_ms(unsignedinttime);
constuchartable[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
voidmain()
{inta,i=0;
TRISC=0x00;
PORTC=0xff;
if(key==0)
{i++;
if(i==2)a=0;
}
if(i==1)
{
for(a=0;a<8;a++)
{
PORTC=table[a];
delay_ms(1000);
}
}
if(key==1)
{
for(a=8;a>0;a--)
{
PORTC=table[a];
delay_ms(1000);
}
}
}
voiddelay_1ms(void)
{
unsignedintn;
for(n=0;n<50;n++)
{
NOP();
}
}
voiddelay_ms(unsignedinttime)
{
for(;time>0;time--)
{
delay_1ms();
}
}
2.利用取表的方法,使端口C连接的广告灯实现左移右移,点亮的顺序为:
RC0→RC1→RC2~→RC7→RC6→RC5~→RC0如此重复循环。
每一种状态延时的时间为100毫秒。
要求:
①画出程序设计的流程图;
②用C语言编写相应的程序,并标出注释。
#include
#defineucharunsignedchar
#defineuintunsignedint
voiddelay_1ms(void);
voiddelay_ms(unsignedinttime);
constuchartable[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f,0xbf,0xdf,0xef,0xf7,0xfb,
0xfd,0xfe};
voidmain()
{inti,j,a=0;
TRISC=0x00;
PORTC=0xff;
for(i=0;i<14;i++)
{
PORTC=table[i];
delay_ms(1000);
}
}
voiddelay_1ms(void)
{
unsignedintn;
for(n=0;n<50;n++)
{
NOP();
}
}
voiddelay_ms(unsignedinttime)
{
for(;time>0;time--)
{
delay_1ms();
}
}
3.编写程序,将PIC16F877A单片机的数据存储器(RAM)中地址从20H开始的32个地址单元的内容整体搬迁到40H开始的地址单元中。
要求:
①画出程序设计的流程图;
②用C语言编写相应的程序,并标出注释。
#include//包含单片机内部资源预定义
voiddelay(uintz)//延时子程序
{uintx,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
voidmain()
{TRISB=0x00;
int*p1[],*p2[];
intt[32];
*p1=0xff;
//*p2=21H;
for(inti=0;i<32;i++)
{
t[i]=p1[i];
p2[i]=t[i];
delay(1000);
PORTB=p2[i];
}
}
4.用PIC16F877A单片机的RC口控制1个共阴的LED数码管,要求循环显示字符0~9,显示字符间隔时间为100毫秒。
下面给出电路图和0~9的字型段码表。
0~9的字形码为:
0x3F、0x06、0x5B、0x4F、0x66、0x6D、0x7D、0x07、0x7F、0x6F
#include//包含单片机内部资源预定义
uchartable[10]=
{
0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F
};
voiddelay_1ms(void)
{
unsignedintn;
for(n=0;n<50;n++)
{
NOP();
}
}
voiddelay_ms(unsignedinttime)
{
for(;time>0;time--)
{
delay_1ms();
}
}
voidmain()
{
TRISC=0x00;
while
(1)
{intm;
for(m=0;m<10;m++)
{PORTC=table[m];
delay_ms(100);
}
}
}
5.用C语言编写程序,求1~50的累加和。
#include//包含单片机内部资源预定义
voidmain()
{intx,y=0;x=1;
//TRISD=0x00;
while(x<=50)
{y=y+x;x++;
}
printf(“%d”,y);
//PORTD=y;
}
6.将变量a、b、c中预先存放的三个数做比较,将其中最大者找出并存入max变量中,同时将最大的数传送到PIC单片机的C端口上。
#include//包含单片机内部资源预定义
voidmain()
{
TRISC=0x00;
inta=50,b=8,c=10,max;
if(a>b)
if(a>c)max=a;
else
max=c;
else
if(b>c)
max=b;
else
max=c;
PORTC=max;
}
7.用端口C驱动一组八位发光二极管,使它产生(八位同时)亮→灭→亮→灭。
。
。
。
。
,如此重复循环,亮灭时间间隔为100毫秒。
#include//包含单片机内部资源预定义
voiddelay_1ms(void)
{
unsignedintn;
for(n=0;n<50;n++)
{
NOP();
}
}
voiddelay_ms(unsignedinttime)
{
for(;time>0;time--)
{
delay_1ms();
}
}
voidmain(void)
{
TRISC=0x00;//D口定义为输出
while
(1)
{
PORTC=0xff;//灯全亮,延时
delay_ms(100);
PORTC=0x00;//灯全灭,延时
delay_ms(100);
}
}