期末单片机复习题及答案(答案不保证全部正确95分)

时间:2024-10-30 08:33:57

❤️作者主页:凉开水白菜
❤️作者简介:共同学习,互相监督,热于分享,多加讨论,一起进步
❤️点赞 ???? 收藏 ⭐再看,养成习惯

订阅的粉丝可通过PC端文末加我微信,可对文章的内容进行一对一答疑!


文章目录

  • 一、判断题
  • 二、选择题
  • 三、简答题
  • 四、设计题
  • 五、代码段
    • 结尾

PS:出来工作一段时间了,回想最近有些小伙伴的评论指出问题所在索性重新回顾了一遍大学的题,做了一些修改,但可能还是存在一些问题(看的不仔细或者说和书本有冲突),欢迎各位继续指正,如果有更多题目也可以联系我添加,就当是一个汇总后续的小伙伴可以跟着文章进行学习或者是复习,再次感谢评论区的小伙伴做出的错误指正。

一、判断题

(×) 1.单片机C语言程序不区分大小写。

(x)是定时器预分频寄存器。(预分频psc,arr是重装载或者说就是一个溢出值上限)

(×)3.一个IAR工程可以包含多个main()函数。

(√) 4.一个IAR工程可以包含多个C程序源文件。

(×) 5.要清零单片机I/0口的某一位, 通常用“I”运算。(&运算)

(√) 6.单片机C语言程序区分大小写。

(×)7.中断服务函数需要单独声明。(系统函数已经声明)

(√) 8.一个IAR工程只能有一个main()函数。

(×) 9.一个IAR工程只能有一个C程序源文件。

(√) 10.要置位单片机I/0口的某一位,通常用“&”运算。

(×)11中断服务函数需要单独申明。.s文件中存在中断向量表,在头文件中存中断号配置)

(√) 12.共阳极数码管的公共端通常接高电平。(共阴极接低电平)

(√) 13. STM8系列单片机通常采用SWIM接口下载程序。(且不能通过keil开发只能使用iar进行开发)

(√) 14. STM8系列单片机内部具有上电复位电路。

(√)寄存器用于读取端口状态。(只读端口)

(√)16.中断服务函数返回类型只能为void.(中断函数不能传入形参也不能传回数值)

(×) 17.共阴极数码管的公共端通常接高电平。

(√) 18. STM8S单片机的申口是全双工的。(理论上串口通信都属于全双工通信rx和tx两根先互不影响,但如果串口需要走差分信号例如rs485就变成了半双工通信,只能单向发送和接收)

(√) 19. ODR寄存器用于控制端口输出状态。(最开始的推免模式控制端口)

(√) 20. STM8系列单片机具有内部RC时钟,在使用时可以不接外部晶振。(外接晶振可以调整精度,rc时钟抗干扰能力强)

二、选择题

1.单片机的CPU主要由__A_组成。

A、运算器、控制器

B、加法器、寄存器

C、运算器、加法器

D、运算器、译码器

2.程序是以__C__形式存放在程序存储器中的。

A、C语言源程序

B、汇编程序

C、二进制编码

D、BCD码

  1. I2C总线属于__A_通信。

A、串行

B、并行

  1. STM8S207内部高速RC振荡器的频率为__C___ MHz。

A、8

B、12

C、16

D、110592

5.数码管_A_显示方式占用l/0端口线较多,但编程较简单,适用于显示位数较少的场合。

A、静态

B、动态

C、静态和动态

D、查询

6.单片机程序中的变量一般存放在__B__中。

A、ROM // 存在掉电保存

B.、RAM // 运行完后自动销毁

C、EEPROM // 外部flash 一般为at24cxx系列

7.设计一个2位八段数据管的动态显示电路,需要__C__个 I/0。

A、4

B、8

C、10

D、16

  1. 3X3矩阵键盘和单片机直接连接时,需要__D__个I/0。

A、4

B、8

C、9

D、6

9.串口发送数据端口名称通常为_C_

A、TI

B、TXD,发送英文:transmit

