AVR IO端口的特性与应用

发布者:boyatang最新更新时间:2011-11-25 关键字:AVR  IO端口 手机看文章 扫描二维码
随时随地手机看文章

AVR的IO端口特性分析:

分析IO引脚Pxn。DDRxn 只有为1时,可控单向开关才工作,PORTxn 的数值才能通过可控单向开送到 Pxn.

结论:DDRxn=1 时,为输出状态。输出值等于PORTxn。所以,DDRxn 为方向寄存器。PORTxn 为数据寄存器。

分析上拉电阻。E的电位为0时,即D为1时,上拉电阻有效。

从与门的输入分析,只有以下的条件同时满足时,上拉电阻才有效

1。PUD 为0

2。DDxn 为0

3。PORTxn 为1

结论是:只有DDRxn = 0 即管脚定义为输入状态,并且 PORTxn=1, 而且UPD设置为0时,上拉电阻才生效。

分析 Pxn 及 SLEEP。只有当 SLEEP = 0 时,可控开关2才导通,SD1不工作,施密特触发器的输入等于Pxn, 信号送到同步器后读取。

结论:Pxn 无论在输入或输出状态都能被AVR读取。SLEEP=0时输入才能被读取。

AVR的IO端口的使用注意事项:

如果有引脚末被使用,建议些引脚赋予一个确定电平。最简单的保证未用引脚具有确定电平的方法是使能内部上拉电阻。

如果刚定义了引脚的输入状态,就要立即回读,可以在回读前,插入一句 _nop()。

系统复位时,DDR全部为0,Port也全部为0,故上拉电阻在复位时会失效。

如何用C语言操纵AVR的IO端口(以ICCAVR为例):

举例一:将PB0定义为输出,且输出为高电平

DDRB=BIT(0); //定义 PB0为输出

PORTB|=BIT(0); // PB0 输出高电平

举例二:将PB0、PB1定义为输出,且PB0输出低电平,PB1均为高电平

DDRB|=BIT(0)|BIT(1); //定义 PB0、PB1为输出

PORTB|=BIT(0)|BIT(1);// PB0、PB1 输出高电平

举例三:将PB0数据寄存器的数值翻转,即如果是1时变成0,如果是0时变成1

PORTB^=BIT(0); // PB0 输出高电平

举例四:将PB0、PB1数据寄存器的数值翻转,即如果是1时变成0,如果是0时变成1

PORTB^=BIT(0)|BIT(1); // PB0 输出高电平

举例五:将PB2、PB3定义为输入,不带上拉电阻

DDRB&=~(BIT(2)|BIT(3)); //定义 PB2、PB3为输入

PORTB&=~(BIT(2)|BIT(3)); // 将 PORT 置0,没有上拉电阻

举例六:将PB2、PB3定义为输入,带上拉电阻。即没有引用这些引脚时,缺省值为高电平

SFIOR&=~BIT(PUD); // SFIOR寄存器的上拉电阻控制位PUD置0,在整个代码中,这句话可以不出现,或仅出现一次即可。因为它是一个控制全部上拉电阻的控制位。

DDRB&=~(BIT(2)|BIT(3)); //定义 PB2、PB3为输入

PORTB|=BIT(2)|BIT(3); // 将 PORT 置1,满足上拉电阻的另一个条件

举例七:DDRB=BIT(0)|BIT(1) 与 DDRB|=BIT(0)|BIT(1) 的区别

假定在执行上面两句指令前,DDRB 的状态为: 1000 0000

如果执行 DDRB=BIT(0)|BIT(1) ,DDRB的状态变为: 0000 0011
如果执行 DDRD|=BIT(0)|BIT(1),,DDRB的状态变为: 1000 0011

那前一句会先清空以前的所有状态,后一句保留前面的状态。

在实际应用中,后一句更常用。

举例八:将第三位置1,除了用BIT(3),还有其它的表达方法吗?

DDRB|=BIT(3);

DDRB|=1>>3;

DDRB|=0x08;

DDRB|=0b00001000;

关键字:AVR  IO端口 引用地址:AVR IO端口的特性与应用

上一篇:AVR单片机定时器输出PWM的设计及注意问题
下一篇:用ATmega16驱动的LCD2004的源程序(avr)

推荐阅读最新更新时间:2024-03-16 12:47

