通信初探免试题教程

欢迎各位新生来到科协电子部!

考虑到很多人并没有特别多的电子基础,并且很希望加入科协这个平台。我特地出了一道比较简单的免试题,相信大家只要跟着这个教程走完,是一定能够做出来的。
本文相较于传统的免试题,更像是一个入门教程。跟着本文走完全程,相信你会对总线通信,外设控制,乃至单片机底层原理产生更深的理解。

这个教程还在更新中,欢迎催更。有什么有趣的想法或建议欢迎qq咨询,题目也许因为你而改变哦!遇到了困难也欢迎提问。(8.12)

鉴于很多人没有什么基础,这里给出完成这题的速通方案:(9.12日更新)

  1. 看https://www.bilibili.com/video/BV1s84y1h77Q学习stm32(学习到点灯
  2. 看https://www.bilibili.com/video/BV1nx411U7Ht学习74hc595的使用
  3. 跳转到基础部分验收点,搭建电路,完成本题
    在本文中散布着很多代码,收集起来即可组成验收代码 : )

0. 背景知识

要完成这个项目,你只需要:

  • 会C语言的基本用法(变量定义,if,while,for,函数声明,基础的位运算!)
  • 关于位运算可以看:https://www.bilibili.com/video/BV1YT4y117AH(第一个视频)
  • 会单片机点灯

需要的硬件有:

单片机一块,面包板一块,LED若干,1k电阻若干,74hc595若干

如果你不会C语言,可以找网上快速入门的教程去学习。
如果你不会单片机点灯:
Arduino: B站上教程很多,都可以看
stm32:
https://www.bilibili.com/video/BV1dC41147eL (建议有一定基础的人观看,上手快,三分钟学会点灯)
https://www.bilibili.com/video/BV1q4411d7RX(新手友好)

推荐教程

推荐看ben eater的通信教程: https://www.bilibili.com/video/BV1JJ411h7B7 (B站上只找到无字幕的版本)
https://www.youtube.com/watch?v=eq5YpKHXJDM (yt版本有中文字幕,需要科学上网)

1. 通信

大家看到的电路板上的各种芯片之间是通过电信号来相互交流的,这也就是信号与通信。
数字电信号通信最简单,也最直观能想到的一种方式就是使用一条线来传输信号,也就是像下图这样,代表了二进制数据:01001000,十六进制:0x48
在这里插入图片描述
在一根线上根据时间改变其高低电平,就可以得到这样一个最简单的通信方式。
我们来尝试使用C语言实现一下:

新增解释(8.13更新)

在电脑中,数据是以二进制的形式储存的。
如char data = 3; 那么data本质上就是一串二进制数据
data: 00000011 : 二进制转为十进制为3
关于位移操作见:https://www.bilibili.com/video/BV1YT4y117AH(第一个视频)

void writeData(char data) { // data为八位二进制数据
	for (int i = 0; i < 8; i++) { // i从0到7, 对应时间上的变化
        int bit = (data>>(7-i)) & 1; // 获取当前时刻的数据位(使用到了C语言中的位运算)
        SET_PIN(bit); // 改变引脚上的高低电平为当前的数据位
        BIT_DELAY();  // 延时一段时间
    }
}
// 这里的SET_PIN, BIT_DELAY换成单片机上相应的函数
  • 在上面的例子中,for语句循环八次,每次把data向右位移7-i位(数据为八位,即从高位数第i位),即让data中的高位数起第i位为最低位,再通过与运算取出。通过以上步骤即可取出第i时刻的数据位。

以上几行代码,就实现了一个最基本的串行总线通信。
大家可以试试把上面的代码移植到自己惯用的单片机上试试,建议延时长一点,用LED连上自己测试一下。
如果已经做到了这一步,那么恭喜你,基础部分的题目的第一个验收点就基本上完成了。
这其实就是异步通信,即通过约定一个发送速率(由BIT_DELAY控制)来传输信号。

大家在看单片机教程的时候,经常会看到串口(UART)。 其实,上面的程序加入一个停止位就可以模拟出一个简单的串口发送,其中BIT_DELAY()的时间等于1s/波特率;有兴趣的可以尝试;
接收端配置:波特率:与单片机端一样,数据位:8,停止位:1,校验位:无, 流控:无

思考:这种通信方式是否存在问题,接收方要如何接收发来的信息?