C、RXD,接受英文:receive

D、SDA

  1. AD转换的分辨率由__A__决定。

A、转换位数

B、转换时间

C、转换方式

D、读取方式

11.计数器当前值寄存器为__B__。

A、ARR :定时器重装载寄存器

B、CNTR : 定时器当前值寄存器

C、CCR::控制寄存器

D、PSCR:定时器分频寄存器

12.控制端口方向的寄存器为__C__(idr只读,odr控制端口输出状态,ddr控制方向)

A、IDR

B、ODR

C、DDR

13.在单片机应用系统中,数码管显示电路通常有__C__显示方式。(目前所学就静态和动态)

A、静态

B、动态

C、静态和动态

D、查询

程序总是从__A__ 开始执行的。

A、主函数(main函数)

B、主程序

C、子程序

D、主过程

15.定时器自动重装载寄存器名称为_A_

A、ARR :重装载

B、CNTR:当前值

C、CCR:控制

D、PSCR:预分频

  1. STM8系列单片机的定时器1为__B__位。

A、8位

B、16位

C、12位

D、20位

17.设计一个4位八段数据管的动态显示电路,需要__C__个 I/0。(参考M7SEG)

A、4

B、8

C、12

D、32

  1. 4X4矩阵键盘和单片机直接连接时,需要__B___个 I/0。(参考4×4键盘)

A、4

B.、8

C、12

D,16

19.源程序编译链接后生成可下载文件的扩展名通常是_A_(51里面是生成hex)

A.、hex

B、c

C、h

D、s

  1. STM8S207系列单片机内部AD转换为__B__位。

A、8

B、10

C.、12

D、16

三、简答题

STM8S单片机RST引脚是高电平复位还是低电平复位?请设计RC复位电路。

低电平复位

2.什么是拉电流?什么是灌电流?

拉电流就是输出电流;灌电流就是吸收电流

定时器的定时模式和计数模式有什么区别?

定时模式是用cpu的运行时钟进行计数,计数模式是用外部引脚上的脉冲计数。

4.什么是半双工通信模式?

①半双工数据传输允许数据在两个方向上传输,但是,在某一时刻,只允许数据在一个方向上传输,它实际上是一种切换方向的单工通讯;在同一时间只可以有一方接受或发送信息,可以实现双向通信。具体请看下面的题目

5.什么是下拉电阻?下拉电阻有什么作用? .

将不确定的信号通过一个电阻钳位在低电平:

1、提高电压准位。2、加大输出引脚的驱动能力。 3、防静电、防干扰。

4、电阻匹配,抑制反射波干扰。5、预设空间状态/缺省电位。

6、提高芯片输入信号的噪声容限。

6.请简述中断响应过程。

中断处理、中断判优、中断响应、中断处理和中断返回。

7.请列出STM8S单片机1/0口的4种输入模式

开漏输出、推挽输出、浮动输入、带上拉输入(暂时收集到输入输出共四种)

修正:悬浮输入、上拉输入、中断悬浮输入、中断上拉输入

8.什么是上拉电阻?上拉电阻有什么作用?

上拉就是将不确定的信号通过一个电阻钳位在高电平,电阻同时起限流作用。

1、提高输出高电平的值2、为增强输出引脚的驱动能力

3、防静电、防干扰。4、电阻匹配,抑制反射波干扰

9.什么是全双工通信模式

②全双工数据通信允许数据同时在两个方向上传输,因此,全双工通信是两个单工通讯方式的结合,它要求发送设备和接收设备都有独立的接收和发送能力;在同一时间可以同时接受和发送信息,实现双向通信。具体请看下面的题目

10.请画出2位八段共阳极数码管的内部组成图,标注引脚名称,不用标注引脚编号。

共阴极的话把led反过来接

11.什么是键盘抖动?如何消除?

按键按下时或按键弹起时,接触片会抖动,导致按键通断很多次,解决方法就是按键按下过后检测按键是否弹起,弹起过后再读取该值。

12.什么是中断向量?

