一、判断题
(×) 1.单片机C语言程序不区分大小写。
(√)2.ARR是定时器预分频寄存器。
(×)3.一个IAR工程可以包含多个main()函数。
(√) 4.一个IAR工程可以包含多个C程序源文件。
(×) 5.要清零单片机I/0口的某一位, 通常用“I”运算。(&)
(√) 6.单片机C语言程序区分大小写。
(×)7.中断服务函数需要单独声明。(系统函数已经声明)
(√) 8.一个IAR工程只能有一个main0函数。
(×) 9.一个IAR工程只能有一个C程序源文件。
(√) 10.要置位单片机I/0口的某一位,通常用“&”运算。
(×)11中断服务函数需要单独申明。
(√) 12.共阳极数码管的公共端通常接高电平。(共阴极接低电平)
(√) 13. STM8系列单片机通常采用SWIM接口下载程序。
(√) 14. STM8系列单片机内部具有上电复位电路。
(√)15.IDR寄存器用于读取端口状态。(只读端口)
(√)16.中断服务函数返回类型只能为void.(中断函数不能传入形参也不能传回数值)
(×) 17.共阴极数码管的公共端通常接高电平。
(√) 18. STM8S单片机的申口是全双工的。(51是半双工stm8可以异步通讯是全双工)
(√) 19. ODR寄存器用于控制端口输出状态。(最开始的推免模式控制端口)
(√) 20. STM8系列单片机具有内部RC时钟,在使用时可以不接外部晶振。(外接晶振可以调整精度,rc时钟抗干扰能力强)
二、选择题
1.单片机的CPU主要由__A_组成。
A、运算器、控制器
B、加法器、寄存器
C、运算器、加法器
D、运算器、译码器
2.程序是以__C__形式存放在程序存储器中的。
A、C语言源程序
B、汇编程序
C、二进制编码
D、BCD码
A、串行
B、并行
A、8
B、12
C、16
D、110592
5.数码管_A显示方式占用l/0端口线较多,但编程较简单,适用于显示位数较少的场合。
A、静态
B、动态
C、静态和动态
D、查询
6.单片机程序中的变量一般存放在__B__中
。
A、ROM
B.、RAM
C、EEPROM
7.设计一个2位八段数据管的动态显示电路,需要__C__个 I/0。
A、4
B、8
C、10
D、16
A、4
B、8
C、9
D、6
9.串口发送数据端口名称通常为_C_
A、TI
B、TXD
C、RXD
D、SDA
A、转换位数
B、转换时间
C、转换方式
D、读取方式
11.计数器当前值寄存器为__A__。(具体参考TIM1中代码ARR作用)
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、查询
14.C程序总是从__A__ 开始执行的。
A、主函数
B、主程序
C、子程序
D、主过程
15.定时器自动重装载寄存器名称为_A_
A、ARR
B、CNTR
C、CCR
D、PSCR
A、8位
B、16位
C、12位
D、20位
17.设计一个4位八段数据管的动态显示电路,需要__C__个 I/0。(参考M7SEG)
A、4
B、8
C、12
D、32
A、4
B.、8
C、12
D,16
19.源程序编译链接后生成可下载文件的扩展名通常是_A_(51里面是生成hex)
A.、hex
B、c
C、h
D、s
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–;
}
}