AVR开发 Arduino方法(一) 端口子系统

  Arduino UNO R3使用的主处理器ATMega328P上有3个8位的输入/输出端口,它们分别是PB,PC和PD。Arduino IDE提供的Blink示例可以帮助我们了解端口的数字输出功能:

 1 int led = 13;
 2
 3 void setup() {
 4   pinMode(led, OUTPUT);
 5 }
 6
 7 void loop() {
 8   digitalWrite(led, HIGH);
 9   delay(1000);
10   digitalWrite(led, LOW);
11   delay(1000);
12 }

  这个示例使Arduino 13(PB5)引脚上的LED闪烁。与数字输出相关的Arduino库函数有:

  pinMode(pin, mode):配置指定引脚为输入或输出
  pin:指定引脚
  mode:OUTPUT(输出),INPUT(输入)或INPUT_PULLUP(带上拉电阻的输入)
  digitalWrite(pin, value):从指定引脚输出电平
  pin:指定引脚
  value:LOW(低电平,0V),HIGH(高电平,5V)

  ATMega328P的每个端口都由3个相关寄存器控制,方向寄存器DDRx(x = B, C, D)用于指定端口引脚方向,若向其中某位写入1,则该位控制的引脚被设置为输出,写入0则为输入。输出寄存器PORTx(x = B, C, D)在该端口引脚被设置为输出时,写入1则输出高电平,写入0则输出低电平;在该端口引脚被设置为输入时,写入1则对其启用上拉电阻,即在该端口引脚被悬空时默认输入高电平。输入寄存器PINx(x = B, C, D)在端口引脚被设置为输入时存储该端口引脚的输入,若端口引脚输入高电平,则寄存器相应位被置为1,输入低电平则置为0。
  通过直接访问寄存器改写以上程序:

1 void setup() {
2   DDRB |= (1 << PB5);
3 }
4
5 void loop() {
6   PORTB ^= (1 << PB5);
7   delay(1000);
8 }

  向电路中添加一个按键,让它的两端分别连接在Arduino 2(PD2)引脚和GND(地)引脚上(如下所示)。

  这样使得按键在没有按下时2(PD2)引脚处于悬空状态,因此需要将2(PD2)引脚设置为带上拉电阻的输入模式:

 1 const int buttonPin = 2;
 2 const int ledPin =  13;
 3
 4 int buttonState = 0;
 5
 6 void setup() {
 7   pinMode(ledPin, OUTPUT);
 8   pinMode(buttonPin, INPUT_PULLUP);
 9 }
10
11 void loop(){
12   buttonState = digitalRead(buttonPin);
13
14   if (buttonState == HIGH) {
15     digitalWrite(ledPin, HIGH);
16   }
17   else {
18     digitalWrite(ledPin, LOW);
19   }
20 }

  除了pinMode()函数外,与数字输入相关的Arduino库函数有:

  digitalRead(pin):从指定引脚上读取电平
  pin:指定引脚
  函数返回LOW(低电平,0V)或HIGH(高电平,5V)

  通过直接访问寄存器改写以上程序:

 1 void setup() {
 2   DDRB |= (1 << PB5);
 3   DDRD &= ~(1 << PD2);
 4   PORTD |= (1 << PD2);
 5 }
 6
 7 void loop() {
 8   if (PIND & (1 << PD2)) {
 9     PORTB |= (1 << PB5);
10   } else {
11     PORTB &= ~(1 << PB5);
12   }
13 }
时间: 2024-08-24 12:14:35

AVR开发 Arduino方法(一) 端口子系统的相关文章

AVR开发 Arduino方法(二) 中断子系统

在了解ATMega328P的中断子系统之前,首先要了解中断的概念.你正在看书,这时电话响了,你会怎么做呢?相信大多数人会这样:先标记看到的位置,接完电话回来后继续阅读.这就是一个现实生活中中断的例子,我们把"电话响了"成为中断源.ATMega328P拥有26个中断源,如下表所示: 向量号 程序地址 中断源 中断定义 中断服务程序名称 1 0x0000 RESET 外部电平复位,上电复位,掉电检测复位,看门狗复位 2 0x0002 INT0 外部中断请求0 INT0_vect 3 0x0

AVR开发 Arduino方法(五) 模数转换子系统

模数转换子系统用于将传感器采集的模拟信号转换为数字信号.Arduino UNO R3主处理器ATMega328P的模数转换子系统采用逐次逼近的方式完成模数转换. 使用Arduino库函数进行模数转换十分简单,下面的示例可以将A0引脚上的模拟信号转换为数字信号,并将转换结果打印到串口0上: 1 // ReadAnalogVoltage.ino 2 void setup() { 3 Serial.begin(9600); 4 } 5 6 void loop() { 7 int sensorValue