中断向量是指早期的微机系统中将由硬件产生的中断标识码,中断源的识别标志,可用来形成相应的中断服务程序的入口地址或存放中断服务程序的首地址。

13.同步通信和异步通信各自的优缺点是什么?

同步通信:面向比特的传输,每个信息帧中包含若干个字符,要求接收时钟和发送时钟同频同相,通过特定的时钟线路协调时序,数据流发送端发送连续的比特流

异步通信:面向字符的传输,每个字符帧只包含一个字,不要求接收时钟和发送时钟完全同步,对时序的要求较低,数据流发送端发送完一个字节后,可经过任意长的时间间隔再发送。

14.单片机定时器的定时模式和计数模式有什么区别

定时器是以内部时钟作为基准来工作的,计数器是以外部脉冲输入来计数的。

定时方式实际是用cpu的运行时钟进行计数,计数方式是用外部引脚上的脉冲计数。

15.什么是半双工通信?什么是全双工通信

①半双工数据传输允许数据在两个方向上传输,但是,在某一时刻,只允许数据在一个方向上传输,它实际上是一种切换方向的单工通讯;在同一时间只可以有一方接受或发送信息,可以实现双向通信。

②全双工数据通信允许数据同时在两个方向上传输,因此,全双工通信是两个单工通讯方式的结合,它要求发送设备和接收设备都有独立的接收和发送能力;在同一时间可以同时接受和发送信息,实现双向通信。

16.什么是单片机应用系统?

就是将单片机技术应用在电子、工业控制领域的各种典型产品

17.软件定时和硬件定时的原理有什么异同?

软件定时:是利用指令执行的时间从而来达到定时的目的,一般是利用循环执行一段指令,来定时一段比较长的时间。

优点:不需占用硬件资源,编程简单。缺点:占用cpu的时间,cpu利用率低。长时间的软件定时会让系统的实时性非常的差。适用场合:微妙级的短时间延时,系统实时性要求不高和硬件资源紧张的场合。

硬件定时:利用定时器来计算时间。

优点:定时准确,不占cpu,系统响应速度快。缺点:占用硬件资源。

四、设计题

1.设计数码管显示电路和程序。

(1)设计4位共阳极数码管显示电路。l/0 分配:数码管的段选从a~dp依次接入***,位选从左到右依次接入***,**为个位。

参考后面代码(数码管复习代码)

(2)电路图应标出引脚名称、元件编号及元件参数。

(3)编写数码管动态显示函数M7SEG.
Displaynt): (每空2分,共16分)

在该函数内部执行一次完整的数码管显示驱动,会计算段码。

参考后面代码(按键复习代码)

2.设计4X4矩阵键盘接口电路和程序。

(1)画出单片机的电源电路、复位电路和矩阵键盘电路。

(2) 1/0分配:矩阵键盘行03对应**,列03对应**.

电路图应标出引脚名称、元件编号及元件参数。

(3)编写矩陈键盘扫描函数KEY4X4.
Scan (void)。

矩阵键盘扫描函数,有按键按下返回键值0~15,无按下返回0xFF.

参考后面代码(流水灯复习代码)

3.设计8位流水灯控制电路和程序。

(1)画出外部复位电路和LED驱动电路,流水灯DO~D7依次接入***。.

(2)电路图应标出引脚名称、元件编号及元件参数。

(3)编写流水灯控制任务函数,进入该函数后,执行流水灯任务。例: D7到D4点亮15,然后从D7到DO依次循环点亮,首次点亮D7,每次点亮1只,每只点亮时间为0.5S。

参考后面代码

五、代码段

数码管复习程序:

//端口定义

#define M7SEG_PORT      GPIOB->ODR

#define M7SEG_PORT_INIT
GPIOB

#define M7SEG_BIT1
GPIOA->ODRR.bit4

#define M7SEG_BIT2 GPIOA->ODRR.bit5

#define M7SEG_BIT3
GPIOA->ODRR.bit6

#define M7SEG_BIT4
GPIOD->ODRR.bit7

