说明
- 以下内容为个人整理,答案也是个人回答,不一定对,所以你对答案有任何问题,都欢迎与我讨论。
Q01:51单片机P0、P1、P2、P3口功能作用?
答:
- P0可做地址口的低8位也可以做数据口和I/O口
- P1可做普通的I/O口
- P2除了做I/O口,也是作为地址口的高8位(总共16位)
- P3 既可以是普通IO口,也可以是外部中断、定时、外部输入的端口
Q02:当串口发送一个数据或接收数据时,哪两个位会置位?
答:
- 接收数据时,
RI
会置位 - 发送数据时,
TI
会置位
Q03:51单片机的累加器是什么?
答:
ACC
Q04:当晶振频率为12MHz,定时器的频率为多少?
答:
频率为1Mhz
说明:
机器频率 = 晶振频率/12
Q05:LED的显示分为几种?
答:
两种,动态扫描和静态扫描
说明:
动态扫描中LED的调度是放在定时器中
Q06:51单片机内存划分
答:
低128个字节
- 从
00H~1FH
(32字节):寄存器区,四组寄存器区,一组有8个寄存器 - 从
20H~2FH
(16字节 128位):位寻址区 - 剩下:普通内存
高128个字节
- 特殊功能寄存器
Q07:ex0、ex1、et0的含义
答:
ex0 = 1; //允许外部中断0
ex1 = 1; //允许外部中断1
et0 = 1; //允许定时器0中断
说明:
上图为IE
(中断允许寄存器)
EA
:中断总控制位EA=1
:CPU开放所有中断EA=0
:CPU禁止所有中断
ES
:串行口中断控制位。ES=1
:允许串行口中断ES=0
:屏蔽串行口中断
ET1
:定时/计数器T1中断控制位ET1=1
:允许T1中断ET1=0
:禁止T1中断
EX1
:外部中断1中断控制位EX1=1
:允许外部中断1中断EX1=0
:禁止外部中断1中断
ET0
:定时/计数器T0中断控制位ET0=1
:允许T0中断ET0=0
:禁止T0中断。
EX0
:外部中断0中断控制位EX0=1
:允许外部中断0中断EX0=0
:禁止外部中断0断。
Q08:程序存储器的作用?
答:
程序存储器存放的是程序代码,也可以存放常量数据
Q09:波特率的概念?
答:
单片机或计算机在串口通信时的速率。指的是信号被调制以后在单位时间内的变化,即单位时间内载波参数变化的次数,如数据传送速率为240b/s,而每个字符格式包含10位(1个起始位,1个停止位,8个有效数据位),这时的波特率为240 baud (波特),比特率(有效数据位的传送速率)为240*10=2400 bps(比特每秒)
说明:
波特率是指每秒中传输的字节数——(错)
Q10:堆栈和队列的特点?
答:
堆栈是先进后出
队列是先进先出
Q11:自然优先级与优先级判断,场景如下
场景1:优先级相同的三个同学A,B,C同时需要打饭,谁先打饭?
场景2:同学A正在打饭,与同学A相同优先级但是自然优先级比同学A高的同学B是否能打断同学A的打饭?
场景3:同学A正在打饭,比同学A优先级更高的同学B能否打断同学A的打饭?
答:
场景1:自然优先级高的先打饭 ( O(∩_∩)O哈哈~,没在纠结ABC吧)
场景2:不能
场景3:可以喔
说明:
高优先级可以打断低优先级
自然优先级只有在相同优先级之间比较才有意义
Q12:51单片机哪个寄存器是不能直接操作,不可寻址?
答:
pc(程序计数器)
Q13:在读取外部电平时,需要做什么?
答:
首先要做的是写入1(高电平),然后再读
Q14:通信方式有哪些?
答:
单工、半双工、全双工
Q15:编译的目的是什么?
答:
获取二进制代码文件
Q16:若要打开全局中断,需要操作哪个位?
答:
EA
Q17:假如现在有一个3字节的程序程序正在执行0x100
,中断来时,保存的地址是多少?
答:
保存的地址是下一条指令的地址 0x101
Q18:51单片机是几位机?
答:
51单片机是8位的
说明:
arm是32位的
Q19:51单片机的8位模式和16位模式下定时器最大定时时间?
答:
在晶振频率为12MHz前提下:
- 8位模式下的情况:28 * 1us = 256us
- 16位模式下的情况:216 * 1us = 65536us
说明
机器频率 = 晶振频率 / 12
机器周期(脉冲周期) = 1/机器频率
Q20:状态寄存器
答:
程序状态字寄存器PSW(program status word)是计算机运算器的一部分
PSW用来存放两类信息
- 一类是体现当前指令执行结果的各种状态信息,如有无进位(CY位),有无溢出(OV位)等
- 另一类是存放控制信息,如允许中断(IF位),跟踪标志(TF位)等
Q21:51单片机掉电不失的是哪个段?
答:
@code
说明:
一共有五段:CODE
,BIT
,IDATA
,DATA
,XDATA
Q22:51单片机五个中断入口地址是哪个?
答:
0003H
:外中断0000BH
:定时器00013H
:外中断1001BH
:定时器10023H
:串口中断入口
说明:
前三个字节是复位
Q23:如何选中四个寄存器组中的某一组?
答:
依靠RS1
和RS0
这两位
Q24:当P0口作为IO口时上面那个模式管关闭,只剩下下面那个模式管,那么怎么输出1(高电平)?
答:
外接上拉电阻,否则无法稳定输出1
Q25:晶振频率为6MHz,周期为多少?
答:
2us
说明
机器频率 = 晶振频率/12
机器周期 = 1/机器频率
Q26:三种总线是什么?
答:
- 地址总线
- 数据总线
- 控制总线
Q27:如何设置单片机优先级的寄存器?
答:
IP
(Interrupt Priority),将相应的位 置1
说明
上图为中断优先级寄存器IP
的控制位
PS
:串行口 中断优先级控制位PT1
:定时器/计数器T1 中断优先级控制位PX1
:外部中断1 中断优先级控制位PT0
:定时器/计数器T0 中断优先级控制位PX0
:外部中断0 中断优先级控制位
Q28:计算机能直接识别的语言是什么?
答:
二进制语言(机器语言)
Q29:什么是振荡周期、机器周期、指令周期?
答:
振荡周期
- 也称为时钟周期,是指单片机提供时钟信号的振荡源的周期,一般实验板上为11.0592MHZ,12MHZ和24MHZ用的也比较多
- 是计算机中最基本的、最小的时间单位
机器周期
- 一个机器周期包含6个状态周期S1~S6,也就是12个时钟周期
- 在一个机器周期内,CPU可以完成一个独立的操作
指令周期
- 它是指CPU完成一条操作的所需的全部时间
- 包括取指令、分析指令和执行指令所需的全部时间
- 每条指令执行时间都是有一个或几个机器周期组成,单片机中有单周期指令、双周期指令和四周期指令
说明
三者之间的关系:一条指令周期包括若干个机器周期,一条机器周期又包括若干个时钟周期
Q30:什么是中断?
答:
中断是指中央处理器CPU正在执行程序,处理某件事情的时候,外部发生了某一事件,请求CPU马上处理,CPU暂时中断当前的工作,转入处理所发生的事件,处理完以后,再返回到原来被中断的地方,继续原来的工作。
说明:
Q31:中断系统的概念和作用?
答:
实现中断功能的部件称为中断系统
作用:
- 完成实时性的要求
- 实现中断及返回
- 保护现场和恢复现场
说明:
上图为中断系统的结构,由图可知,中断源分为三类:外部中断、定时器中断和串行口中断
Q32:51单片机分了很多段,每一段的含义?
答:
-
CODE
段- 用来保存程序中汇编助记符描述的机器指令部件
- STC单片机中的程序Flash存储空间
- 可以由
MOVE
指令,并且通过DPTR
寄存器进行访问
-
BIT
段- 用来保存比特位
- 可以通过指令系统中的位操作指令来访问(注:可以通过位操作指令访问特殊功能寄存器
SFR
)
-
IDATA
段- 可以定义少量的变量,这些变量将最终保存在STC单片机的片内RAM的高地址和低地址区域中
IDATA
的低128个字节和DATA
段重叠- 可以通过寄存器
R0
或R1
,间接寻址保存在IDATA
段中的变量
-
DATA
段- 该段指向STC单片机内部数据RAM的低128个字节
- 通过直接和间接寻址方式,程序代码可以访问在
DATA
段中的变量 - 地址空间为
00H~7FH
-
XDATA
段- 该段指向扩展RAM区域
- 通过寄存器
DPTR
和MOVX
指令,程序代码可以访问XDATA
段 - 对于一个单页的
XDATA
存储空间来说,可通过寄存器R0
和R1
访问
Q33:定时器/计数器有几种工作模式及其含义?
答:
四种
M1=0; M0=0
- 模式0
- 特点:13位定时器
M1=0; M0=1
- 模式1
- 特点:16位定时器
M1=1; M0=0
- 模式2
- 特点:8位 可重加载定时器
M1=1; M0=1
- 模式3
- 特点:两个单独8位定时器
Q34:使用51单片机设计(DIY)
答:
可以使用51单片机设计一个宿舍门闸的程序,将51单片机连接一个正反转可控的步进电机,将其连接到P0.0
端口,然后在连接一个按钮连接在P3.0
端口,然后写程序,当按钮按下时,产生一个中断信号,在中断信号中步进电机正转,进过一段时间延时后,再反转回来。
说明
可以参看以下文章:
- 用汇编程序控制八盏灯亮灭
- 温室监控系统仿真设计
- 数码管显示的GP2D12仿真测距警报器
- 温度控制直流电机转速
- 正反转可控的步进电机
- 1-Wire总线温度传感器DS18B20应用测试
- ADC0809模数转换与显示
- ADC0832模数转换和LCD显示
- 1602字符液晶显示
上述代码位置:https://github.com/duganlx/DSP
Q35:51单片机的CPU由哪几部分?
答:
两部分,运算器和控制器
Q36:程序运行子程序和中断时,首先需要干啥?
答:
保护和恢复现场
Q37:51单片机存储器组成?
答:
程序存储器
- 内部程序存储器
- 外部程序存储器
RAM
- 内部RAM
- 外部RAM
Q38:51单片机如何复位?
答:
单片机复位有两种:
- 上电复位
- 单片机在接通电源后,会复位一次
- 硬件复位
- 通过
reset
引脚产生的复位
- 通过
- 软件复位
- 让程序再次从
0000H
开始执行 - 方式:看门狗时间溢出、内部程序陷阱
- 让程序再次从
Q39:键盘扫描有哪几种方式?
答:
- 逐行扫描
- 电平翻转
Q40:汇编程序有哪几种结构?
答:
- 顺序程序结构
- 分支或选择程序结构
- 循环程序结构
- 子程序
Q41:I^2C总线有几根线?
答:
两根:
- 数据线
- 时钟线
Q42:单片机是否晶振频率越高越好?
答:
不是,超频有可能会烧坏芯片
Q43:51单片机的复位是低电平还是高电平?
答:
高电平
Q44:18b20的特点是什么?
答:
单总线
说明:
相关参考文章:1-Wire总线温度传感器DS18B20应用测试
Q45:P0
口的地址是?
答:
P0
口的地址是0x80
,它的每个位是0x80~0x87
共八位
说明
带位地址操作的寄存器只有以0或8结尾的才行
Q46:数码管中,哪种显示亮度高?
答:
静态显示
Q47:外部中断0和外部中断1在哪个端口上?
答:
P3
口
Q48:去抖动的时间是多少?
答:
10ms这个量级(10ms、20ms、30ms 都可以的)
Q49:设计一个八个数码管显示,需要多少根I/O线?
答:
共16根
- 数据线 8根
- 控制线 8根
Q50:八段数码管显示原理?
答:
假设是共阳极的数码管,数码管是由八个二极管组成,当有电流流过时,相应的二极管就会点亮
Q51:51单片机的两个定时器都是加法计数器吗?
答:
对,都是加法计数器,不能做减法
Q52:138芯片是指什么?
答:
三八译码器,输入三根线,输出八根线
Q53:12位地址总线内存容量为多少?
答:
4K (212)
Q54:51单片机运行时,指令的地址存放在哪里?
答:
pc
:程序计数器
Q55:实验中 I^2C总线中停止信号如何设置?
答:
/*******************************************************************************
* 函数名 : I2cStop()
* 函数功能 : 终止信号:在SCL时钟信号高电平期间SDA信号产生一个上升沿
* 输入 : 无
* 输出 : 无
* 备注 : 结束之后保持SDA和SCL都为1;表示总线空闲
*******************************************************************************/
void I2cStop()
{
SDA=0;
Delay10us();
SCL=1;
Delay10us();//建立时间大于4.7us
SDA=1;
Delay10us();
}
说明
I^2C
所有设置:
#include"i2c.h"
/*******************************************************************************
* 函数名 : Delay10us()
* 函数功能 : 延时10us
* 输入 : 无
* 输出 : 无
*******************************************************************************/
void Delay10us()
{
unsigned char a,b;
for(b=1;b>0;b--)
for(a=2;a>0;a--);
}
/*******************************************************************************
* 函数名 : I2cStart()
* 函数功能 : 起始信号:在SCL时钟信号在高电平期间SDA信号产生一个下降沿
* 输入 : 无
* 输出 : 无
* 备注 : 起始之后SDA和SCL都为0
*******************************************************************************/
void I2cStart()
{
SDA=1;
Delay10us();
SCL=1;
Delay10us();//建立时间是SDA保持时间>4.7us
SDA=0;
Delay10us();//保持时间是>4us
SCL=0;
Delay10us();
}
/*******************************************************************************
* 函数名 : I2cStop()
* 函数功能 : 终止信号:在SCL时钟信号高电平期间SDA信号产生一个上升沿
* 输入 : 无
* 输出 : 无
* 备注 : 结束之后保持SDA和SCL都为1;表示总线空闲
*******************************************************************************/
void I2cStop()
{
SDA=0;
Delay10us();
SCL=1;
Delay10us();//建立时间大于4.7us
SDA=1;
Delay10us();
}
/*******************************************************************************
* 函数名 : I2cSendByte(unsigned char dat)
* 函数功能 : 通过I2C发送一个字节。在SCL时钟信号高电平期间,保持发送信号SDA保持稳定
* 输入 : num
* 输出 : 0或1。发送成功返回1,发送失败返回0
* 备注 : 发送完一个字节SCL=0,SDA=1
*******************************************************************************/
unsigned char I2cSendByte(unsigned char dat)
{
unsigned char a=0,b=0;//最大255,一个机器周期为1us,最大延时255us。
for(a=0;a<8;a++)//要发送8位,从最高位开始
{
SDA=dat>>7; //起始信号之后SCL=0,所以可以直接改变SDA信号
dat=dat<<1;
Delay10us();
SCL=1;
Delay10us();//建立时间>4.7us
SCL=0;
Delay10us();//时间大于4us
}
SDA=1;
Delay10us();
SCL=1;
while(SDA)//等待应答,也就是等待从设备把SDA拉低
{
b++;
if(b>200) //如果超过2000us没有应答发送失败,或者为非应答,表示接收结束
{
SCL=0;
Delay10us();
return 0;
}
}
SCL=0;
Delay10us();
return 1;
}
/*******************************************************************************
* 函数名 : I2cReadByte()
* 函数功能 : 使用I2c读取一个字节
* 输入 : 无
* 输出 : dat
* 备注 : 接收完一个字节SCL=0,SDA=1.
*******************************************************************************/
unsigned char I2cReadByte()
{
unsigned char a=0,dat=0;
SDA=1; //起始和发送一个字节之后SCL都是0
Delay10us();
for(a=0;a<8;a++)//接收8个字节
{
SCL=1;
Delay10us();
dat<<=1;
dat|=SDA;
Delay10us();
SCL=0;
Delay10us();
}
return dat;
}
/*******************************************************************************
* 函数名 : void At24c02Write(unsigned char addr,unsigned char dat)
* 函数功能 : 往24c02的一个地址写入一个数据
* 输入 : 无
* 输出 : 无
*******************************************************************************/
void At24c02Write(unsigned char addr,unsigned char dat)
{
I2cStart();
I2cSendByte(0xa0);//发送写器件地址
I2cSendByte(addr);//发送要写入内存地址
I2cSendByte(dat); //发送数据
I2cStop();
}
/*******************************************************************************
* 函数名 : unsigned char At24c02Read(unsigned char addr)
* 函数功能 : 读取24c02的一个地址的一个数据
* 输入 : 无
* 输出 : 无
*******************************************************************************/
unsigned char At24c02Read(unsigned char addr)
{
unsigned char num;
I2cStart();
I2cSendByte(0xa0); //发送写器件地址
I2cSendByte(addr); //发送要读取的地址
I2cStart();
I2cSendByte(0xa1); //发送读器件地址
num=I2cReadByte(); //读取数据
I2cStop();
return num;
}
Q56:实验中 外部中断初始化函数如何编写?
答:
void init()
{
IT0=1;
EX0=1;
EA=1;
}
Q57:编写外中断的实验(控制灯亮灭)
答:
之前的实验代码
代码位置:https://github.com/duganlx/STC
#include<reg51.h>
data unsigned char cLed _at_ 0x20;
void init()
{
IT0=1;
EX0=1;
EA=1;
}
void main()
{
cLed = 0xfe;
P2=cLed;
init();
while(1);
}
void I0() interrupt 0
{
# pragma asm
MOV A, 20H
RL A
MOV 20H, A
# pragma endasm
P2=cLed;
}