AVR,51单片机IO结构

发布者:PeacefulWarrior最新更新时间:2013-02-27 来源: 21IC 关键字:AVR  51单片机  IO结构 手机看文章 扫描二维码
随时随地手机看文章

AVR的IO是真正双向IO结构,由于大部分网友都是从标准51转过来的,受标准51的准双向IO和布尔操作概念影响,没能掌握AVR的IO操作,所以有必要撰文说明一下

其实采用真正双向IO结构的新型MCU很多,常用的有 增强型51,PIC,AVR等

先简单的回顾一下标准51的准双向IO结构

 

这种准双向IO结构的特点是

1 输出结构类似 OC门,输出低电平时,内部NMOS导通,驱动能力较强(800uA);输出高电平靠内部上拉电阻,驱动能力弱(60uA)。

2 永远有内部电阻上拉(P0口除外),高电平输出电流能力很弱,所以即使IO口长时间短路到地也不会损坏IO口

(同理,IO口低电平输出能力较强,作低电平输出时不能长时间短路到VCC)

3 作输入时,因为OC门有"线与"特性,必须把IO口设为高电平(所以按键多为共地接法)

4 作输出时,输出低电平可以推动LED(也是很弱的),输出高电平通常需要外接缓冲电路(所以LED多为共阳接法)

5 软件模拟 OC结构的总线反而比较方便-----例如 IIC总线

* P0口比较特殊,做外部总线时,是推挽输出,做普通IO时没有内部上拉电阻,所以P0口做按键输入需要外接上拉电阻。

* OC门:三极管的叫集电极开路,场效应管的叫漏极开路,简称开漏输出。具备"线与"能力,有0得0。

* 为什么设计成输出时高电平弱,低电平强----是考虑了当年流行的TTL器件输入特性[page]

AVR的真正双向IO结构就复杂多了,单是控制端口的寄存器也有4个 PORTx.DDRx,PINx,SFIOR(PUD位),不过功能也强劲多了

作为通用数字I/O 使用时,所有AVR I/O 端口都具有真正的读- 修改- 写功能。

这意味着用SBI 或CBI 指令改变某些管脚的方向( 或者是端口电平、禁止/ 使能上拉电阻) 时不会无意地改变其他管脚的方向( 或者是端口电平、禁止/ 使能上拉电阻)。

输出缓冲器具有对称的驱动能力,可以输出或吸收大电流,直接驱动LED。

所有的端口引脚都具有与电压无关的上拉电阻。

并有保护二极管与VCC 和地相连。

* (很多数字器件都有保护二极管,在低功耗应用时要考虑保护二极管的电流倒灌的影响)

每个端口都有三个I/O 存储器地址:

数据寄存器 – PORTx

数据方向寄存器 – DDRx

端口输入引脚 – PINx。

数据寄存器PORTx和数据方向寄存器DDRx为读/ 写寄存器,而端口输入引脚PINx为只读寄存器。

但是需要特别注意的是,对PINx 寄存器某一位写入逻辑"1“ 将造成数据寄存器相应位的数据发生"0“ 与“1“ 的交替变化。

当寄存器MCUCR 的上拉禁止位PUD置位时所有端口引脚的上拉电阻都被禁止。

在( 高阻态) 三态({DDxn, PORTxn} = 0b00) 输出高电平({DDxn, PORTxn} = 0b11) 两种状态之间进行切换时,

上拉电阻使能({DDxn, PORTxn} = 0b01) 或输出低电平({DDxn,PORTxn} = 0b10) 这两种模式必然会有一个发生。

通常,上拉电阻使能是完全可以接受的,因为高阻环境不在意是强高电平输出还是上拉输出。

如果使用情况不是这样子,可以通过置位SFIOR 寄存器的PUD 来禁止所有端口的上拉电阻。

在上拉输入和输出低电平之间切换也有同样的问题。

用户必须选择高阻态({DDxn,PORTxn} = 0b00) 或输出高电平({DDxn, PORTxn} = 0b10) 作为中间步骤。

不论如何配置DDxn,都可以通过读取PINxn 寄存器来获得引脚电平

PINxn寄存器的各个位与其前面的锁存器组成了一个同步器。

这样就可以避免在内部时钟状态发生改变的短时间范围内由于引脚电平变化而造成的信号不稳定。

其缺点是引入了延迟。[page]

