ATmega16 的IO口使用

合集下载

ATmega16单片机小系统板简介

ATmega16单片机小系统板简介

1.概述本单片机小系统板为一单元实验板,使用一颗基于A VR构架的A Tmega16单片机。

A Tmega16有16KB的程序存储空间,1KB内部SRAM,512B内置EEPROM。

外部共有32个GPIO,一路USART,一路主从SPI,一路I2C,两个8位定时器,一个16位定时器,4通道PWM输出,8路10位AD输入。

还有各种丰富的管脚中断和不同的时钟可供使用。

2.硬件说明1.本单片机小系统板的电源输入电压为DC 2.7--5V,科创课程实验建议使用DC 5V。

2.小系统板上的P1为下载口,可供程序烧录、eeprom数据读写、熔断丝设置。

3.小系统板上的接插件PB、PC、PD分别对应A Tmega16芯片引脚的PB、PC、PD口。

PB、PC、PD口是八位数据端口,可作为通用IO口,也可用作第二功能使用,具体请参见datasheet的相关部分。

4.小系统板上的接插件PA的1-5脚分别连接A Tmega16芯片PA口的PA0-PA4,PA0-PA4是AD转换的模拟电压输入端口,也可作为通用IO口使用。

5.小系统板上的接插件PA的9脚连接A Tmega16芯片的V ref ,10脚接地。

A Tmega16有一个标称值为2.56V的内部基准源,每颗芯片的实际值会有所不同。

6.A Tmega16 PA口的PA5-PA7作为串行数据输出到小系统板上的74HC595上,有二片74HC595驱动4位数码管和4个LED灯。

小系统板上的P2作为串行数据输出总线,可级联74HC595。

7.小系统板上的四个按钮SW1-4分别连接在A Tmega16芯片PC4-7。

按钮RST为复位键。

3.开发环境推荐的入门开发环境为A VR studio 4 + WinA VR,即使用Atmel的免费IDE A VR studio 4和基于gcc的WinA VR编译器。

软件安装这两个软件的安装非常简单,双击之后一路回车即可。

官方下载地址:A VR studio 4:/dyn/products/tools_card.asp?tool_id=2725WinA VR:/projects/winavr/files/课程FTP://202.120.39.248也会提供软件包。

ATmega16_00硬件系统基本I0口使用

ATmega16_00硬件系统基本I0口使用

时钟源
ATmega16芯片有如下几种通过Flash熔丝位进行选 择的时钟源。时钟输入到AVR时钟发生器,再分配到相 应的模块。 •缺省时钟 器件出厂时缺省设置的时钟源是1 MHz 的内部RC振 荡器,启动时间为最长。这种设置保证用户可以通过 ISP 或并行编程器得到所需的时钟源。 •晶体振荡 XTAL1 与XTAL2 分别为用作片内振荡器的反向放大 器的输入和输出,这个振荡器可以使用石英晶体,也可 以使用陶瓷谐振器。
主要构成:
AVR CPU部分 程序存储器Flash 数据存储器SRAM和EEPROM 各种功能的外围接口,IO口,以及与他们 相关的数据、控制、状态寄存器等
8位数据总线
Flash程序 存储器
程序计数器
状态和控制
指令寄存器
32× 8 通用寄存器
中断单元 SPI单元 看门狗定时器
指令译码器
2个带预分频器、具有比较、PWM功能的8位定时器/ 计数器 1个带预分频器、具有比较、捕获和PWM功能 的16位定时器/计数器 1个具有独立振荡器的异步实时时钟(RTC) 4个PWM通道 8通道10位ADC 1个I2C的串行口 1个可编程的串行USART接口 1个主/从收/发的SPI同步串行接口 带片内RC振荡器的可编程看门狗定时器WDT 片内模拟比较器
//将端口A的第七位翻转 //将局部变量的第七位翻转 //将全局变量的第七位翻转
位操作
“按位与”用于检查某一位或某几位是否为1 #include<iom16v.h> #include<macros.h> unsigned char gtmpA void main() { unsigned char tmpB; while(tmpB&0x80) //查询局部变量第七位是否为“1” { //查询PA.7是否为“1” if(PINA&0x80) PORTA &=~0x80; //关闭A端口第七位 else …… } }