验收点1

使用上面的通信方式点灯(BIT_DELAY为延时500ms),发送"Hello world!",视频验收。
关于如何发送,我这里给出一个简单的示例

char *data = "Hello world!";
int i = 0;
while(*(data+i)!='\0') {
	WriteData(*(data+i)); // 这里用到了指针操作,看不懂的话就直接抄吧。
	i++;
}

注意,本验收点仅为一个阶段性验收点,并不代表基础部分验收
(更新于8.12晚)


2.同步通信

上面这种通信方式由于这种通信方式对于双方的时钟都有着很高的要求。如果两方实际的传输频率稍有不一,那么在时间的积累下会产生巨大的误差。这也就是异步通信的缺点。
为此,人们发明了同步通信,就是在传输数据信号的同时传输时钟信号,告诉对方在时钟由0变成1的时候获取数据
在这里插入图片描述
在这里插入图片描述

每当时钟线的电平由0变为1时,接收方就去采集数据线上的数据。这样就保证了接收方会在正确的时间获取数据。

在这里插入图片描述
这个要在C语言中实现起来也很简单:

void writeData(char data) { // data为八位二进制数据
	for (int i = 0; i < 8; i++) { // i从0到7, 对应时间上的变化
        int bit = (data>>(7-i)) & 1; // 获取当前时刻的数据位(使用到了C语言中的位运算)
        SET_DATA(bit); // 改变数据(data)引脚上的高低电平为当前的数据位
        DELAY(t1);  // 延时一段时间(下图中的t1)
        SET_CLK(1); // 改变时钟(clock, CLK)引脚, 为高电平(告诉对方来获取data数据
        DELAY(t2); // 延时一段时间(下图中的t2)
        SET_CLK(0); // 改变时钟(clock, CLK)引脚, 为低电平
        DELAY(t3); // 延时一段时间(下图中的t3)
        
    }
}
// 这里的SET_DATA, SET_CLK, DELAY换成

在这里插入图片描述
实际应用中,t1,t2,t3随便选一个数值就可以,这里就统一选为500ms, 也便于观察效果
做到这里,一个单片机与外部通过同步通信的函数就写好了。
在实际应用中,很多芯片都使用这种方式与单片机进行通信。下面我们将做一个小实验,使用上面写的函数,与位移寄存器74HC595进行通信实验。

基础部分验收点:

简单来说就是根据下面那个推荐教程学习一下74hc595的使用方式。
在这里,我希望你做一个小实验。做完这个部分,这道免试题的基础部分也就完成了。

验收点:

学习一下74hc595的用法,把数据"Hello World!"依次传输到74hc595中,用8个led显示出来。(8.13更新)
推荐教程:https://www.bilibili.com/video/BV1nx411U7Ht

即:使用一个74hc595和八个led把输入的数据(八位二进制)显示在一排led上,并且每秒切换一个字母
大家做好了可以查一查ascii码表,看一看传输的数据是否正确

这个部分不会给出很多的教程信息,希望大家自己查阅网上资料进行学习。这在之后的学习,制作过程中是一个必要的技能。

小tips:74hc595的数据传输方式跟上面是一模一样的。


基础部分:

1.使用教程中定义的方式向外传输字符串"Hello World!"


提高部分(任选其一即可):

1.接收串口发来的任意数据,并使用上述方式向外传输串行数据(最简单

要求:用74hc595连接一排led,把收到字符的ascii以二进制显示出来
串口要有缓存区,向单片机发送一个字符串,依次把各个字符的ascii码显示出来

2.想想看怎么才能确保对方收到的信息是正确的,并加入一种校验方式(CRC)

3.总线操作的本质是对寄存器的读/写,根据教程,完成对于外部寄存器的写操作

学习iic总线,并读取mpu6050的数据,使用串口显示出来
(会提问底层的原理,需要知道:

  • iic总线的基本通信流程
  • 读取mpu6050角度的过程需要进行什么操作

验收要求:

不限制硬件,可以使用arduino、stm32、fpga甚至是 不可编程器件+eeprom搭配
完成基础部分并且完成任一提高部分的要求

tips:

	本题只会用到最基础的GPIO操作,重在理解与学习的过程
	推荐使用gpt等AI协助编程(理论上这里的所有免试题都可以用gpt秒杀
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值