AVR IO具备多种IO模式:

1 高阻态 ,多用于高阻模拟信号输入,例如ADC数模转换器输入,模拟比较器输入

2 弱上拉状态(Rup=20K~50K),输入用。为低电平信号输入作了优化,省去外部上拉电阻,例如按键输入,低电平中断触发信号输入

3 推挽强输出状态,驱动能力特强(>20mA),可直接推动LED,而且高低驱动能力对称.

使用注意事项:

写用PORTx,读取用PINx

实验时,尽量不要把管脚直接接到GND/VCC,当设定不当,IO口将会输出/灌入 80mA(Vcc=5V)的大电流,导致器件损坏。

作输入时:

1通常要使能内部上拉电阻,悬空(高阻态)将会很容易受干扰。(表面看好像是51的抗干扰能力强,是因为51永远有内部电阻上拉,)

2尽量不要让输入悬空或模拟输入电平接近VCC/2,将会消耗太多的电流,特别是低功耗应用场合------CMOS电路的特点

3读取软件赋予的引脚电平时需要在赋值指令out 和读取指令in 之间有一个时钟周期的间隔,如nop 指令。

4功能模块(中断,定时器)的输入可以是低电平触发,也可以是上升沿触发或下降沿触发。

5用于高阻模拟信号输入,切记不要使能内部上拉电阻,影响精确度。例如ADC数模转换器输入,模拟比较器输入

作输出时:

采用必要的限流措施,例如驱动LED要串入限流电阻

复位时:

复位时内部上拉电阻将被禁用。如果应用中(例如电机控制)需要严格的电平控制,请使用外接电阻固定电平

休眠时:

作输出的,依然维持状态不变

作输入的,一般无效,但如果使能了第二功能(中断使能),其输入功能有效。例如 外部中断的唤醒功能。

AVR的C语言IO操作:

AVR的C语言基于ANSI C,没有像51那样扩展了位操作(布尔操作),虽然汇编指令里面有SBI/CBI/SBIC/SBIS指令

所以需要采用 位逻辑运算 来实现,这是必须要掌握的。

IO口和功能寄存器的操作方法一样,但对于部分功能寄存器的读写有特殊要求,请参看手册。

不必考虑代码效率的问题,如果可能,GCCAVR会自动优化为SBI/CBI/SBIC/SBIS指令,跟汇编的效率是一样的。

例如 iom16.h 里面定义了 #define PA7 7

(这标准头文件定义了MCU的所有官方定义(包括寄存器,位,中断入口等),但管脚的第二功能没有定义)

