AVR,51单片机IO结构
施,例如驱动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()宏即可,直观,而且效率跟汇编是一样的。
- Flash损耗均衡的嵌入式文件系统设计(06-01)
- 锁相环控制及初始化简析(08-27)
- 基于AVR单片机的ISP1362OTG设计(09-06)
- 基于AVR单片机的串口转FSK的通信模块设计(01-23)
- 案例分析:基于AVR32的隧道环境监测系统(03-18)
- 科技帮我们远离灾难:灾难检测飞行器(03-18)