您好,欢迎来到九壹网。
搜索
您的当前位置:首页第2讲AVR单片机输入输出口

第2讲AVR单片机输入输出口

来源:九壹网
第2讲AVR单片机输入输出口

单片机内部结构

1

AVR单片机结构框图

MEGA16通用I/O 接口基本结构与应用

ATmega16 芯片有PORTA、PORTB、PORTC、PORTD(简称PA、PB、PC、PD)4 组8 位,共32 路通用I/O 接口,分别对应于芯片上32 根I/O 引脚。所有这些I/O 口都是双(有的为3)功能复用的。其中第一功能均作为数字通用I/O 接口使用,而复用功能则分别用于中断、时钟/计数器、USART、I2C 和SPI 串行通信、模拟比较、捕捉等应用。

图6-1 为通用I/O 口的基本结构示意图。从图中可以看出,每组I/O 口配备三个8 位寄存器,它们分别是方向控制寄存器DDRx,数据寄存器PORTx,和输入引脚寄存器PINx(x=A\\B\\C\\D)。I/O 口的工作方式和表现特征由这3 个I/O 口寄存器控制。

2

方向控制寄存器DDRx 用于控制I/O 口的输入输出方向,即控制I/O 口的工作方式为输出方式还是输入方式。

当DDRx=1 时,I/O 口处于输出工作方式。此时数据寄存器PORTx 中的数据通过一个推挽电路输出到外部引脚。AVR 的输出采用推挽电路提高了I/O 口的输出能力,当PORTx=1 时,I/O 引脚呈现高电平,同时可提供输出20mA 的电流;而当PORTx=0 时,I/O 引脚呈现低电平,同时可吸纳20mA 电流。因此,AVR 的I/O 在输出方式下提供了比较大的驱动能力,可以直接倾动LED 等小功率外围器件。

当DDRx=0 时,I/O 处于输入工作方式。此时引脚寄存器PINx 中的数据就是外部引脚的实际电平,通过读I/O 指令可将物理引脚的真实数据读入MCU。此外,当I/O 口定义为输入时(DDRx=0),通过PORTx 的控制,可使用或不使用内部的上拉电阻。

表中的PUD 为寄存器SFIOR 中的一位,它的作用相当AVR 全部I/O 口内部上拉电阻的总开关。当PUD=1 时,AVR 所有I/O 内部上拉电阻都不起作用(内部不上拉);而PUD=0 时,各个I/O 口内部上拉电阻取决于DDRXn 的设置。

3

I/O口使用小结

1) 使用AVR 的I/O 口,首先要正确设置其工作方式,确定其工作在输入方式还是输入方式。 2) 当I/O 工作在输入方式,要读取外部引脚上的电平时,应读取PINxn 的值,而不是PORTxn 的值。

3) 当I/O 工作在输入方式,要根据实际情况使用或不使用内部的上拉电阻。 4) 一旦将I/O 口的工作方式由输出设置成输入方式后,必须等待一个时钟周期后才能正确的读到外部引脚PINxn 的值。

例6.1 简易彩灯控制系统 1) 硬件电路设计:

发光二极管一般为砷化镓半导体二极管,其电路入图6-5所示。当电压U1 大于U2 约1V 以上时,二极管导通发光。当导通电流大于5mA 时,人的眼睛就可以明显地观察到二极管的发光,导通电流越大,亮度越高。一般导通电流不要超过10mA,否则将导致二极管的烧毁或I/O 引脚的烧毁。因此在LED 二极 管电路中要串接一个限流电阻,阻值在100~500Ω之间,调节阻值的大小可以控制发光二极管的发光亮度。导通电流与限流电阻之间的关系由下面的计算公式确定:

4

式中,Vled 为LED 的导通电压。

由于AVR 的I/O 口输出“0”时,可以吸收最大40mA 的电流,因此采用控制发光二极管

负极的设计比较好。8 个LED 发光二极管控制系统的硬件电路见图6-6。

2) 软件设计

ATmega16 的PA 口工作在输出方式下,8 个引脚分别控制8 个发光二极管。 当I/O 口输出“0”时LED 导通发光,输出“1”时LED 截止熄灭。 下面给出一个简单的控制程序,其完成的功能是8 个LED 逐一循环发光1 秒,构成“走马灯”

#include

5

#include void main(void) {

char position = 0; // position 为控制位的位置 PORTA=0xFF; // PA 口输出全1,LED 全灭 DDRA=0xFF; // PA 口工作为输出方式 while (1) {

PORTA = ~(1<if (++position >= 8) position = 0; delay_ms(1000); }; }

例6.2 控制恒温箱的加热的硬件电路设计恒温箱的加热源采用500W 电炉,电炉的工作电压220v,电流2.3A。选用HG4200 继电器,开关负载能力为5A/AC220V,继电器吸合线圈的工作电压5v,功耗0.36W,计算得吸合电流 为0.36/5 = 72mA。设计控制电路如图6-8。I/O引脚输出“1”时,三极管导通,继电器吸合,电炉开始加热。I/O 引脚输出“0”时,三极管截止,继电器释放,加热停止。

练习1:8 个LED 逐一点亮0.5s,左移循环2 轮(16 次)控制初值=&B11111110 练习2:8 个LED 逐一点亮0.5s,右移循环2 轮(16 次)控制初值=&B01111111 练习3:8 个LED 随机点亮,每次0.5s,共16 次,控制值=随机数

练习4:8 个LED 间隔点亮0.5s,明暗交替16 次,控制初值=&B10101010

练习5:8 个LED依次点亮1s,第一次亮一个,第二次亮两个,……,第八次亮八个,反复进行

提示::在CVAVR 中,提供int rand (void)和void srand(int seed)函数,请参考CVAVR 手册,尝试使用这两个函数

6

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- 91gzw.com 版权所有 湘ICP备2023023988号-2

违法及侵权请联系:TEL:199 18 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务