设计与开发

avr单片机io口 小5带你飞(1)—AVR单片机IO口位操作的方法(1)

小编 2024-11-24 设计与开发 23 0

小5带你飞(1)—AVR单片机IO口位操作的方法(1)

闲来没事,将自己以前学习AVR单片机的一些笔记给大家整理出来,方便大家来一起学习。也争取每周能整理几篇出来。

此处我使用的单片机是AVR系列的,芯片为Atmega328p,具体资源请查看官网上的该芯片的datasheet。

好的,闲话就不说了,直接上正题,对于单片机来说,可能对io口的操作是最基本的能力了。

首先我们来看一下位的操作

按位或

其实就是置位

例如:PORTA |= 0x80;

只要有一个为1就为1了,是不是最高位置位了

按位取反

其实就是清位

例如:PORTA &= ~0x80;

两个全为1才为1 ,是不是最高位清位了

按位异或

其实就是实现位的翻转

例子:PORTA ^= 0x80

相同为0,不同为1, 是不是最高位翻转了

按位与

其实可以用来检测某一位是不是为1

例子:if(PINA & 0x80)

就可以用来检测PA.7是不是为1了

下面来看几个简单的程序例子:

哦,在写demo程序之前,可能还需要来讲一点别的,

我用的开发环境时winavr,然后使用usbasp将hex烧写进板子里面,不同的开发环境,可能使用的头文件有一些出入,后期我可能只展示一些核心代码了。

可能还要讲一下控制io的寄存器

atmega328p 这个mcu的io口都是标准的双向口,这个和51是有区别的。

在复位时,所有的端口都是高阻态,啥是高阻态,不知道可以度娘了。

每一个端口,都对应3个寄存器,分别是:DDRx PORTx PINx

来看看这三个寄存器的控制作用:

DDR : 选择引脚是输入还是输出

PORT : 当io口是输入的时候,它控制有无上拉电阻,当io口是输出的时候,它控制的输出的电平情况。

PIN :读管脚的电平

总结一下:io口初始化三部曲:

使用DDR来设置端口是输入还是输入

要是输出的话,使用PORT来设置输出的是高电平还是低电平

要是输入的话,使用PINx来读取管脚的输入值,同时可使用PORT来设置管脚是不是有上来电阻。不清楚上、下拉电阻的,以后我再出一个教程。

解密51、AVR和PIC的IO口的操作的方法

I/O口的定义是:I/O 接口是主机与被控对象进行信息交换的纽带。主机通过I/O 接口与外部设备进行数据交换。绝大部分I/O 接口电路都是可编程的,即它们的工作方式可由程序进行控制。在工业控制机中常用的接口有:1.并行接口;2.串行接口;3.直接数据传送接口;4.中断控制接口;5.定时器/计数器接口。

I/O口的基本功能是:进行端口地址译码设备选择;向CPU提供I/O设备的状态信息和进行命令译码;进行定时和相应时序控制;对传送数据提供缓冲,以消除计算机与外设在“定时”或数据处理速度上的差异;提供计算机与外设间有关信息格式的相容性变换。提供有关电气的适配;还可以中断方式实现CPU与外设之间信息的交换。

由于51单片机、AVR单片机和PIC单片机IO口结构都是不相同的,所以就导致了IO口操作也不同。操作单片机IO口的目的就是为了让单片机的管脚输出逻辑电平和读取单片机管脚的逻辑电平。下面我们来看看51单片机、AVR单片机和PIC单片机IO口的操作的方法。

一.51单片机IO口的操作 51单片机IO口的结构比较简单,每个IO口只有一个IO口寄存器Px,而且这个寄存器可以位寻址,操作起来是所有单片机里最简单的,可以直接进行总线操作也可以直接进行位操作,这也是51单片机之所以成为经典的原因之一。下例的运行坏境为Keil软件,器件为AT89S52。

#include<reg52.h>

sbit bv = P2^0;//定义位变量,关联P2.0管脚。sbit是C51编译器特有的数据类型

int main(void)

{

unsigned char pv; //

//位操作,以P2口的第0位为例:

bv=0;//直接对P2口的第0位管脚输出低电平

bv=1;//直接对P2口的第0位管脚输出高电平

//总线操作输出数据,以P2口为例:

P2=0xa;//直接赋值,P2口输出数据0xaa

//总线操作读取数据,以P2口为例:

pv=P2;//直接读取P2口的数据放到pv变量

return 0;

}

二.AVR单片机IO口的操作 AVR单片机IO口的结构比较复杂,每个IO由三个寄存器组成:IO口数据寄存器POTx、IO口方向寄存器DDRx和IO口输入引脚寄存器PINx。AVR单片机IO口操作相当麻烦,需要设置IO口的方向,而且只能进行总线操作,如果进行位操作还需要掌握编程技巧---通过逻辑运算来实现位操作。下例的运行坏境为ICCAVR软件,器件为ATMEGA16。

