使用Atmega 16/16A的Arduino复制板串口通信
前面我们用Atmega16/16A的“裸片”在Arduino IDE下创建了Arduino开发板的复制板。从Atmega16/16A与Arduino的管脚对应关系上看,我们将拥有31个数字引脚和7个模拟引脚,3路PWM信号引脚,这些都是传统Arduino UNO所不及的——不过我们只是关心它比Arduino板省空间。
但是Atmega16/16A毕竟是复制板,它不支持Arduino常规的串口通信。我们使用的 MightyCore板卡库似乎没有定义Serial库,这在官方说明里介绍过了,所以我们把目光转向了SoftwareSerial库,即虚拟软串口。 结果断断续续调试了一天,最终得到了正确的方案。要点如下: - 使用Arduino UNO R3作为烧录器。烧入ArduinoISP,编程器:Arduino As ISP:
接线: Arduino UNO | Atmega16 |
---|
5V | 10(VCC) | GND | 11(GND) | 10 | 9(RESET) | 11 | 6(MOSI) | 12 | 7(MISO) | 13 | 8(SCK) |
- 设置Atmega16/16A板。Internal 8MHz、Standard Pinout,使用Upload with Programmer。

代码:
#include <SoftwareSerial.h> SoftwareSerial mySerial(10, 11); // RX, TX int pin=14;//注意这句 void setup() { mySerial.begin(115200); pinMode(pin, OUTPUT); } void loop() { digitalWrite(pin, HIGH); mySerial.print("Milliseconds\n"); delay(500); digitalWrite(pin, LOW); delay(500); }
- 接USB To TTL烧录器。这3条线必须必须必须全要连接,这个是关键。
Atmega16/16A | USB To TTL |
---|
16(D10) | TX | 17(D11) | RX | 11(GND) | GND |
- 使用SSCom调试,正常。估计匹配其他波特率、给Atmega使用外部晶振完全没有问题。

下面说明一下哪些做法是不成功的,避坑之法:
- 低于9600的软串口波特率设置,基本都是乱码,怎么改动也不行。
- 虽为软串口,但如果连接Atmega16/16A上的16、17脚到Arduino的D0、D1脚,能够接收到数据,但均为乱码,上图即是。
- 必须使用另一个USB To TTL连接Atmega16/16A的16、17脚,且同时连接双方的GND,否则接收仍为乱码。
- Atmega16/16A的软串口与USB To TTL连接时,用Arduino作为编程器给Atmega16/16A编程,所有连接都不用改动,不必担心串口被占用的问题,也算是提供了一个方便。
至此,使用Atmega系列芯片完全替代Arduino基本实现,在未来的作品上把这些芯片直接焊在万能板上,大概也不必再心疼了。 
|