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]);

    }

}