#include<iom16v.h>int main(void){ unsigned char pv;//总线操作输出数据,以D口为例: DDRD=0xff;//先设置D口的方向为输出方式(相应位设0为输入,设1为输出) PORTD=0xaa;//赋值,D口输出数据0xaa//总线操作读取数据,以D口为例: DDRD=0x00//先设置D口的方向为输入方式(相应位设0为输入,设1为输出) PORTD=0xff;//再设置D口为带上拉电阻(相应位设0为无上拉,设1为有上拉),才能准确读取数据 pv=PIND;//读取D口的PIND寄存器的数据放到pv变量//位操作,以D口的第0位为例: DDRD|=0x01;//先设置D口第0位的方向为输出方式,其他位的方向不变 PORTD|=0x01;//D口的第0位输出高电平,技巧:使用位或运算,其他位不变 PORTD&=~0x01;//D口的第0位输出低电平,技巧:使用取反位与运算,其他位不变 return 0;}

三.PIC单片机IO口的操作 PIC单片机IO口的结构也比较复杂,每个IO由两个寄存器组成:IO口数据寄存器PORTx、和IO口方向寄存器TRISx。操作起来比AVR单片机简单一些,同样需要设置IO的方向,可以进行总线操作也可以进行位操作。下例的运行坏境为MPLAB IDE软件,器件为PIC16F877。

#i nclude<pic.h>__CONFIG(0x3B32); int main(void){ unsigned char pv;//总线操作输出数据,以B口为例: TRISB=0x00;//先设置B口的方向为输出方式(相应位设0为输出,设1为输入) PORTB=0xaa;//赋值,B口输出数据0xaa//总线操作读取数据,以B口为例: TRISB=0xff;//先设置B口的方向为输入方式(相应位设0为输出,设1为输入) pv=PORTB;//读取B口的数据放到pv变量//位操作,以B口的第0位为例: TRISB=0xfe;//先设置B口的第0位(RB0)的方向为输出方式(相应位设0为输出,设1为输入) RB0=1;//B口的第0位输出高电平 RB0=0;//B口的第0位输出低电平 return 0;}经过比较这三种单片机IO口的操作,看代码的长短,我们就能了解到,51单片机IO口结构简单,操作简单,但没有高电平大电流驱动能力;AVR和PIC单片机IO 口结构复杂,操作麻烦,但具备高电平大电流驱动能力。我们可以总结出单片机的IO口的功能越强大结构就会越复杂操作就会越繁琐。

想要学习单片机编程的同学可以持续关注华维单片机编程,与我们一起成长,喜欢的可以点个赞关注我们!

相关问答

方向寄存器DDR,数据寄存器:PORT,输入寄存器:PIN,是什么意思?怎么用?

你用的是avr单片机?单片机的每个io口都有三个寄存器控制,其中DDR和PORT是可读可写的,而PIN是只读的。DDR寄存器用来控制数据的方向,1为数据出,0为数据入。P...

avr 是什么 单片机 ?

AVR单片机是1997年由ATMEL公司研发出的增强型内置Flash的RISC(ReducedInstructionSetComputer)精简指令集高速8位单片机。AVR的单片机可以广泛应用...

STC12C5A60S2 单片机 AVR 16的功能区别?

stc12c5a60s2与51单片机区别:1、同样晶振的情况下,stc12c5a60s2速度是普通51的8~12倍对于AT89c51,1个机器周期=12个震荡周期,对于STC12C5A60S2,1...

请问 单片机 内部上拉电阻問題-ZOL问答

51单片机的P0口在输出1(高电平)时其实是高阻态,也就是输出电阻无穷大,相当于断开。高阻态显然不能向外提供电流,所以加一个上拉电阻从Vcc取电流,此时单片不给L...

单片机 和ARM有什么区别?

欢迎大家关注狗哥,学习更多单片机干货1、单片机指单芯片上集成了控制器、存储器以及如定时器、SPI、IIC等外部设备于一体的片上系统,可以用来执行复杂的功能,...

msp430、stm8、 avr 、8051、IAR有什么关系?

msp430是16位单片机,STM8和avr是8位单片机。至于8051以前是单片机型号,现在成为一种标准,这类的单片机都叫8051内核。IAR与KEIL一样,是编译软件。msp430是16...

关于max485与 单片机 连接的问题?

[回答]传统的单片机实验系统因其购买成本高、系统使用烦琐,已经越来越不适合当前以培养学生实际能力为主要方向的高等教育,本系统可以帮助学校轻松组建单...

为什么很多 单片机 的工作电压是5v?

因为大多数芯片都是5V的TTL电平,要做到电平兼容,电平匹配,避免要电平转换操作,所有很多单片机的工作电压都是5V。TTL指的是TTL电平,0~5V之间,小于0.2V输出...因...

单片机 里所谓的Arduino是什么意思?

Arduino的核心是一块AVR单片机,单片机就是一个芯片,而Arduino是一套软硬件都封装了的模块。肯定是学单片机啊,Arduino也就是玩玩而已,真正有技术含量有产品...

单片机 串口程序编写流程?

GCC只是一个编译器,和别的编译器一样。串口通讯程序一般都是这样一个流程(AVR单片机正常工作的情况下):1配置时钟,包括使能时钟,配置串口波特率。2其他配...

猜你喜欢