ATMEGA16单片机实验

ATMEGA16单片机实验

实验一软件和硬件的认识一、实验目的:1、掌握硬件原理。

2、初步掌握实验板的使用方法。

3、熟悉软件工作界面。

二、实验仪器:ATmage16实验板一块PC机一台三、实验内容及步骤:1、插上电源,按下开关。

观察批示灯是否点亮。

电源(可输入7~12V)ATmega16管脚图2、由原理可知I/O口的批示灯为低电平亮,在实验板上取地与I/O口相接,观察是否点亮。

I/O口LED显示与接口3、打开编程界面,点击各栏,认识各栏的用途。

A VRICC IDE 软件的工作界面4、输入以下程序:#include <iom16v.h>int main(void){DDRA = 0xff;/* all outputs */DDRB = 0xff;/* all outputs */DDRC = 0xff; /*all outputs */DDRD = 0xff; /*all outputs */PORTA = 0x00; /* 输出低电平*/PORTB = 0x00; /* 输出低电平*/PORTC = 0x00; /* 输出低电平*/PORTD = 0x00; /* 输出低电平*/while(1);}观察I/O口的灯是否被点亮。

实验二I/O口的输入与输出一、实验目的:1、了解IO口的结构;2、熟悉IO口的特性;3、掌握IO口的控制。

二、实验仪器:ATmage16实验板一块PC机一台三、实验原理:作为通用数字I/O 使用时,A VR 所有的I/O 端口都具有真正的读-修改-写功能。

这意味着用SBI 或CBI 指令改变某些管脚的方向( 或者是端口电平、禁止/ 使能上拉电阻) 时不会改变其他管脚的方向( 或者是端口电平、禁止/ 使能上拉电阻)。

输出缓冲器具有对称的驱动能力,可以输出或吸收大电流,直接驱动LED。

所有的端口引脚都具有与电压无关的上拉电阻。

并有保护二极管与VCC 和地相连,如Figure23 所示。

在控制I/O时,分别由方向寄存器DDRX与数据寄存器PORTX控制I/O的状态,如下表。

ATmega16单片机端口讲解新

ATmega16单片机端口讲解新
为常用的硬件去抖,由于需要增加硬件设备,增大了系 统的复杂性,所以硬件消抖一般不常用。
软件消抖 如果按键较多,常用软件方法去抖,即检测出键闭
合后执行一个延时程序,5ms~10ms的延时,让前沿抖动 消失后再一次检测键的状态,如果仍保持闭合状态电平, 则确认为真正有键按下。
图2-13 按键消抖
3、软件算法设计——查询法
2 U9
74HC164
8
dp g f e d c b a
13 12 11 10 6 5 4 3 1
2 U10
74HC164
8
L4 R45~52
dp g f e d c b a
13 12 11 10 6 5 4 3 1
2 U11
74HC164
8
GND GND 168 GND 28 GND 39
图2-12 硬件设计
数码管的字型码——共阴极:
7பைடு நூலகம்ls164引脚图和真值 表:
A1 A2 QA QB QC QD GND
1
14
2
13
3
12
4
11
5
10
6
9
7
8
2-9 引脚图
VCC QH QG QF QE RESET CLOCK
2-10 真值表
TTL电平和CMOS电平的区 别:
TTL CMOS
VOH ≥2.4V VOL ≤0.4V
按键消抖程序:
if(!AJ1) {
__delay_cycles(80000);//延时10ms消抖 if(!AJ1) //确认有键按下
{ while(!AJ1);//等待按键释放
}
}
ATmega16的中断源:

ATMEGA16定时器0

ATMEGA16定时器0

ATMEGA16定时器0(2013-04-09 21:51:35)转载▼分类:AVR标签:avr定时器0MEGA16定时器0T/C0 是一个八位定时器,主要有定时、外部事件计数、产生PWM 波形这几个功能,我们在使用这些功能之前,首先要设置T/C0 工作在合适的工作模式下。

T/C0 有四种工作模式,分别是普通模式、CTC 模式、快速PWM、相位可调的PWM 模式四种。

模式设置通过T/C0 的控制寄存器TCCR0 来完成。

1.普通模式在此模式下,T/C0 的计数寄存器TCNT0 在时钟的驱动下不停累加。

当计满后(计数值达到最大,8 位寄存器最大计数值为0xff),由于数值的溢出寄存器清零重新开始累加。

当计数器溢出后,TIFR 中的溢出标志位TOV0 会置位,也可触发中断。

所以我们可以通过查询或中断的方式得知定时器的溢出从而进行相关处理。

此模式适合定时与计数。

关于定时和计数,这里的定时功能是T/C0 在对时钟计数达到一定的值后引发中断,达到了定时功能,然而本质的过程是计数工作。

那么这里所说的计数功能是外部事件计数。

实例:T/C0 定时实验,将T/C0 设置为普通模式,对1024 分频的系统时钟进行计数,计满发生中断,40 次中断递增一个计数用的变量,主函数则不停显示这个变量。

第一步:开总中断,SREG |= 0X80;第二步:开T/C0 溢出中断第三步:模式设置、分频设置、匹配输出模式设置T/C0 控制寄存器用于设置工作模式,时钟分频和波形输出模式。

这里T/C0 设置为普通模式,WGM00-WGM01设置为00。

此模式下定时器的TOP 值,也就是能够达到的最大计数值为0xFF。

TOV0 在计数器计满后置位,也就是计到MAX,八位的定时器计数达到255 为计满。

低三位设置定时器时钟。

T/C0 在系统时钟的分频或外部时钟的驱动下递增或递减。

系统时钟也就是晶振的大小是11.0592MHZ。

此实验中,设置为1024 分频。

atmega16存器介绍

atmega16存器介绍

串口寄存器介绍USART I/O 数据寄存器- UDRUSART 发送数据缓冲寄存器和USART 接收数据缓冲寄存器共享相同的I/O 地址,称为USART 数据寄存器或UDR。

将数据写入UDR 时实际操作的是发送数据缓冲器存器(TXB),读UDR 时实际返回的是接收数据缓冲寄存器(RXB) 的内容。

在5、6、7 比特字长模式下,未使用的高位被发送器忽略,而接收器则将它们设置为0。

只有当UCSRA寄存器的UDRE标志置位后才可以对发送缓冲器进行写操作。

如果UDRE没有置位,那么写入UDR 的数据会被USART 发送器忽略。

当数据写入发送缓冲器后,若移位寄存器为空,发送器将把数据加载到发送移位寄存器。

然后数据串行地从TxD 引脚输出。

接收缓冲器包括一个两级FIFO,一旦接收缓冲器被寻址FIFO 就会改变它的状态。

因此不要对这一存储单元使用读- 修改- 写指令(SBI 和CBI)。

使用位查询指令(SBIC 和SBIS)时也要小心,因为这也有可能改变FIFO 的状态。

USART 控制和状态寄存器A -UCSRA• Bit 7 – RXC: USART 接收结束标志(中断)接收缓冲器中有未读出的数据时RXC 置位,否则清零。

接收器禁止时,接收缓冲器被刷新,导致RXC 清零。

RXC 标志可用来产生接收结束中断( 见对RXCIE 位的描述)。

• Bit 6 – TXC: USART 发送结束发送移位缓冲器中的数据被送出,且当发送缓冲器 (UDR) 为空时TXC 置位。

执行发送结束中断时TXC 标志自动清零,也可以通过写1 进行清除操作。

TXC 标志可用来产生发送结束中断( 见对TXCIE 位的描述)。

• Bit 5 – UDRE: USART 数据寄存器空UDRE标志指出发送缓冲器(UDR)是否准备好接收新数据。

UDRE为1说明缓冲器为空,已准备好进行数据接收。

UDRE标志可用来产生数据寄存器空中断(见对UDRIE位的描述)。

Atmega16的IO使用

Atmega16的IO使用

例4.2.2二进制数输出控制
如图4-6所示为二进制数输入、输出控制的电路原理图。
图4-6 并行输入/输出应用
PC口作为输入接口使用,每一位接有上拉电阻和开关。 当开关断开时,输入为高电平,读取的结果为1;当开关 闭合时,输入为低电平,读取的结果为0。这样8个开关 s0~s7的状态可以组成一个8位的二进制输入数。如图4-7 所示,s7、s5、s2、s0断开,s6、s4、s3、s1闭合。 开关: S7 S6 S5 S4 S3 S2 S1 S0 状态: 开 闭 开 闭 闭 开 闭 开 输入值:1 0 1 0 0 1 0 1 所以,输入的二进制数为0xa5。
位控制
位控制具有把一个位变量输出到某个引脚的含义。所以 位控制时,赋值语句的左边为接口输出变量的位操作符。 例如把C口的第0位控制为高电平,可编写程序如下: DDRC=0xff; PORTC.0=1;
位运算
位运算一般有:置1、清0、取反、与、或、非、异或等运算。 置1:位变量=1; 清0:位变量=0; 取反:位变量=!位变量 与运算:位变量3=位变量1&位变量2 或运算:位变量3=位变量1|位变量2 异或运算:位变量3=位变量1^位变量2 非运算:位变量2=!位变量1
并行输入工作原理 并行输出工作原理 并行输入/输出接口工作原理
并行输入图4-1所示。引脚的 状态取决于外电路,缓冲器后的状态为引脚状态,三态门的输 出由RP端控制,当RP为0时,三态门的输出为高阻状态,数据 总线不受引脚影响;当RP为1时,三态门的输出与输入相同, 此时为读引脚状态。在读接口时,RP控制端有效。
并行输入接口某一位的简化接口电路如图:
并行输出工作原理
并行输出接口中某一位的简化接口电路如图所示。当控制端WP为0 (低电平)时,数据锁存器的输出端Q为上次输出的值,与输入端D 无关,数据总线操作不影响输出。当控制端WP为1时,数据锁存器 的输出端Q的值为输入端D的值,为输出数据状态。数据输出到引脚。 锁存器输出端Q为0时,输出为低电平;锁存器输出端Q为1时,输出 高电平。RL控制端为读取输出值。

ATmega16实验板使用说明书

ATmega16实验板使用说明书

Atmega16实验板说明书硬件资料介绍 (2)调试软件安装 (3)编译环境的使用 (8)建立新的工程 (15)资料和例程 (18)注意:使用时先把调试器和开发板用数据线连起来,再插上USB线;停止使用时应先断开USB线切断电源,才能拔下数据线,否则可能会损坏调试器。

硬件资料介绍实验套件共分3部分,开发板,调试器,数据线(1根usb线,1根串口线)。

开发板文件夹图片/原理图里面有开发板的原理图图片和protel dxp 原理图文件。

如果开发板是没有焊好的套件可以对照元器件参数表和已焊好的图片(图片文件夹里有)先把开发板焊接完成。

焊接完成后先用万用表测量一下5V 与GND 之间是否短路,确定没有短路之后,插上USB 线接到电脑上,弹上开关SW1电源指示灯D1亮,说明电源已接通。

调试器调试软件安装要实现开发调试需要安装三个软件:PL2303驱动,avr studio 4,WinAVR。

这三个软件都在软件这个文件夹里。

首先安装usb驱动PL2303,如图点下一步。

点完成就可以了。

然后把调试器和电脑通过USB线联机。

如图这时调试器上的电源指示灯和信号指示灯都亮,而且电脑开始发现新硬件,新硬件可以安装使用。

这说明已经建立起连接,然后右击我的电脑—>属性—>硬件—>设备管理器,打开设备管理器界面,点开端口(COM和LPT)的“+”如图。

其中的Prolific usb-to-Serial Comm Port(COMx)就是调试器的usb设备。

端口号是多少根据个人电脑情况可能有差异。

下面我们要修改端口号,因为调试器里只提供COM1-COM3的通讯。

双击Prolific usb-to-Serial Comm Port(COMx)选项,弹出端口设置对话框,如图然后选端口设置—>高级,在端口号中选一个没有被占用且3以内的COM口,我的电脑上没有串口,我选的是COM1,如图然后点确定,重新打开设备管理器再看一下端口情况。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

项目一:ATmega16 的I/O口使用一、项目内容:(1)、通过I/O口操作8位发光二极管跑马灯;(2)、通过I/O口驱动数码管;(3)、通过I/O口驱动1602字符点阵型液晶显示模块;(4)、利用I/O口完成键盘的设计与使用。

二、项目目标:(1)、掌握本课程学习的基本载体;(2)、熟悉并掌握C语言的基本语法、常用的语句指令、函数的结构;(3)、掌握ATmega16的I/O口使用;三、项目任务:1、8位LED跑马灯程序:#include"iom16v.h"void Delay_l_ms(void){unsigned char cnt_i,cnt_j;for(cnt_i=0;cnt_i<40;cnt_i++){for(cnt_j=0;cnt_j<33;cnt_j++){}}}void Delay_n_ms(unsigned int n_ms){unsigned int cnt_i;for(cnt_i=0;cnt_i<n_ms;cnt_i++){Delay_l_ms();}}void main(void){unsigned char cnt_i;DDRD=0xFF;PORTD=0xFF;while(1){for(cnt_i=0;cnt_i<8;cnt_i++){PORTD=(0x80>>cnt_i);Delay_n_ms(200);}for(cnt_i=8;cnt_i>0;cnt_i--){PORTD=(0x80>>cnt_i);Delay_n_ms(200);}}}仿真图:绘制仿真图,添加程序后,发光二极管按D0到D7再从D7到D0顺序循环发光。

原理图:电路板图:八位LED跑马灯电路板图2、数码管静态显示程序:#include"iom16v.h"const unsigned char Num_Dis_TAB[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};void Delay_1_ms(void){unsigned char cnt_i,cnt_j;for(cnt_i=0;cnt_i<40;cnt_i++){for(cnt_j=0;cnt_j<33;cnt_j++){}}}void Delay_n_ms(unsigned int n_ms){unsigned int cnt_i;for(cnt_i=0;cnt_i<n_ms;cnt_i++){Delay_1_ms();}}void LED_Dis_Static(unsigned char dis_num){PORTD=Num_Dis_TAB[dis_num];PORTB=(1<<2);}void main(void){unsigned char dis_temp;DDRD=0xFF;DDRB=0xFF;PORTD=0xFF;PORTB=0xFF;while(1){for(dis_temp=0;dis_temp<10;dis_temp++){LED_Dis_Static(dis_temp);Delay_n_ms(200);}}}仿真图:数码管静态显示仿真图仿真过程:打开仿真图,输入程序,四位数码管由0开始,按0、1、2、3、4、5、6、7、8、9循环显示。

原理图:数码管静态显示原理图电路板图:数码管静态显示电路板图3、按键设计程序:#include "iom16v.h"const unsigned char num_dis_tab[]={0x3f,0x06,0x5b,0x4f,0x66,0x92,0x82,0xf8,0x80,0x90}; void delay_1ms(void){unsigned char cnt_i,cnt_j;for(cnt_i=0;cnt_i<40;cnt_i++){for(cnt_j=0;cnt_j<33;cnt_j++){}}}void delay_nms(unsigned int n_ms){ unsigned int cnt_i;for(cnt_i=0;cnt_i<n_ms;cnt_i++){delay_1ms();}}void led_dis_static(unsigned char dis_num){PORTD=num_dis_tab[dis_num];PORTB=(1<<2);}unsigned char get_key_value(){unsigned char key_val,read_key;DDRB&=~(1<<0);DDRB&=~(1<<1);DDRB&=~(1<<2);DDRB&=~(1<<3);PORTB|=(1<<0)+(1<<1)+(1<<2)+(1<<3);read_key=(PINB&0x0f);if(read_key!=0x0f){switch(read_key){case 0x0e:key_val=1;break;case 0x0d:key_val=2;break;case 0x0b:key_val=3;break;case 0x07:key_val=4;break;}do{delay_nms(10);}while(read_key==0x0f)}return key_val;}void main(void){unsigned char key_val;DDRD=0xff;PORTD=0xFF;PORTB=0xff;DDRB=0xff;DDRB&=~(1<<0);DDRB&=~(1<<1);DDRB&=~(1<<2);DDRB&=~(1<<3);PORTB=0xff;while(1){key_val=get_key_value();led_dis_static(key_val);}}仿真图:仿真过程:打开仿真图,输入程序。

