本文隶属于AVR单片机教程系列。

做了这么多准备,我们终于可以开始用开发板做点事了。

单片机编程与计算机编程有一些不同点。程序都要有零个或多个输入、一个或多个输出,这是两者都有的,但是计算机编程的输入输出主要靠控制台,而单片机没有。

单片机的英文是microcontroller,主要作控制用途,它对设备的控制就是它的输出,从设备读取的信息就是它的输入。计算机编程中,提供了scanf、printf等函数来做输入输出,单片机虽然也有这一些函数,但它们往往是在串口上收发数据,最终还是在电脑上显示的。单片机对它连接的设备的控制,主要通过对寄存器(register)的操作实现。对寄存器的直接操作涉及到许多底层知识,我已经用一些函数把这些底层的东西封装好了,你只需要调用我编写的库中的函数就可以了。

用单片机来控制,最简单的就是点亮LED了。这个程序没有输入,有一个输出,就是让LED亮起。但即使简单,它也需要库,请在这里下载。

库下载完以后是不能直接用的,我们要把它放进编译器的包含目录下。

在EElib1.0.7z文件中有两个目录,分别是include和lib。打开Atmel Studio 7.0的安装目录,一路找toolchain→avr8→avr8-gnu-toolchain→avr,我是默认位置安装的,找到的目录就是C:\Program Files (x86)\Atmel\Studio\7.0\toolchain\avr8\avr8-gnu-toolchain\avr\,这个目录下也有include和lib两个文件夹。把压缩包里的文件夹放到这里来,对应文件夹合并,库就放对位置了。

上述操作只需每次更新库时执行一遍。

然后我们打开AS7,加载完成后,点击菜单栏→File→New→Project...,也可以用快捷键Ctrl+Shifh+N,弹出新建项目的窗口:

选择GCC C Executable Project,取个名字,选好路径,点击OK,会弹出设备选择窗口:

右上角输入“ATmega324PA”(大小写无所谓),选择ATmega324PA,点击OK。稍等几秒后,一个默认的项目创建好了:

这堆自动生成的代码我们不用,全部删掉。输入以下代码(建议敲一遍,不要复制):

 #include <ee1/led.h>

 int main()
{
led_init();
led_set(LED_RED, LED_ON);
return ;
}

敲代码的时候你会发现IDE会提示代码补全,按Tab或回车可以选择。输入好以后应该是这样的:

下面来分析一下这段代码:

#include <ee1/led.h> 用于包含库的头文件,有了这句代码,后面才能调用库函数。主版本号为1的库都放在 ee1/ 下。

led_init(); 用于初始化所有LED,如果不初始化,LED是不能点亮的。

led_set(LED_RED, LED_ON); 用于点亮红色LED。led_set 是一个库函数,接受两个参数,第一个表示要点亮哪个LED,第二个表示这个LED要亮还是不亮。详见库函数手册

最后的 return ; 可以不写,但加上是一个好习惯。

只写代码还不能让开发板点亮LED。我们调用了库函数,但是复制和 #include 还不足以把库加入到我们的程序中,我们需要配置一下项目属性:

在右边的Solution Explorer中对项目右键,点击最后的Properties,找到Toolchain→AVR/GNU Linker→Libraries,点击右上角Add Item按钮,输入“libee1”,点击OK,然后关闭选项卡,回到代码界面。

我们的开发板不支持debug,而且release编译出来的程序性能稍微好一点。在工具栏中选择Release:

现在我们可以build项目了,之前配置过快捷键的话直接按F5就可以了,也可以点工具栏按钮:

现在C语言代码被转换成了单片机能够执行的代码,它在项目目录中的某处,我们现在不去关心这个。之前配置过的external tool可以把这个文件烧录到单片机中去。如果之前配置过快捷键,按F6就可以,或者在菜单栏→Tools中点击AVRDUDE。输出结果应该是这样的:

如果输出结果不是这样的,那肯定是下载器出了点问题,可能的输出有:

“avrdude.exe: error: could not find USB device with vid=0x16c0 pid=0x5dc vendor='www.fischl.de' product='USBasp'”:这是下载器的电源问题,保持下载器与开发板连接,拔下下载器后重新插上就能解决;

“avrdude.exe: error: program enable: target doesn't answer.”:这是下载器与开发板之间的连接问题,可能是因为没有插紧。

如果烧写成功,现在红色LED就应该亮起了。

