1.单片机IO口开漏输出和推挽输出有什么区别?
开漏输出:开漏输出只能输出低电平,如果要输出高电平必须通过上拉电阻才能实现。就类似于三极管的集电极输出。
推挽输出:推挽输出既可以输出低电平,也可以输出高电平,可以直接驱动功耗不大的数字器件。导通损耗小、效率高、既提高电路的负载能力,又提高开关速度。
推挽输出:可以输出高,低电平,连接数字器件。
输出 0 时,N-MOS 导通,P-MOS 高阻,输出0。
输出 1 时,N-MOS 高阻,P-MOS 导通,输出1(不需要外部上拉电路)。
开漏输出:输出端相当于三极管的集电极. 要得到高电平状态需要上拉电阻才行. 适合于做电流型的驱动,其吸收电流的能力相对强(一般20ma以内).
输出 0 时,N-MOS 导通,P-MOS 不被激活,输出0。
输出 1 时,N-MOS 高阻, P-MOS 不被激活,输出1(需要外部上拉电路);可以读IO输入电平变化,此模式可以把端口作为双向IO使用。
2.单片机里定时器有什么作用和优势?
作用:计数器、延时、输入捕获(解码和测量时间间隔)、输出比较(主要输出PWM波)、单脉冲输出、触发中断(对其他模块进行操作)
优势:不需要CPU参与,精确
3.什么是Nyquist采样定理?如果需要通过512点FFT分析200-10KHz信号频谱,频谱分辨率不低于40Hz,此时采样频率需在什么范围?
频率分辨率可以理解为在使用DFT时,在频率轴上的所能得到的最小频率间隔f0=fs/N=1/NTs=1/T,其中N为采样点数,fs为采样频率,Ts为采样间隔。所以采样频率不低于20480hz.与采样频率的不低于20000hz综合得不低于20480hz
4.已知单片机内置12位精度的ADC,单片机工作电压3.3V,ADC基准电压3V,请计算ADC采样的电压最小分辨率是多少?如果单片机ADC输入口电压为1V,则采样得到的值是多少?
不确定是否正确
先求误差 (3.3-3)/3=10%
也是说当单片机ADC输入口电压为1V测得电压为1.1V
在无误差的情况下 分辨率为 1/4096
本题的分辨率为 1.1/4096(可以理解为一把尺子实践的长度没变,原先1个格子代表1V,现在想表示1V需要占用1.1个格子)
5.同步通信和异步通信有什么区别?UART、SPI和I2C分别属于什么类型的通信方式?
同步通信需要一根时钟线,并且通信双方的时钟频率要严格同步,系统搭建相对较复杂,成本高,但是传输的数据量少,速度快,其中时钟的作用就是判断收发数据的进程,定位当前传输的数据
异步通信可以不要时钟线,系统较为简单,由于缺少定位数据的时钟线,所以必须在传输的数据帧前后加上开始、结束等冗余字符,造成传输速度略有降低
UART全称通用异步收发器,无时钟线,属于异步通信
SPI全称串行外设接口,有时钟线,属于同步通信
I2C全称集成电路串行总线,有时钟线,属于同步通信
6.简述通过I2C接口读取设备X的寄存器Y的值的过程
1.首先主机发起通信(起始信号),将设备X的地址与寄存器Y写入从机;
2.从机接收信号将命令(读还是写命令)与寄存器Y地址提取出来,
3.从机将寄存器Y地址的数据放入从机I2C输出buffer
4.主机再次发起一次通信,读取从机数据。
7.中断是什么?请简述单片机中断处理的过程
CPU在正常执行程序的过程中,由于内部/外部事件的触发或程序的预先安排引起CPU暂时中断当前正在运行的程序,而转去执行中断服务子程序,待中断服务子程序执行完毕后,CPU继续执行原来的程序,这一过程称为中断;
中断处理的过程:
第一步:保护现场,将当前位置的PC地址压栈;
第二步:跳转到中断服务程序,执行中断服务程序;
第三步:恢复现场,将栈顶的值回送给PC;
第四步:跳转到被中断的位置开始执行下一个指令;
8.相比于正常子函数,中断服务函数有什么特点和需要注意的地方?
相当于正常子函数,中断服务函数的特点是没有输入参数,一般也没有输出参数,此外,调用中断服务函数的方式也有所区别,正常子函数的调用直接在需要的位置写出子函数名即可,程序运行到此即进入子函数内部;调用中断服务函数,需要在程序中开启中断开关,即配置对应中断控制的寄存器,当出现触发条件时(例如某引脚电平信号发生变化,或时间达到某一值),就会进入中断服务函数体内运行
注意地方:中断函数中不宜写太多的代码,这样可能导致中断服务函数还未执行完,因为符合条件,又触发了一次中断,程序就一直卡在中断服务程序中,导致整个系统崩溃。另外,当系统有多个中断时,为防止在执行当前中断服务函数时,被另一个不必要的中断打断,一个可以参考的解决方法时在进入中断时关闭其他中断,并在中断服务函数的最后一句再次开启中断开关。
9.对于char型变量 a,写两段代码分别将 a的 bit 6置1和置0
a|=(1<<6); a&=~(1<<6);
10.请写一段代码,可以将输入为”0.0.0.0”—“255.255.255.255”的字符串转换为int型整数数组。
输入:”255.255.255.255”
输出:255 255 255 255 (数组)
#include<stdio.h>
#include<stdilib.h>
#include<string.h>
int main()
{
char arry[20];
int res[4]={0};
gets(arry);
int len=strlen(arry);
int i=0,count=0;
while(i<len)
{
if(arry[i]=='.')
{
count++;
i++;
}
res[count] *=10;
res[count] +=(arry[i]-'0'); //字符转数字
i++;
}
for(int j=0;j<4;j++)
{
printf("%d\t",res[j]);
}
}