当按1键时,数码管显示1;当按2键时,数码管显示2;当按3键时,数码管显示3;当按4键时,数码管显示4。

电路板图:按键设计电路板图原理图:按键设计原理图4、1602字符点阵液晶显示模块的使用程序:#include "iom16v.h"#include "macros.h"#define LCM_RS_1 PORTB|=(1<<7)#define LCM_RS_0 PORTB&=(~(1<<7))#define LCM_RW_1 PORTB|=(1<<6)#define LCM_RW_0 PORTB&=(~(1<<6))#define LCM_E_1 PORTB|=(1<<5)#define LCM_E_0 PORTB&=(~(1<<5))const unsigned char LCM_Dis_String[]="welcome to hcit"; void Delay_1_us(void){NOP();NOP();NOP();NOP();}void Delay_n_us(unsigned int n_us){unsigned int cnt_i;for(cnt_i=0;cnt_i<n_us;cnt_i++){Delay_1_us();}}void Delay_1_ms(void){unsigned char cnt_i,cnt_j;for(cnt_i=0;cnt_i<40;cnt_i++){for(cnt_j=0;cnt_j<33;cnt_j++){}}}void Delay_n_ms(unsigned int n_ms){unsigned int cnt_i;for(cnt_i=0;cnt_i<n_ms;cnt_i++){Delay_1_ms();}}unsigned char LCM_Re_BAC(){unsigned char status;DDRD=0x00;LCM_RS_0;LCM_RW_1;LCM_E_1;Delay_n_us(1);status=PIND;LCM_E_0;return status;}void LCM_Wr_CMD(unsigned char cmd_dat) {while(LCM_Re_BAC()>=0x80);DDRD=0xFF;LCM_RS_0;LCM_RW_0;LCM_E_1;PORTD=cmd_dat;Delay_n_us(1);LCM_E_0;}void LCM_Wr_DAT(unsigned char dis_dat) {while(LCM_Re_BAC()>=0x80);DDRD=0xFF;LCM_RS_1;LCM_RW_0;LCM_E_1;PORTD=dis_dat;Delay_n_us(1);LCM_E_0;Delay_n_us(40);}void LCM_1602_Init(void){LCM_Wr_CMD(0x38);Delay_n_ms(5);LCM_Wr_CMD(0x38);Delay_n_ms(5);LCM_Wr_CMD(0x38);Delay_n_ms(5);LCM_Wr_CMD(0x0e);Delay_n_ms(5);LCM_Wr_CMD(0x06);Delay_n_ms(5);LCM_Wr_CMD(0x01);Delay_n_ms(5);}void main(void){unsigned char cnt_temp;DDRB=0xFF;DDRD=0xFF;while(1){LCM_1602_Init();cnt_temp=0;LCM_Wr_CMD(0x80);while(LCM_Dis_String[cnt_temp]!='\0'){LCM_Wr_DA T(LCM_Dis_String[cnt_temp++]);Delay_n_ms(200);}cnt_temp=0;LCM_Wr_CMD(0xc0);while(LCM_Dis_String[cnt_temp]!='\0'){LCM_Wr_DA T(LCM_Dis_String[cnt_temp++]);Delay_n_ms(200);}}}仿真图:仿真过程:打开仿真图,输入程序,液晶显示块按要求显示内容。

相关文档
最新文档