微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > AVR,51单片机IO结构

AVR,51单片机IO结构

时间:02-27 来源:互联网 点击:

施,例如驱动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()宏即可,直观,而且效率跟汇编是一样的。

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top