AVR开发 Arduino方法(六) 内存子系统

Arduino UNO R3主处理器ATMega328P的芯片内部拥有3种存储器:数据存储器,程序存储器和电可擦写可编程存储器:它们各自有不同的用途. 1. 数据存储器 数据存储器是一块2KB大小的静态随机存储器(SRAM).其中一部分空间分配给了通用寄存器和I/O寄存器,其余部分一般用于存储全局变量,堆栈数据和支持动态内存分配.它的存取速度快,但掉电后数据会丢失. 2. 程序存储器 程序存储器是一块32KB大小的闪存(Flash),其中0.5KB用于引导程序.它可以多次擦写,掉电后数据不会丢失

AVR开发 Arduino方法(附二) 故障排除:烧录引导程序

在"内存子系统"一章中我们曾提到,Arduino UNO R3开发板上的ATMega328P有0.5KB的Flash空间用于引导程序:因为有引导程序的支持,Arduino可以使用串口上传程序而无需编程器.一般地,按下Arduino UNO R3开发板上的复位按键,13引脚上的LED快速的闪烁3下,代表引导程序正常启动.如果出现上传程序没有响应或复位时LED没有闪烁,排除硬件故障后,可以考虑重新烧录引导程序. (1) 使用USBasp编程器烧录引导程序 Arduino IDE支持的编程器

微信公众平台开发调试方法

在这篇微信公众平台开发教程中,我们将介绍如何进行微信公众平台上的开发调试方法. 一.方倍微信调试器 微信调试器是方倍工作室开发的用于微信公众平台接口开发调试的工具,具有Token校验.模拟关注及取消关注.发送文本/图片/语音/视频/位置/链接.模拟事件发送等功能.其原型是微擎的Emulator. 微信调试器目前不支持IE浏览器下的使用,请下载Chrome浏览器或下载Firefox浏览器. 微信调试器的地址是 http://debug.fangbei.org/ .其界面如下 使用方法 1. Tok

Android应用插件式开发解决方法

Android应用插件式开发解决方法 一.现实需求描述 一般的,一个Android应用在开发到了一定阶段以后,功能模块将会越来越多,APK安装包也越来越大,用户在使用过程中也没有办法选择性的加载自己需要的功能模块.此时可能就需要考虑如何分拆整个应用了. 二.解决方案提出 一般有两种方式,一种是将应用按照功能分拆成多个应用,用户需要哪个就下载哪个,都需要就都下载.应用之间,可以在代码层面做一定的关联,以共享部分信息.另一种方式,类似于其他平台插件的方式,用户可以在主应用中可以选择性的下载需要的插件

【IOS】IOS开发问题解决方法索引(一)

IOS开发问题解决方法索引(一) 1       Xcode工程调试时无法命中断点的问题 若没有勾选LLVM Compiler 1.6 –> CodeGeneration –> Generate Debug Symbols 一项,则程序调试时无法命中断点. 2       Xcode调试时查看变量的几种方法 Xcode如何查看内存中的数据 http://blog.csdn.net/evgd2288/article/details/8995779 Xcode的Debug中查看数据细节的方法 ht

【IOS】IOS开发问题解决方法索引(二)

IOS开发问题解决方法索引(二) 1       不使用ARC编译,-fno-objc-arc ios5 选择了ARC但是不使用ARC编译,-fno-objc-arc http://leobluewing.iteye.com/blog/1384797 http://blog.cnrainbird.com/index.php/2012/03/13/object-c_kai_fa_zhong_hun_he_shi_yong_huo_bu_shi_yong_arc/ 2       SIGABRT错误

我读经典(9):读《完美软件开发:方法与逻辑》有感

开发出一款受用户欢迎的.十全十美的软件是每个软件开发工程师的梦想,但在现实条件下,受市场环境.公司氛围及自身水平等的影响,要开发出一款完美的软件几乎是不太可能的.最近,我阅读了李志勇老师的<完美软件开发:方法与逻辑>一书,颇有收获. 正如李老师所说,本书是为"培养帅才"而写的.全书共9章内容,以思维逻辑为出发点和归宿,表达了作者对完美软件开发的一些理解和认识.本书涉及到的内容包括:项目管理.流程.开发模型.估算方法.需求开发.设计和编码等.在最后一章中,作者以薪水支付与性能