想PA7为1 PORTA|=(1<

想PA7为0 PORTA&=~(1<

想PA7取反 PORTA^=(1<

想检测PA7是否为1 if (PINA&(1<

想检测PA7是否为0 if !(PINA&(1<

* << 为左移运算符,不懂的就要好好复习C语言基础了。

注意IO操作的顺序:

//上电默认DDRx=0x00,PORTx=0x00 输入,无上拉电阻

假设PA口驱动LED的负极,低电平灯亮

初始化方法1:

PORTA=0xFF; //内部上拉,高电平

DDRA=0xFF; //输出高电平---------灯一直是灭的

初始化方法2:

DDRA=0xFF; //输出低电平--------灯被错误点亮了

PORTA=0xFF; //输出高电平--------马上被熄灭了,时间很短(1个指令不到uS时间),灯闪了一下,眼睛无法察觉

但要是这个IO口是控制炸药包的点火信号呢?工控场合要考虑可靠性的问题

模拟OC结构的IIC总线的技巧:

虽然AVR大多带有硬件IIC接口,但也有需要使用软件模拟IIC的情况

可以通过使用外部上拉电阻+控制DDRx的方法来实现OC结构的IIC总线。

IIC的速度跟上拉电阻有关,内部的上拉电阻阻值较大(Rup=20K~50K),只能用于低速的场合

#define SDA 0 //PC0

#define SCL 1 //PC1

(程序初始化设定 SDA和SCL都是 PORT=0,DDR=0)

#define SDA_0() DDRA|=(1<

#define SDA_1() DDRA&=~(1<

#define SCL_0() DDRA|=(1<

#define SCL_1() DDRA&=~(1<

使用上面的SDA_0()/SDA_1()/SCL_0()/SCL_1()宏即可,直观,而且效率跟汇编是一样的。

关键字:AVR  51单片机  IO结构 引用地址:AVR,51单片机IO结构

上一篇:单片机C语言一维数组
下一篇:单片机并行口扩展和存储器扩展

推荐阅读最新更新时间:2024-03-16 13:19

SLE4442卡_IC的51单片机驱动程序
整理了最初的实验草稿版,将端口宏定义,函数声明以及常用的函数声明建立头文件,感觉清楚多了,在不断地修改中凝练,在不停的实践中提高,满眼的思绪,在小小的Readme中划过一笔~~~~~~~~ char data_RST , ErrorCount ; void IC_RST(void) { uchar value,i,count; DATA_IN; //IC输入 RST_LOW; //复位时序 CLK_LOW; DATA_HIGH; DelayUs(5); RST_HIGH; DelayUs(5); CLK_HIGH; DelayUs(5); CLK_LOW; DelayUs(5); RST_LOW; DelayUs(2); for(
[单片机]
51单片机GPIO结构框图与工作原理
前言 不论学习什么单片机,最简单的外设莫过于IO 口的高低电平控制,本教程将向大家介绍如何在创建好的工程模板上通过操作51 单片机的GPIO 口输出高低电平。 一、GPIO 概念 GPIO(general purpose intput output)是通用输入输出端口的简称,可以通过软件来控制其输入和输出。51 单片机芯片的GPIO 引脚与外部设备连接起来,从而实现与外部通讯、控制以及数据采集的功能。不过GPIO 最简单的应用还属点亮LED 灯了,只需通过软件控制GPIO 输出高低电平即可。当然GPIO还可以作为输入控制,比如在引脚上接入一个按键,通过电平的高低判断按键是否按下。 我们开发板上使用的51 单片机型号是STC
[单片机]
<font color='red'>51单片机</font>GPIO<font color='red'>结构</font>框图与工作原理
AVR单片机实现智能插座节能的设计
0 引言 计算机外部设备(如打印机、扫描仪、音响等)的待机能耗不但增加了消费者的日常电费开支,也使电力资源浪费极大。该设计的计算机智能节能插座利用主机的开机和关机来带动其他设备的开或关,使其接口设备待机能耗为零,能够减少计算机及其外设所产生的辐射,以此达到节能和环保功效;同时还具备有分段定时开关的功能。该智能插座也可以通过功能转换作为普通插座使用,不影响其他设备的使用。 1 智能插座的设计 1.1 智能插座的硬件结构 计算机智能节能插座的硬件结构图如图1所示。该控制器以AVRmega 48为控制核心,外围电路主要由电流采样电路、模/数转换参考电压电路、状态显示电路、键盘输入电路和实时时钟构成。电流采样电路用于检测计算机的运行状
[单片机]
<font color='red'>AVR</font>单片机实现智能插座节能的设计
基于51单片机的贪吃蛇游戏设计
一. 实验目的 (1) 通过对C51语言的理解,编写程序实现对贪吃蛇的有效控制; (2) 通过对51单片机硬件的学习,学会运用面包板,独立按键、点阵屏等,完成对完整电路的搭建过程; (3) 通过对Proteus仿真软件的学习,实现基于STC89C52单片机的8*8点阵贪吃蛇的硬件电路仿真。 二. 实验介绍 贪吃蛇是一款经典小游戏,其游戏的规则是:玩家通过四个方向键来控制蛇的移动,控制其在地图上吃豆子。吃掉豆子后蛇身相应加长,蛇身速度加快。蛇运动过程中撞到墙壁或蛇身,则立即结束本轮游戏。 三. 实现功能 (1)制作一个8*8点阵的贪吃蛇游戏; (2)通过LED点阵屏为载体显示数据; (3)外接4个独立按键作为输入端,分别控制
[单片机]
基于<font color='red'>51单片机</font>的贪吃蛇游戏设计
AVR单片机的几个重要总结
转ST和AVR时都没有系统的看过相关文档,都是根据项目,拿到datasheet,备好工具就开始了,看得最多的就是feature和pins,所以经常在一些细节上疏忽了。在经历过惨痛的教训后,总结出来一些。。。。 1. 通过ISP给Tiny25下载程序时发现内置的EEPROM的数据全部被清掉,重置为0xFF了。经过多次实践,可以这样说:给AVR单片机下载程序时,内部EEPROM的数据全部会被重置,所以,如果想往EEPROM烧些初始化值的话,最好的方式是定义个.eeprom段,在烧完FLASH程序后再将生成的eep文件烧到EEPROM中去,修改Fuse和LockBits是不影响EEPROM数据的。 2. Tiny5的A/D引脚如果悬
[单片机]
AVRGCC/WinAVR编译环境中断函数的使用方法
早期版本的avr-libc 对中断服务程序的书写提供了两个宏SIGNAL 和INTERRUPT,并且需要包含两个头文件:avr/signal.h 和avr/interrupt.h。新版(如2007 版WINAVR)中,INTERRUPT 宏不再可用,而建议用ISR 宏替代SIGNAL宏,ISR 和SIGNAL 是一回事,但以后的版本中SIGNAL 宏将会逐渐被丢弃,所以新的程序建议使用ISR,也就是使用ISR作为中断服务函数名,下面将举例说明一些具体的中断使用。 一.为什么没有了INTERRUPT? INTERRUPT 宏是各中断嵌套有关的,当中断程序得到执行时AVR 的硬件将全局的中断允许标记清除,其它中断无法再发生,当中断程序
[单片机]
AVRGCC/WinAVR编译环境中断函数的使用方法
基于AT89C51单片机直流电机PWM调速程序分享
这是一款AT89C51单片机直流电机PWM调速程序,程序可以直接用于AT89C52、AT89S51、AT89S51,STC89C51、STC89C52单片机中,单片机晶振采用11.0592M,直流电机由L298集成电路控制,产生的PWM的频率约为91Hz。L298各引脚已在程序中标明,原理图大家可以自己画一下,这里就不具给出。下面是源程序。 #include[reg52.h》//注意请把‘ [ ’换成 “《”,下同。否则编译时会出错。 #include [intrins.h》// #define uchar unsigned char #define uint unsigned int sbit en1=P2^
[单片机]
基于AT89C<font color='red'>51单片机</font>直流电机PWM调速程序分享
8051单片机供水系统水位控制的硬件电路设计
供水系统水位控制原理 下图是水塔水位控制原理图。图中虚线表示允许水位变化的上下限。在正常情况下,应保持水位在虚线范围之内,为此,在水塔的不同高度安装固定不动的三根金属棒,以感知水位变化情况。其中A棒处于下限水位以下,C棒处于上限水位,B棒在下限水位处。A棒接+5V电源,B棒、C棒各通过一个电阻与模拟地相连。 水塔由电机带动水泵供水,单片机控制电机转动以达到对水位控制的目的。供水时,水位上升,当达到上限时,由于水的导电作用,B棒、C棒连通+5V电源,因此,b、c两端均为高电平“1”状态。这时,应停止电机和水泵的工作,不再给水塔供水。 当水位降到下限时,B棒、C棒都不能与A棒导通,因此,b、c两端均为“0”状态。这时,应启动电机,
[单片机]
80<font color='red'>51单片机</font>供水系统水位控制的硬件电路设计
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
  • ARM裸机篇--按键中断
    先看看GPOI的输入实验:按键电路图:GPF1管教的功能:EINT1要使用GPF1作为EINT1的功能时,只要将GPFCON的3:2位配置成10就可以了!GPF1先配 ...
  • 网上下的--ARM入门笔记
    简单的介绍打今天起菜鸟的ARM笔记算是开张了,也算给我的这些笔记找个存的地方。为什么要发布出来?也许是大家感兴趣的,其实这些笔记之所 ...
  • 学习ARM开发(23)
    三个任务准备与运行结果下来看看创建任务和任运的栈空间怎么样的,以及运行输出。Made in china by UCSDN(caijunsheng)Lichee 1 0 0 ...
  • 学习ARM开发(22)
    关闭中断与打开中断中断是一种高效的对话机制,但有时并不想程序运行的过程中中断运行,比如正在打印东西,但程序突然中断了,又让另外一个 ...
  • 学习ARM开发(21)
    先要声明任务指针,因为后面需要使用。 任务指针 volatile TASK_TCB* volatile g_pCurrentTask = NULL;volatile TASK_TCB* vol ...
  • 学习ARM开发(20)
  • 学习ARM开发(19)
  • 学习ARM开发(14)
  • 学习ARM开发(15)
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved