340 likes | 524 Views
《 单片机应用技术 》. 电气自动化技术专业. 项目一 单片机输入输出接口. 项目功能 项目知识点与技能点 项目知识准备 项目实施. 【 项目功能 】. 1 、通过单片机的 IO 口点亮 LED 灯。 2 、 通过按键控制 LED 灯的不同点亮形式。 3 、 初步掌握 AVR 单片机的 C 语言编程和调试。. 【 项目知识点与技能点 】. 1 、 ATmega16 单片机数字 IO 口的结构。 2 、 ATmega16 单片机数字 IO 口的寄存器功能及设置方式。 3 、 74HC573 芯片的功能及使用。. 【 项目知识准备 】.
E N D
《单片机应用技术》 电气自动化技术专业
项目一 单片机输入输出接口 • 项目功能 • 项目知识点与技能点 • 项目知识准备 • 项目实施
【项目功能】 1、通过单片机的IO口点亮LED灯。 2、 通过按键控制LED灯的不同点亮形式。 3、 初步掌握AVR单片机的C语言编程和调试。
【项目知识点与技能点】 1、ATmega16单片机数字IO口的结构。 2、ATmega16单片机数字IO口的寄存器功能及设置方式。 3、74HC573芯片的功能及使用。
【项目知识准备】 ATmega16单片机有32个通用I/O接口,分为PORTA、PORTB、PORTC、PORTD四个8位接口,分别对应于芯片上的32个I/O引脚。所有的I/O接口都有复用功能。第一功能均作为数字通用I/O接口使用,而复用功能分别用于中断、定时/计数器、USART、I2C、SPI、模拟比较、捕捉等应用。
ATmega16单片机的外部引脚: DIP封装40脚 Vcc, GND 2 XTAL1, XTAL2 2 RESET 1 AVCC,GND 2 AREF 1 PA0—PA7 8 PB0—PB7 8 PC0—PC7 8 PD0—PD7 8
一、 I/O端口的基本结构 • 从图中可以看出,每组I/O口配备三个8位寄存器,它们分别是方向控制寄存器DDRx,数据寄存器PORTx,和输入引脚寄存器PINx(x=A\B\C\D)。I/O口的工作方式和表现特征由这3个I/O口寄存器控制。
二、I/O接口的寄存器 在ICCAVR C环境中,头文件“iom16v.h”中定义了许多用于控制I/O接口输入/出操作的宏,这些宏与I/O寄存器同名,通过这些宏可以控制A、B、C、D接口的输入输出操作。 当A、B、C、D接口用于数据I/O口时,通过DDRx、PORTx和PINx三个宏控制接口的输入与输出(其中x为A、B、C或D)。例如: ①DDRA为A口数据方向寄存器,用来定义A口的通讯方向(输入/输出); ②PORTA为A口数据寄存器,用来输入输出数据(输入时,PORTX为高,打开上拉电阻);当PORTx=1时,I/O引脚高电平,可提供输出20mA电流;当PORTx=0时,I/O引脚低电平,可吸纳20mA电流。因此,AVR的I/O在输出方式下提供了比较大驱动能力,可以直接驱动LED等小功率外围器件。 ③PINA用来读取A口数据(只读)。
PORTA.7 0 DDRA.7 0 DDRA.6 0 PORTA.6 0 PORTA.5 0 DDRA.5 0 PORTA.4 0 DDRA.4 0 DDRA.3 0 PORTA.3 0 PORTA.2 0 DDRA.2 0 DDRA.1 0 PORTA.1 0 DDRA.0 0 PORTA.0 0 二、I/O接口的寄存器 • 数据方向寄存器:DDRX(DDRA)-----可读写 位 复位值 • 数据寄存器:PORTX(PORTA )-----可读写 位 复位值
ADTS2 0 PINA.7 N/A PINA.6 N/A ADTS1 0 ADTS0 0 PINA.5 N/A - 0 PINA.4 N/A PINA.3 N/A PUD 0 PSR1 0 PINA.2 N/A PINA.1 N/A PSR2 0 PINA.0 N/A PSR10 0 二、I/O接口的寄存器 • 端口输入寄存器:PINX(PINA)-----只读 位 复位值 • 特殊功能寄存器:SFIOR 位 复位值 ØBIT2-PUD:Pull up disable 置位时,禁用上拉电阻,即使是将寄存器DDxn 和PORTxn 配置为使能上拉电阻,I/O端口的上拉电阻也被禁止。
二、I/O接口的寄存器 当DDRA的某位为0时,送到方向锁存器的输出端为0,相应位只能作输入。 char a; DDRA=0x0; PORTA=0x0F; a=PINA; // A口作为输入 // 低4位使用内部上拉电阻 // 读取A口的值到变量a
当DDRA的某位为1时,送到方向锁存器的输出端为1,相应位只能作输出。当DDRA的某位为1时,送到方向锁存器的输出端为1,相应位只能作输出。 如程序段: char a; a=0x11; DDRA=0xFF; PORTA=a; // 赋值00010001 // A口8脚都作输出 //将a的值通过PA口输出
与A口类似,用于对PB口控制三个特定宏为:DDRB、PINB、PORTB;用于对PC口控制三个特定宏为: DDRC、PINC、PORTC;用于对PD口控制三个特定宏为: DDRD、PIND、PORTD。 综上所述,4个并行接口的情况如表所示。 注:因为所有IO接口都具有不同的第二功能,因此实际的接口电路都与前面介绍的有所不同,要详细了解请查阅相关资料。
ATmega16单片机I/O端口的主要特点 • 双向可独立位控的I/O口。 ATmega16有A、B、C、D四个并行(8位字长)输入输出端口。能一次输入/输出一个字节的数据。 • Push-Pull大电流驱动(最大40mA)。每个I/O口输出方式均采用推挽式缓冲器输出,提供大电流的驱动,可以输出(吸入)20mA的电流,因而能直接驱动LED显示器。 • 可控制的引脚内部上拉电阻。 • DDRx可控的方向寄存器。
三、通用数字I/O接口的设置与读写操作 • 首先要根据系统的硬件设计情况,设定各个I/O口的工作方式:输入或输出工作方式,即先正确设置DDRx方向寄存,再进行I/O接口的读/写操作。当将I/O接口定义为数字输入口时,还应注意是否需要将该口内部的上拉电阻设置为有效。在设计电路时,如果能利用ATmega16单片机内部的I/O接口上拉电阻,则可节省外部的上拉电阻。 • 在ICCAVR中,可以直接使用C语言对I/O接口寄存器进行操作。
C语言:位操作 • “按位或”用于打开某一位或某几位,即置位 #include<iom16v.h> #include<macros.h> unsigned char gtmpA void main() { unsigned char tmpB; PORTA|=0x80; tmpB|=0x80; gtmpA|=0x80; } //将端口A的第七位置“1” //将局部变量的第七位置“1” //将全局变量的第七位置“1”
C语言:位操作 • “按位取反”用于关闭某一位或某几位,即清零 #include<iom16v.h> #include<macros.h> unsigned char gtmpA void main() { unsigned char tmpB; PORTA &=~0x80; tmpB &=~0x80; gtmpA &=~0x80; } //将端口A的第七位清零 //将局部变量的第七位清零 //将全局变量的第七位清零
C语言:位操作 • “按位异或”用于翻转(取反)某一位或某几位 #include<iom16v.h> #include<macros.h> unsigned char gtmpA void main() { unsigned char tmpB; PORTA ^= 0x80; tmpB ^= 0x80; gtmpA ^= 0x80; } //将端口A的第七位翻转 //将局部变量的第七位翻转 //将全局变量的第七位翻转
C语言:位操作 • “按位与”用于检查某一位或某几位是否为1 #include<iom16v.h> #include<macros.h> unsigned char gtmpA void main() { unsigned char tmpB; while(tmpB&0x80) { if(PINA&0x80) PORTA &=~0x80; else …… } } //查询局部变量第七位是否为“1” //查询PA.7是否为“1” //关闭A端口第七位
1、设置I/O接口为输出方式 • DDRA=0xFF;//PA口的0~7位设置为输出 • PORTA=0x0F;//PA口的0~3位输出为高电平,4~7位输出为低电平 • 在ICCAVR的头文件macros.h中定义 #define BIT(x) (1 << (x)) 1<<(x)表示逻辑“1”左移x位,BIT(1)为逻辑“1”左移1位,结果为0b00000010,BIT(7)为逻辑“1”左移7位0b10000000。 • DDRA|=BIT(1)|BIT(7);//PA口的第1位和第7位置高电平输出 • PORTA|=BIT(1);//PA口第1位输出高电平 • PORTA&=~BIT(7);//PA口第7位输出低电平
2、设置I/O接口为输入方式 • DDRA=0x00;//PA口的0~7位设置为输入 • PORTA=0xF0;//PA口的4~7位设置内部上拉电阻使能,0~3位的内部上拉电阻没有使用,外部引脚呈现三态高阻输入状态 • if(PINA&0x80) //判断PA口第7位的高低电平状态
2 7 6 5 4 3 1 0 第一次 第二次 需求分析: 在试验装置上有8只发光二极管接在PC口,每只发光管低电平点亮。如果按图所示的方式点亮,每次点亮两只发光管,间隔0.2秒后,再换成点亮相邻的两只,依此类推,4次后,再回到第一次,周而复始,形成彩灯的移动。 第三次 第四次 彩灯点亮示意图 四、举例
VCC PC0 PC1 PC2 PC3 PC4 PC5 PC6 PC7 0 0 0 0 0 0 0 0 彩灯控制电路 硬件电路分析: ATmega16
74LS573简介: 74HC573是并行输入,并行输出接口的8数据锁存器器件,可用在单向的并行输出/并行地址锁存等. 主要用于数码管、按键等等的控制。其引脚分布如下图所示。其中: VCC:接电源。 GND:接地。 D0~D8:数据输入端。 Q0~Q8:数据输出端。 LE:锁存使能控制端。 /OE:输出使能控制端
74LS573真值表: 表1-2 74HC573功能表
程序清单: #include <mege16.h> #include <delay.h> void main(void) { char i,j; DDRB = 0xFF; PORTB = 0x0; while(1) { j=0x01; for(i=0;i<4;i++) { PORTB=~j; delay_ms(100); j=(j<<1); } } } //设置PB口为输出口 //无限循环 //j赋初值,00000001 //取反后(低电平点亮)输出 //延时200毫秒 //j值左移一位
功能: 流程图: 按键1按下时,8个数码管顺序点亮,否则逆时针点亮。
【项目实施】 • 项目要求: • 参考实例中IO口作为输入输出的使用方法,通过不同的按键实现不同的显示方式,比如闪烁,流水灯显示等等。
【项目实施】 1、各小组内部进行小组分工,确定项目内容和实施计划,项目的内容要有创新点。 2、打开AVR Stdio软件建立AVR-ICC项目,编写程序,进行编译(各小组自行设计按键控制LED灯的亮灭情况,使用尽量多的按键和LED)。 3、编译无误,在线调试。使实训箱电源按钮处于关闭状态,IC锁紧座中放入ATmega16单片机,将DC9V/1A电源插头插入电源孔,将USB延长线接头与JTAG硬件仿真器相连接,同时将JTAG仿真器连在实训箱的JTAG接口。 4、接通74LS573芯片锁存使能端PD1,拨码开关在PC3右侧;接通8个LED灯对应的数据端口PB,拨码开关在PB0~7左侧,作为输出;LED共阳极,低电平点亮;四个按键位于实训箱右上角喇叭下方,拨通在其右侧的拨码开关,四个按键分别对应于PD4~7引脚。
【项目实施】 5、按下实训箱电源开关,打开AVRstudio 4与实训箱单片机进行通信,将编译后的文件下载到实训箱单片机中,观察运行结果,运行结果达到实训要求实训完成。 6、实训完成后,切断实训箱电源,将拨动过的拔码开关拨回到原位置,将实训用到的跳线帽拔下,将实训用到的外部接线撤下,将实训用到的器件及连线完好的放回到实训箱储物阁中。 7、完成项目报告,就本组的项目进行总结。