欢迎来到有趣的单片机世界!该教程将简单地介绍基本的 AVR 单片机编程知识,并用实际的体验方式进行学习。
我们准备用 AVR-GCC 作为编译器。
在 Windows 里,我们可以用 WinAVR 作为开发环境,WinAVR 可以到下面的网址下载: http://winavr.sourceforge.net/
安装完成之后,打开 Windows 命令行(快捷键是 Win 键+R,然后输入 cmd 回车)
执行 avr-gcc 如果有提示,表明安装成功。
执行 avrdude 如果有提示,表明 avrdude 工作正常。
在 Linux 里,我们可以用包管理器安装,请搜索 avr-gcc, avr-libc, avrdude 并安装相应的软件包。
在 Mac OS 里安装 AVR 开发环境。
请安装 libusb_1.2.4.0,最新的驱动可以到 USBasp 官方网站下载。
安装方法如下: 1. 按住 bootloader 键 2. 按一下 Reset 键并松开 3. 松开 bootloader 键
然后从 Windows 设备管理器里可以看到 USBasp 字样,浏览到驱动目录并安装驱动。
这里先提出一个问题:假设你手上有一个红色 LED 和一个绿色 LED,你怎样让它们交替地闪烁起来?也就是红色 LED 亮的时候绿色 LED 灭,绿色 LED 亮的时候红色 LED 灭。
要实现这个功能,方法有很多种,我们先来看看两种硬连线的方式。
演示 555 电路做出的效果。
说明:演示环形振荡器的闪烁方案。
现在我们再问一个问题:很好,上面的两种方法都实现了闪烁功能,如果我想让 LED 闪得快一点或者闪得慢一点,那该怎么办呢? 呃,这个嘛……,请问我的电烙铁在哪里?
烧个 LED 电阻出场:欧姆定律
哇,我们的主角终于出场了!
我们先从“单片机”这三个字讲起,这三个字已经包含了足够多的信息。
我们通常所说的计算机包含了 CPU,内存,ROM(只读存储器),输入/输出设备。单片机在一块芯片上把所有这些功能都全部放到一块芯片上去了!(可以用麻雀虽小,五脏俱全来形容)
单片机的功能当然不能和我们的电脑相比,它要慢得多,而且非常便宜,比如我们用的这块单片机市场零售价是 10 元钱,10元钱你能买到一台笔记本电脑吗 :)
单片机会把程序存在它的闪存里,就像我们把 mp3 文件存在我们的 SD 卡里,只不过这里存的是程序,只在我们一给单片机上电,它就会自动去读取存储器里的代码,然后运行!
原理图
伪代码(不是真正的程序,但是可以把它翻译成真正的程序)
main:
把 I/O 的方向设置成输出模式
循环:
点亮 LED
拖延时间,什么都不干
关掉 LED
拖延时间,什么都不干
重复
C 代码
#include "avr/io.h" // (1)
#define F_CPU 12000000UL
#include "util/delay.h" // (2)
int main(void) // (3)
{
DDRC = 0b00111111; // (4)
PORTC = 0b0000; // (5)
while (1) // (6)
{
PORTC = 0b00000001; // (7)
_delay_ms(200); // (8)
PORTC = 0b00000010; // (9)
_delay_ms(200); // (10)
}
}
存为 main.c,把 Makefile 放在同一个文件夹中。
make
执行下面的命令:
ls
如果不出意外,应该可以看到文件夹里多了一些文件:
图.
数据方向是控制,是输出,还是输入 PORTC = 0b0000; // 设置单片机端口初始状态
解释上面程序的工作原理。
#include "avr/io.h" // 包含 I/O 头文件
#define F_CPU 12000000UL
#include "avr/io.h" // 包含头文件,延时要用到它
int main(void)
{
DDRC = 0b00000000; // 数据方向是控制,是输出,还是输入
_delay_ms(5000); // 延时 5 秒
PORTC = 0b00111111; // 设置单片机端口初始状态
while (1) // 死循环
{
}
}
修改 _delay_ms(200); 里的时间参数。
在文本编辑器中写程序。 figure
用 AVR-GCC 把 C 代码翻译成机器码。怎么翻译?我们只需要执行 make 命令即可。 图。
现在,我们得到了单片机需要的可以运行的代码,但是这些代码现在存在我们的电脑上,怎样才能把它弄到单片机里去呢?
演示如何用 AVR 编程器来烧写固件。
那,我们需要一个编程器吗?答案是否,因为我们这个硬件把编程器也包含进去了!下面我们来看看怎么操作。
首先,我们要进入单片机的引导程序(bootloader),具体操作方法如下:
按住 USB 接口一端的“引导程序激活”按钮操持不放。
按一下复位键(在电源 LED 指示灯旁边)。
松开“引导程序激活”按钮。
不出意外,你会发现电脑会自动识别出一个新的 USB 设备,这个设备叫 USBasp,它就是一个 AVR 编程器,借助它,我们可以用一个叫 avrdude 的软件把单片机的代码下载到芯片里。
如果你喜欢动手敲命令,你可以用下面这条命令把程序“烧”进 AVR 里:
avrdude -c usbasp -p atmega328p -U flash:w:filename.hex
这样做的缺点是,每次都要打这么多字,真是太麻烦了!我们可以偷个懒,走个捷径。实际上,因为我们的工程目录里已经有了一个 Makefile,它里面就包含了如何下载程序的信息。我们只需要执行
make program
程序就能下载到单片机里去了!是不是很容易!
注意:当程序成功下载到芯片之后你可能会看到像 “avrdude: error: usbasp_transmit: usb_control_msg: sending control message failed, win error: A device attached to the system is not functioning.” 这样的错误提示,不用理它,可以直接忽略。事实上我们下载程序的时候没有发生错误,这个提示是 bootloader 在跳转程序的时候导致的。
我们现在回到 1900 年左右(那时还没有晶体管,也没有现在面包店里卖的切片面包,切片面包在 1928 年首次出现),人们做原型电路的时候就是用切面包用的砧板来搭电路的,因为这种木板很容易弄到而且也不贵,这个词一直沿用到今天。
在大学课程编号中,101 指初级课程。↩