AVR串口发送程序
ATMega32 频率: 8.0MHz 编译器:CodeVisionAVR 1.24.8c 串口发送程序 */ #i nclude mega32.h #i nclude delay.h #i nclude stdio.h #define uchar unsigned char // 0~255 #define uint unsigned int // 0~65535 #define _SPK PORTB.2 #define _LED PORTB.3 #define CLI() #asm( cli ) #define SEI() #asm( sei ) /**//*
[单片机]
AVR单片机内部RC振荡器和能隙电压基准的稳定性研究
曾经在反复研究 MEGA 48 的内部 RC 振荡器 和 能隙 电压 基准的稳定性后,选择了 MEGA 48, 用内部 RC 来驱动 做串口通信.一直都比较成功! 突然前些天, 发现上次能正常通信的软件, 通信不了了! 反复检查后, 很仔细才发现 mega48 的振荡 频率 在示波器上,略有些偏大了! 为此,我对 OS CC AL 直接加大 3 后, 通信完全正常! 于是,就该芯片我对 振荡的温度漂移做了简单的试验.希望能给大家一些参考.由于条件简陋, 我唯一改变温度的办法是 热风枪. 为了便于对比,我使用了外部的稳定的频率作参考,然后应用自己编写的自动校准软件对 片内 RC 振荡器频率进行测量 该芯片的 出厂校正参数为 A3
[单片机]
AVR 串口收发 使用循环链表实现的程序源代码
整个工程下载: http://www.rayfile.com/files/062cd042-d7a5-11df-8a51-0015c55db73d/ 关键代码: UART.h: /********** 串口收发循环链表实现 ********** * 版本.........: 1.0 * 作者.........: 陈利栋 * 目标.........: ATmega128 * 文件名.......: UART.h * 编译器.......: IAR for AVR V5.5 * 创建时间.....: 2010.10.14 * 最后修改.....: 2010.10.14 ****************************
[单片机]
<font color='red'>AVR</font> 串口收发 使用循环链表实现的程序源代码
晒自己设计的 DIY单片机多功能充电器
前几天看到有人在讨论充电器,正好闲来无事,就晒一下自己设计DIY充电器! 这个是最初设计时候的电路图,后来在具体调试过程中发现,BUCK中的MOS管和电感发热量非常大,一看波形发现原本应该是方波的波形,都成了三角波了! 我费了很多时间,查了不少资料、做实验,发现是MOS管的驱动不好,单单用一个三极管驱动是不行的(估计是由于我的管子是假的,输入电容太大),后来只好改成了用667/647的互补输出电路来驱动。 果然,驱动MOS管的波形好了不少,可是发热还是厉害,电感输入端的波形还是很差,还是发热。再找原因,后来想到是不是电感饱和了(原先是用的黑色的普通磁芯,绕一圈就有20UH的电感),于是用26号材料磁环绕了74圈达
[模拟电子]
晒自己设计的 DIY单片机多功能充电器
avr单片机数码管显示时钟
// 数码管 数据P0口,数码管控制P2口 #include avr/io.h #include avr/delay.h #include avr/pgms PAC e.h #include avr/signal.h #include avr/interrupt.h #define code PROGMEM #define uchar unsigned char #define uint unsigned int code const uchar LED _7 = {0x28, 0x7E, 0xA2, 0x62, 0x74, 0x61, 0x21, 0x7A, 0x20, 0x60,0xff};//common of
[单片机]
基于AVR单片机的SPI多机环路通信
一主机三从机的SPI通信 程序如下:主机://ICC-AVR application builder : 2012-1-13 18:56:57 // Target : M16 // Crystal: 8.0000Mhz // 完整程序下载: http://www.51hei.com/f/djhltl.rar #include iom16v.h #include macros.h #define Load_High PORTB|=(1 4) #define Load_Low PORTB&=~(1 4) unsigned char tab ={0x00,0x01,0x02,0x04,0x08,0x10,0x20,0x40,
[单片机]
基于<font color='red'>AVR</font>单片机的SPI多机环路通信
avr单片机秒表Proteus仿真程序 tm1637数码管显示
单片机源程序如下: /** *版权所有(c)2018,艁ukasz Marcin Podkalicki *2009年12月13日 *简单定时器(启动/复位/停止),使用基于TM1637的一个按钮和7段显示模块。 * *注意,这个ATtiny13项目使用的内部时钟并不精确 *时间可以向前或向后流动,但是嘿! *它仍然足够做一个好的鸡蛋计时器:) */ //#include stdint.h #include avr/io.h #include util/delay.h #include avr/interrupt.h #include tm1
[单片机]
<font color='red'>avr</font>单片机秒表Proteus仿真程序 tm1637数码管显示
AVR单片机在跳频系统数字信号处理中的应用
ATmega103单片机是ATMEL公司推出的精简指令集(RISC)AVR(ADVANCE RISC)系列单片机产品,这是一种增强型RISC结构,采用了CMOS技术的8位微控制器?该结构能有效支持高级语言以及密集度极大的汇编器代码程序。 跳频系统(FH)是指载波频率按某种跳频图案(跳频序列)在很宽的频带范围内跳变的通信系统,由于该系统具有抗干扰、抗多径和抗衰落性等能力,故在军用和民用领域都得到了广泛的应用。本系统方案中,信号处理模块主要完成跳频模式(FH)下有关数字信号的处理,包括话音编解码、话音组织及与同步有关的操作等,这些技术目前是跳频系统的关键技术之一。 本文介绍ATmega103单片机的特点及其在FH系统数字信号处
[单片机]
<font color='red'>AVR</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