AVR单片机教程——点亮第一个LED的更多相关文章

  1. AVR单片机教程——随机点亮LED

    之前我们做的闪烁LED和流水灯,灯效都是循环的.这次我们来尝试一些不一样的——每一次随机选择一个LED并点亮. 要实现随机的效果,我们要用C语言标准库中的相关设施: #define RAND_MAX ...

  2. AVR单片机教程——闪烁LED

    上次我们把LED点亮了.你可能已经试过把 LED_RED 换成其他灯,也可能已经用 led_on() 把所有LED一起点亮了.但是LED点亮以后,程序就退出了,之后LED一直没有暗,直到没有供电.这一 ...

  3. AVR单片机教程——数码管

    先解答之前一个思考题:如果不把引脚配置为输出而写高电平,连接LED会怎样? 实验结果是,LED会亮,但相比于输出高电平的情况,亮度很低.这是为什么呢? 通过上一篇教程我们知道,引脚输入输出模式是由寄存 ...

  4. AVR单片机教程——数字输出

    从上一篇教程中我们了解到,按键与开关的输入本质上就是数字信号的读取.这一篇教程要讲的是,控制LED的原理是数字信号的输出.数字IO是单片机编程之有别于桌面编程的各项内容中最简单.最基础的. 在讲数字信 ...

  5. AVR单片机教程——按键动作

    上一篇教程中我们学习了如何读取按键状态.而按键的动作,比如单击,至少需要两个状态才能判定,长按.双击的判定更加复杂.今天我们来学习如何使用库函数判断按键单击,以及其实现原理. 我们要实现的是:当一个按 ...

  6. AVR单片机教程——按键状态

    好久没更新了,今天开始继续,争取日更. 今天我们来讲按键.开发板的右下角有4个按键,按下会有明显的“咔嗒”声.如何检测按键是否被按下呢?首先要把按键或直接或间接地连接到单片机上.与之前使用的4个LED ...

  7. AVR单片机教程——流水灯

    上次我们用 delay 函数与 while 循环实现了一个LED的闪烁.这一次我们把所有LED加入进来,让它们依次闪烁,形成流水灯的效果. 开发板上有4个LED,我们可以用不多的语句把循环体直接描述出 ...

  8. AVR单片机教程——序言

    我一直觉得现在的网络环境对电子技术的学习有一点问题,但始终无法确切地指出,更何况网络上相关资源已经那么丰富. 但我觉得是问题的,无论它到底是不是问题,对我来说总归是一个问题.我学习也不算深入,很多东西 ...

  9. AVR单片机教程——定时器中断

    本文隶属于AVR单片机教程系列.   中断,是单片机的精华. 中断基础 当一个事件发生时,CPU会停止当前执行的代码,转而处理这个事件,这就是一个中断.触发中断的事件成为中断源,处理事件的函数称为中断 ...

随机推荐

  1. select,poll,epoll最简单的解释

    从事服务端开发,少不了要接触网络编程.epoll 作为 Linux 下高性能网络服务器的必备技术至关重要,nginx.Redis.Skynet 和大部分游戏服务器都使用到这一多路复用技术. epoll ...

  2. Java学习之"Hello World"

    好像学习每个程序敲的第一个代码都是"Hello World",而学习Java也不例外,这篇博客就讲一下我学习Java的第一个程序HelloWorld.java 程序代码: publ ...

  3. python 生成 pyc 文件

    以 pyc 为扩展名的是Python的编译文件.其执行速度快于 py 文件且不能用文本编辑编辑查看.所以 pyc 文件往往代替 py 文件发布. Python 在执行时,首先会将 py 文件中的源代码 ...

  4. 如何选题?| 什么样的科学问题 | 研究项目才是有意义的?| scientific method

    搞科研,尤其是生命科学,经常会觉得自己做的东西是坨屎,没有任何意义. 在硕博的时候这种感觉会非常强烈,一个是自己思考能力不足:二是你的项目不是你设计的,不懂个中缘由,只执行的话就会很无聊,找不到意义感 ...

  5. https://blog.csdn.net/qq_35636311/article/details/78255568 cPython 扩展

    https://blog.csdn.net/qq_35636311/article/details/78255568 http://book.pythontips.com/en/latest/pyth ...

  6. pytorch transforms.Lambda的使用

    当你想要对图像设置transforms策略时,如: from torchvision import transforms as T normalize = T.Normalize([0.485, 0. ...

  7. Web Service 和 WCF的比较

    Web Service 和WCF的比较 Web Service 的工作原理 Web Service也叫XML Web Service WebService是一种可以接收从Internet或者Intra ...

  8. Delphi : TStringList的Find,IndexOf和Sort

    关键:Find要事先Sort排序,Indexof不用排序. TStringList内部查找相关的数据.待调试代码时才知道痛苦,浪费无数时间后,只得一步步跟踪,才发 现Find方法返回的Index总是错 ...

  9. Swift4.0复习函数

    1.函数的定义与调用: 一个函数定义的基本语法如以下代码所示: func function_name (param1: Int, param2: Float, param3: Double) -> ...

  10. 【Leetcode_easy】944. Delete Columns to Make Sorted

    problem 944. Delete Columns to Make Sorted 题意:其实题意很简单,但是题目的description给整糊涂啦...直接看题目标题即可理解. solution: ...