#define M7SEG_BIT1_PORT
GPIOA

#define
M7SEG_BIT1_PIN  GPIO_PIN_4

#define M7SEG_BIT2_PORT
GPIOA

#define
M7SEG_BIT2_PIN  GPIO_PIN_5

#define M7SEG_BIT3_PORT
GPIOA

#define
M7SEG_BIT3_PIN  GPIO_PIN_6

#define M7SEG_BIT4_PORT
GPIOD

#define
M7SEG_BIT4_PIN  GPIO_PIN_7

//调用程序

unsigned char
TAB_CA[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,

                       
0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E,0xFF};

void M7SEG_Seg_Init(void)

{

  GPIO_Init(M7SEG_PORT_INIT, GPIO_PIN_ALL,
GPIO_MODE_OUT_PP_LOW_FAST);

}

void M7SEG_Bit_Init(void)

{

GPIO_Init(M7SEG_BIT1_PORT,
M7SEG_BIT1_PIN, GPIO_MODE_OUT_PP_HIGH_FAST);

GPIO_Init(M7SEG_BIT2_PORT,
M7SEG_BIT2_PIN, GPIO_MODE_OUT_PP_HIGH_FAST);

GPIO_Init(M7SEG_BIT3_PORT,
M7SEG_BIT3_PIN, GPIO_MODE_OUT_PP_HIGH_FAST);

GPIO_Init(M7SEG_BIT4_PORT,
M7SEG_BIT4_PIN, GPIO_MODE_OUT_PP_HIGH_FAST);

}

void M7SEG_Init (void)

{

  M7SEG_Seg_Init(); //段选初始化

  M7SEG_Bit_Init(); //位选初始化

}

void
M7SEG_DisplayInt(void)

{

 unsigned int num;

 unsigned char temp[4];

 u16 k;

 num = numInt;

 temp[0] = (unsigned char)(num%10);

 temp[1] = (unsigned char)((num/10)%10);

 temp[2] = (unsigned char)((num/100)%10);

 temp[3] = (unsigned char)((num/1000)%10);

 k = 2;

   //千位

  M7SEG_PORT = TAB_CA[temp[3]]; //送段码

  M7SEG_BIT1 = 0; //打开位选,开始显示该位数据

  delay_ms(k);//延时,控制显示时间和刷新时间

  M7SEG_BIT1 = 1; //关闭位选,结束显示该位数据

  //百位

  M7SEG_PORT = TAB_CA[temp[2]];

  M7SEG_BIT2 = 0;

  delay_ms(k);

  M7SEG_BIT2 = 1;

  //十位

  M7SEG_PORT = TAB_CA[temp[1]];

  M7SEG_BIT3 = 0;

  delay_ms(k);

  M7SEG_BIT3 = 1;

  //个位

  M7SEG_PORT = TAB_CA[temp[0]];

  M7SEG_BIT4 = 0;

  delay_ms(k) ;

  M7SEG_BIT4 = 1;   

}

//按键程序复习

//端口定义

#define
KEY4X4_H0_PORT  GPIOD

#define KEY4X4_H0_PIN   GPIO_PIN_4

#define
KEY4X4_H1_PORT  GPIOD

#define
KEY4X4_H1_PIN   GPIO_PIN_3

#define
KEY4X4_H2_PORT  GPIOD

#define
KEY4X4_H2_PIN   GPIO_PIN_2

#define
KEY4X4_H3_PORT  GPIOD

#define
KEY4X4_H3_PIN   GPIO_PIN_0

#define
KEY4X4_L0_PORT  GPIOE

#define
KEY4X4_L0_PIN   GPIO_PIN_0

#define
KEY4X4_L1_PORT  GPIOE

#define
KEY4X4_L1_PIN   GPIO_PIN_1

#define
KEY4X4_L2_PORT  GPIOE

#define
KEY4X4_L2_PIN   GPIO_PIN_2

#define
KEY4X4_L3_PORT  GPIOE

#define
KEY4X4_L3_PIN   GPIO_PIN_5

#define
KEY4X4_NOPRESS  0XFF//没有按键按下的时候返回的值(重点)

//调用程序

void KEY4X4_Init(void)

{

  //行线推挽输出

 
GPIO_Init(KEY4X4_H0_PORT,KEY4X4_H0_PIN,GPIO_MODE_OUT_PP_LOW_FAST);

 
GPIO_Init(KEY4X4_H1_PORT,KEY4X4_H1_PIN,GPIO_MODE_OUT_PP_LOW_FAST);

 
GPIO_Init(KEY4X4_H2_PORT,KEY4X4_H2_PIN,GPIO_MODE_OUT_PP_LOW_FAST);

 
GPIO_Init(KEY4X4_H3_PORT,KEY4X4_H3_PIN,GPIO_MODE_OUT_PP_LOW_FAST);

  //列线上拉输入

  GPIO_Init(KEY4X4_L0_PORT,KEY4X4_L0_PIN,
GPIO_MODE_IN_PU_NO_IT);

  GPIO_Init(KEY4X4_L1_PORT,KEY4X4_L1_PIN,
GPIO_MODE_IN_PU_NO_IT);

  GPIO_Init(KEY4X4_L2_PORT,KEY4X4_L2_PIN,
GPIO_MODE_IN_PU_NO_IT);

  GPIO_Init(KEY4X4_L3_PORT,KEY4X4_L3_PIN,
GPIO_MODE_IN_PU_NO_IT);

}

u8 KEY4X4_Scan(void)

{

  u8 i, key;

  key = KEY4X4_NOPRESS;

  for(i=0;i<4;i++)

  {

    //行线输出低电平

    KEY4X4_H0 = 1;

    KEY4X4_H1 = 1;

    KEY4X4_H2 = 1;

    KEY4X4_H3 = 1;

  switch(i)

  {

    case 0: KEY4X4_H0 = 0; break; //第0行输出低电平

    case 1: KEY4X4_H1 = 0; break; //第1行输出低电平

    case 2: KEY4X4_H2 = 0; break; //第2行输出低电平

    case 3: KEY4X4_H3 = 0; break; //第3行输出低电平

    default: break;

  }

  //读取列线状态

  if(KEY4X4_L0 == 0)            //第0列按下,读回低电平

    key = (i<<2) + 0;

  else if (KEY4X4_L1 == 0)      //第1列按下,读回低电平

    key = (i<<2) + 1;

  else if (KEY4X4_L2 == 0)      //第2列按下,读回低电平

    key = (i<<2) + 2;

  else if (KEY4X4_L3 == 0)      //第3列按下,读回低电平

    key = (i<<2) + 3;

   }

  return key; //返回键值

}

流水灯复习程序:

//端口定义

#define LED_PORT    GPIOB

#define LED_ODR     GPIOB->ODR

//实现库函数中操作单个输出端口

#define LED0            GPIOB->ODRR.bit0

#define LED1            GPIOB->ODRR.bit1

#define LED2            GPIOB->ODRR.bit2

#define LED3            GPIOB->ODRR.bit3

#define LED4            GPIOB->ODRR.bit4

#define LED5            GPIOB->ODRR.bit5

#define LED6            GPIOB->ODRR.bit6

#define LED7            GPIOB->ODRR.bit7

//调用程序(流水灯)

void LED_Task_D7toD0_S1_m1(void)

{

    u8 i,k;

    LED_Init();

    while(1)

{

//这个地方的0x80二进制为10000000依次位移一位就产生了一个个亮延时500ms一次

      k=0x80;

      for(i=0;i<8;i++)

      {

        LED_ODR =~ k;

        delay_ms(500) ;

        k = k>>1;

      }

     }

}

//延时程序:这个没什么好记得记住2286就对了。

void delay_ms (unsigned
int num)

{

  unsigned int i;

  while(num>0)

  {

   
for(i=2286;i>0;i–);

    num–;

  }

}

结尾

我是凉开水白菜,我们下文见~