2018-8-21 16:46 上传
点击文件名下载附件
2018-8-21 16:47 上传
点击文件名下载附件
转自北邮电路课程公众号,模电数电
标准的Arduino UNO板子上的13引脚接有一个LED,IDE中的Blink例程就是控制这个LED以一秒的间隔闪烁,下面给出的就是Blink程序代码。
/*
Blink
Turns on an LED on for one second, then off for one second, repeatedly.
Most Arduinos have an on-board LED you can control. On the UNO, MEGA and ZERO
it is attached to digital pin 13, on MKR1000 on pin 6. LED_BUILTIN is set to
the correct LED pin independent of which board is used.
*/
void setup() {
pinMode(LED_BUILTIN, OUTPUT);
}
void loop() {
digitalWrite(LED_BUILTIN, HIGH); // turn the LED on
delay(1000); // wait for a second
digitalWrite(LED_BUILTIN, LOW); // turn the LED off
delay(1000); // wait for a second
}
这段代码编译后占用1018字节,由于AVR单片机上电后所有的I/O口默认为输入端口,如果想做输出端口用,需要设置端口模式,在这段代码中,是用pinMode函数来指定端口工作模式的。
在AVR单片机中,每个I/O引脚也称为端口,每个引脚由三个寄存器控制:
- 数据方向寄存器(DDRx):指定引脚是输入或输出,默认为输入。
- 数据寄存器(PORTx):引脚指定为输出时,决定引脚的电压值;指定为输入时,写如1开启内置上拉电阻。
- 输入寄存器(PINx):对应引脚上当前逻辑电平;若向输入寄存器写1,等效为翻转对应数据寄存器的值。
以占用较少资源为目标,下面给出实现同样功能的另一段代码
extern volatile unsigned long timer0_millis;
void setup() {
bitSet(DDRB,5); //初始化PB5,即13引脚为输出引脚
}
void loop() {
bitSet(PINB,5); //通过往13引脚的输入寄存器写1实现输出翻转
while(timer0_millis <1000);
timer0_millis=0;
}
这段代码编译后只占用490字节,而两段代码实现的功能是一样的。
为了降低功耗,代码可以再次修改如下
#include <avr/sleep.h>
extern volatile unsigned long timer0_millis;
void setup() {
bitSet(DDRB,5);
}
void loop() {
while(timer0_millis <1000) {
set_sleep_mode(SLEEP_MODE_IDLE);
sleep_mode();
}
timer0_millis=0;
bitSet(PINB,5);
}
这段代码编译后占用512字节,AVR体系结构有几种不同深度的睡眠模式,上面的代码是让AVR进入最浅的空闲模式,其效果使芯片在90%的时间里处于睡眠状态,节约了大量能量。
怎么样,你真的熟悉Arduino吗?不是把代码输入计算机就是编程,只有优化,甚至做到最优才叫编程,一件事情只有做到极致才有意义。
在Arduino IDE中只有 setup() 和 loop() 两个函数,其背后C语言框架代码应该是这样的:
void setup(void);
void loop(void);
int main(void) {
setup();
while (1)
loop();
return 0;
}
继续阅读本篇相关更多标签
热门资料
热门活动
全部回复 3
评测文章
热帖
大家都在看的技术资料
举报
内容系网友发布,其中涉及到安全隐患的内容系网友个人行为,不代表面包板社区观点
关闭
站长推荐 /2
- 返回顶部
工具栏