AVR学习笔记

合集下载

AVR学习笔记

AVR学习笔记

AVR学习笔记前言:学习一块单片机,我们要几项准备工作:1.开发软件(熟悉开发软件操作流程,基本上开发软件都差不多的,学会了一款,再学其它的就会很顺手了(新建工程、新建设计文件、把源文件加到工程里面、最后设置一些参数)2.编程语言(这个就不用说了,先学语法规则,能够熟练掌握到自己写的代码没有语法错误,然后再逐步把自己的想法驾驭到编程语言上)3.硬件(硬件包括的范围很广,不仅包括你所要学的单片机还有单片机的外围电路所用到的器件),最好要学一款仿真软件。

我们始终要记住学单片机绝对不可以纸上谈兵,一定要实践,就是把自己所写的代码下载到板上,看看实际效果。

开发板可以买,也可以自己做!我喜欢自己做。

实验一:点亮发光二极管1.avr单片机的i/o端口1)学习单片机的主要任务就是了解、掌握单片机i/o端口的功能,以及如何正确设计这些端口与外围电路的连接,从而能够组成一个嵌入式系统,并编程、管理和运用他们完成各种各样的任务。

2)atmega16有4个8位的双向i/o端口pa、pb、pc、pd,他们对外对应32个i/o引脚,每一位都可以独立地用于逻辑信号的输入和输出。

在5v工作电压下,输出高点平时,每个引脚可输出达20ma的驱动电流;而输出低电平时,每个引脚可吸收最大为40ma的电流,可以直接驱动发光二极管(一般的发光二极管的驱动电流为10ma)和小型继电器等小功率器件。

avr大部分的i/o端口都具备双重功能(有的还有第三功能)。

其中第一功能是作为数字通用i/o接口使用,而复用的功能可分别与片内的各种不同功能的外围接口电路组合成一些可以完成特殊功能的i/o口,如定时器、计数器、串行接口、模拟比较器、捕捉器、usart、spi等。

3)avr单片机的每组i/o口都搭载存有三个8为寄存器,分别就是:方向掌控寄存器ddrx、数据寄存器portx、输出插槽寄存器pinx(x=a/b/c/d).i/o口的工作方式和整体表现特征由这三个i/o寄存器掌控。

AVR单片机一些学习笔记

AVR单片机一些学习笔记

AVR 单片机一些学习笔记
下面是自己在学习AVR 单片机时的学习经验,分享出来给大家,一起
学习。

1、AVR 单片机采用RISC 架构,8051 单片机采用CISC 架构。

前者速度为后者的2~4 倍,为流水线操作指令。

2、AVR 单片机有32 个通用寄存器(地址在RAM 区从$0000 开始到$001F),其中有6 个(最后6 个)合并为3 个16 位的X,Y,Z 寄存器,用来存放地址指针,Z 寄存器还可以寻址程序存储器。

3、哈佛结构,131 条机器指令。

4、延迟开机功能。

5、内部自带RC 振荡器,可提供1/2/4/8MHZ 的工作时钟。

6、FLASH+EEPROM+SRAM+SPI+USART+TWI+PWM+RTC+10 位ADC+模拟比较器+JTAG。

7、堆栈指针向下增长,51 单片机向上增长。

8、程序存储器按字来访问,擦除和写入以页为单位。

AVR学习笔记三、定时记数器0实验

AVR学习笔记三、定时记数器0实验

A VR学习笔记三、定时/记数器0实验-------基于LT_Mini_M163.1 定时/计数器0的计数实验3.1.1、实例功能定时/计数器(Timer/Counter)是单片机中最基本的接口之一,它的用途非常广泛,常用于计数、延时、测量周期、频率、脉宽、提供定时脉冲信号等。

在实际应用中,对于转速,位移、速度、流量等物理量的测量,通常也是由传感器转换成脉冲电信号,通过使用定时/计数器来测量其周期或频率,再经过计算处理获得。

相对于一般8位单片机而言,AVR不仅配备了更多的定时/计数器接口,而且还是增强型的,如通过定时计数器与比较匹配寄存器相互配合,生成占空比可变的方波信号,即脉冲宽度调制输出PWM信号,用于D/A、马达无级调速控制、变频控制等,功能非常强大。

ATmega16一共配置了2个8位和1个16位,共3个定时/计数器,它们是8位的定时计数器T/C0、T/C2和16位的定时/计数器T/C1。

在接下来的几个实例中,我们将逐一学习这些定时/计数器的各种功能和使用方法。

在前面的实例中,我们已经学习了利用单片机的I/O口进行按键的输入检测,并实现了将按键按下次数在数码管上进行显示。

使用的方法是不停的检测端口状态,每检测到一次电平变化记录一次,这样实现起来未免有些重复劳动的嫌疑,那么有没有一种方法可以不用每次都这么辛苦呢?答案是肯定的!我们可以使用定时/计数器的计数功能实现对外部事件(电平变化次数、脉冲个数等)进行计数。

在本实例中,我们利用ATmega16单片机的定时/计数器0的计数功能实现对按键次数的检测,并通过LED的亮灭来指示程序的运行状态。

本实例共有3个功能模块,分别描述如下:●单片机系统:检测按键的按下,通过LED灯的亮灭指示按键按下次数。

●外围电路:按键检测电路以及显示按键状态的LED显示电路。

●软件程序:熟悉掌握ATmega16单片机的定时/计数器0的计数程序的编写。

3.1.2、器件和原理本实例首先介绍ATmega16单片机的定时/计数器0的功能,然后详细介绍如何利用定时/计数器0实现对外部事件进行计数的功能。

AVR学习笔记十九、4X4矩阵键盘实验

AVR学习笔记十九、4X4矩阵键盘实验

A VR学习笔记十九、4X4矩阵键盘实验19.1 实例功能在前面的实例中我们已经学习了在单片机系统中检测独立式按键的接口电路和程序设计,独立式按键的每个按键占用1位I/O口线,其状态是独立的,相互之间没有影响,只要单独测试链接案件的I/O口线电平的高低就能判断键的状态。

独立式按键电路简单、配置灵活,软件结构也相对简单。

此种接口方式适用于系统需要按键数目较少的场合。

在按键数量较多的情况下,如系统需要8个以上按键的键盘时,采用独立式接口方式就会占用太多的I/O口,这对于I/O口资源不太丰富的单片机系统来说显得相当浪费,那么当按键数目相对较多的时候,为了减少I/O口资源的占用,应该采取什么样的方式才能够既满足多按键识别,又减少I/O口的占用呢?当然我们可以采用端口扩展器件比如串并转换芯片实现单片机I/O口的扩展,但是这种方式既增加了电路的复杂性,又增加了系统的成本开销。

有没有比较经济实惠的方法呢?事实上,在实际引用中我们经常采用矩阵式键盘的方式来节约I/O口资源和系统成本。

在这个实验中,我们采用4X4矩阵键盘来实现使用8个I/O口识别16个按键的实验,本实例分为三个功能模块,分别描述如下:●单片机系统:利用A Tmega16单片机与矩阵键盘电路实现多按键识别。

●外围电路:4X4矩阵键盘电路、LED数码管显示电路。

●软件程序:编写软件,实现4X4矩阵键盘识别16个按键的程序。

通过本实例的学习,掌握以下内容:●4X4矩阵键盘的电路设计和程序实现。

19.2 器件和原理19.2.1 矩阵键盘的工作原理和扫描确认方式当键盘中按键数量较多时,为了减少对I/O口的占用,通常将按键排列成矩阵形式,也称为行列键盘,这是一种常见的连接方式。

矩阵式键盘接口见图1所示,它由行线和列线组成,按键位于行、列的交叉点上。

当键被按下时,其交点的行线和列线接通,相应的行线或列线上的电平发生变化,MCU通过检测行或列线上的电平变化可以确定哪个按键被按下。

AVR复习笔记--AVR单片机SPI多机通讯

AVR复习笔记--AVR单片机SPI多机通讯

AVR复习笔记--AVR单片机SPI多机通讯
最近决定复习下AVR 单片机,其实也是为了借此复习下几种简单的通
信协议,包括串口,SPI,I2­C 等。

本来以为一两个晚上就能搞定的事儿,
没想到竟耗费了一周晚上空余的时间。

当然主要是这次的要求要提高点,实现SPI 的多机通信,
不但要发数据还要回传数据。

实际中还是遇到了比我想象中要大的多的困难。

即使是现在的实现方式也不是很理想。

下面是spi 部分的代码,由于spi 接收发送用的同一终端,感觉使用起来形式
不怎么样,还是采用了轮询标志位的方式
Code#include”spi.h”staticcharmode=1;voidspi_init(charflag){chartmp=0;mode=flag; if(mode==1){DDR_SPI=(1 在我的例子中有一个主机,两个从机
进行如下通信
发送至1 号从机1 ,2
发送至2 号从机3 ,4
发送至1 号从机5 ,6
发送至2 号从机7 ,8
从机1 收到数据后回传1
从机2 收到数据后回传2
下面还是看代码
Code#include”basic.h”//自己写的常用函式#include”usart.h”//usart初始化函式
#include”spi.h”intmain(void){chartmp;usart_init(9600);spi_init(1);PORTB|=(1。

AVR自学笔记

AVR自学笔记

RXB8(bit1):接收数据位 8 TXB8(bit0):发送数据位 8 *UCSRC: URSEL(bit7):读 UCSRC 时为 1,写 UCSRC 时为 1(?)(编译器自动处理) UMSEL(bit6):0,异步。1,同步 UPM1~UPM0(bit5、4):奇偶校验模式
USBS(bit3):停止位数选择;0 时,1bit 停止位,1 时,2bit 停止位 UCSZ1~UCSZ0(bit2、1):字符长度设置
一、基础知识 1.开发工具: 编辑与编译软件:WinAVR 仿真软件:AVR Studio 下载软件:AVR_fighter、MuCodeISP 等 在需要在中断函数中被修改的全局变量需要用 volatile 关键字声明 2.第一个简单的 AVR 程序 AVR 引脚排列:
ATMega8 引脚排列
ATMega16 引脚排列
*PWM 输出频率计算公式(快速 PWM 模式)
*PWM 输出频率计算公式(相位修正 PWM 模式)
4. 异步串行口 USART(同步或异步): ①相关寄存器:UDR(数据寄存器)、UCSRA(控制与状态寄存器 A)、UCSRB(控制与状态寄存器 B)、UCSRC (控制与状态寄存器 C)、UBRRL(波特率寄存器 L)、UBRRH(波特率寄存器 H) ②三个中断源:发送结束中断、发送数据寄存器空中断、接收完成中断(常用) ③寄存器介绍 *UDR: 8 位数据寄存器,接收和发送为同一地址的不同寄存器 *UCSRA:
②注意 OCR0(输出比较寄存器)用于输出比较,产生事件匹配中断,这里没有列出 *TCCR0:
FOC0(bit7):强制输出比较,仅在 WGM00 指明非 PWM 模式时才有效 WGM00、WGM01(bit6、3):波形产生模式

AVR笔记

AVR笔记

1.输入状态IO寄存器设置DDRx某一位置0,相应位的IO口被设置为输入输出|=(置1),输入&=~(置0)PORTx某一位置1,使能对应IO口相应位的上拉电阻PINx的对应位是输入的数据,0或1头文件是includ <avr/io.h>2.ISC2为0时,外部中断2是下降沿触发,为1时,是上升沿触发。

3. 4.1.2.T/C寄存器在全局变量前加volatile,这个变量才能应用在中断程序中USART 1.2.GCC编程1)另外,宏_BV(bit) 是我们操作I/O 寄存器时频繁用到的,avr-libc 建议使用这一宏进行寄存器的位操作,它在文件sfr_defs.h 中定义如下:#define _BV(bit) (1 << (bit))2)avr-libc 建议使用一组数据类型符号,这些数据类型的定义在头文件inttype.h 中,头文件的包含形式如下:#include <inttype.h>其中定义了常用的整数类型如下表所示3)const int n = 5;4)int a[n];注意:在ANSI C中,这种写法是错误的,因为数组的大小应该是个常量,而const int n,n只是一个变量(常量!= 不可变的变量,但在标准C++中,这样定义的是一个常量,这种写法是对的),实际上,根据编译过程及内存分配来看,这种用法本来就应该是合理的,只是ANSI C对数组的规定限制了它。

5)那么,在ANSI C 语言中用什么来定义常量呢?答案是enum类型和#define宏,这两个都可以用来定义常量。

6)在程序中访问 FLASH 程序存储器avr-libc 对FLASH 存储器的读写支持API 和宏在头文件pgmspace.h中定义,在源文件中的包含形式如下:#include < avr/pgmspace.h >在程序存储器内的数据定义使用关键字__attribute__((__progmem__))。

AVR学习笔记

AVR学习笔记

PC = progammer counter //程序计数器ACC = accumulate //累加器PSW = progammer status word //程序状态字SP = stack point //堆栈指针DPTR = data point register //数据指针寄存器IP = interrupt priority //中断优先级IE = interrupt enable // 中断使能TMOD = timer mode //定时器方式 (定时器/计数器控制寄存器)ALE = alter (变更,可能是)PSEN = progammer saving enable //程序存储器使能(选择外部程序存储器的意思) EA = enable all(允许所有中断)完整应该是 enable all interruptPROG = progamme (程序)SFR = special funtion register //特殊功能寄存器TCON = timer control //定时器控制PCON = power control //电源控制MSB = most significant bit//最高有效位LSB = last significant bit//最低有效位CY = carry //进位(标志)AC = assistant carry //辅助进位OV = overflow //溢出ORG = originally //起始来源DB = define byte //字节定义EQU = equal //等于DW = define word //字定义E = enable //使能OE = output enable //输出使能RD = read //读WR = write //写中断部分:INT0 = interrupt 0 //中断0INT1 = interrupt 1//中断1T0 = timer 0 //定时器0T1 = timer 1 //定时器1TF1 = timer1 flag //定时器1 标志 (其实是定时器1中断标志位)IE1 = interrupt exterior //(外部中断请求,可能是)IT1 = interrupt touch //(外部中断触发方式,可能是)ES = enable serial //串行使能ET = enable timer //定时器使能EX = enable exterior //外部使能(中断)PX = priority exterior //外部中断优先级PT = priority timer //定时器优先级PS = priority serial //串口优先级第一部分二极管发光的条件是正负极相差达1V以上。

AVR学习笔记

AVR学习笔记

一、AVR的PC口正常使用:1、在程序中连续写入两条语句:MCUCSR |= BIT(7);( 或者是MCUCSR =(1<<7); )。

2、将熔丝位OCDEN 和JTAGEN 设置为0,关闭仿真功能。

编译时出现错误警告:!E <library>(72): area 'data' not large enough解决方法:project----compiler----勾上Treat"const"as"_flash"解释:将定义的const较大数组装入flash.二、如何通过AVR_fighter对EEPROM编程:在运用ICCAVR编程时对需要写入EEPROM的数据作如下处理:///////////////////////////////////////////////////////#pragma data:eepromunsigned char table[]={0x01,0x02} //定义要写入EEROM的数据#pragma data:data并将#include <eeprom.h> 加入C代码中。

////////////////////////////////////////////////////////通过以上处理后的数据在编译时会被ICCAVR编译生成*.eep文件,将此文件加入AVR_fighter的装EEPROM ,AVR_fighter在编程flash时相应会编程EEPROM。

三、将SPI初始化为主机,进行简单的数据发送。

例子中SSR_SIP必须由实际的数据方向寄存器代替。

void spi_maxterinit (void){DDR_SPI = (I<<DD_MOSI)|(1<<DD_SCK); //设置MOSI和SCK为输出,其他为输入SPCR = (1<<SPE)|(1<<SPR0); //使能SPI主机模式,设置时钟速率为fck/16}void SPI_MasterTransimt(char cData){SPDR = cData; //启动数据传输while(!(SPRS & (1<<SPIF))); //等待传输结束}///////////////////////////////////////////////////////////////////////////////////////////////////////////例子假定已经饱含了正确的头文件:Void SIP_SlaveInit(void){DDR_SPI = (1<<DD_MISO); //设置MISO为输出,其他为输入SPCR = (1<<SPE); //使能SPI}Char SPI_SlaveReceive(void){While (!( SPSR & (1<<SPIF ))){};Return SPDR;}四、对一个十六进制数的某一位取反Num = num^( 1<< wei );五、STC自动下载:Include <reg52.h>Sfr ISP_CONTR =0XE7;sbit ISP=P3^0;void main(void){TMOD |= 0X01;TH0=0X00;TL0=0X00;EA=1;ET0=1;TR0 =1;}void Timer0_isr(void) interrupt 1 using 1{TH0=0x00; //重新赋值TL0=0x00;while(ISP==0){ISP_CONTR=0XE0;}}。

马伟力AVR笔记:六、模拟比较器和ADC实验

马伟力AVR笔记:六、模拟比较器和ADC实验

AVR学习笔记六、模拟比较器和ADC实验-------基于LT_Mini_M166.1 模拟比较器实验6.1.1实例功能模拟比较器和模数转换ADC是单片机内部最常见的两种支持模拟信号输入的功能接口。

大部分AVR都具备这两种类型的接口。

本实例将以ATmage16芯片为例,介绍模拟比较器的使用方法,在下一个实例中介绍模数转换ADC。

使用模拟比较器可以实现单片机系统电源电压的检测,更巧妙的应用是利用模拟比较器和一些简单的外围电路,设计简单的模数转换ADC。

本实例实现利用模拟比较器比较某一点电压与内部模拟比较器参考电压的高低。

共有3个功能模块,分别描述如下:●单片机系统:使用ATmega16单片机的模拟比较器比较某一点的电压与参考电压的关系。

●外围电路:利用电阻设计的分压电路。

●软件程序:熟悉掌握ATmega16单片机的模拟比较器的使用。

通过本实例的学习,掌握相关电路设计,并掌握以下知识点:●了解单片机的模拟比较器。

●了解单片机的模拟比较器的使用。

●掌握单片机模拟比较器的编程。

6.1.2、器件和原理1、模拟比较器的介绍ATmega16的模拟比较器可以实现对两个输入端:正极AIN0和负极AIN1(分别对应于ATmage16的引脚PB2、PB3)的模拟输入电压进行比较。

当AIN0上的电压高于AIN1的电压时,模拟比较器输出ACO被设为“1”。

比较器的输出还可以被设置作为定时计数器1输入捕获功能的触发信号。

此外,比较器的输出可以触发一个独立的模拟比较器中断。

用户可以选择使用比较器输出的上升沿、下降沿或事件触发作为模拟比较器中断的触发信号。

2、与模拟比较器相关的寄存器与模拟比较器相关的寄存器是SFIOR、ACSR。

用户通过这两个寄存器的相关位实现对模拟比较器的设置和控制。

1)特殊功能IO寄存器—SFIOR时模数转换(ADC)功能被关闭(ADCSRA寄存器中的ADEN使能位为“0”)时,允许使用ADC 多路复用器选择ADC的模拟输入端口作为模拟比较器反向端的输入信号源。

AVR笔记:外部中断

AVR笔记:外部中断

A VR学习笔记之【外部中断】【一】Mega16共有三个外部中断,外部中断相比定时器而言它的寄存器比较少,因此相对比较简单。

我们现在只关心需要用的部分,其他的暂且放弃不管。

和外部中断相关的特殊功能寄存器有:①MCU控制寄存器(MCUCR)在上面八位的寄存器中,白色的部分使我们要关心的,灰色部分就不用管了。

资料上对后面四位(第四位)的作用有介绍。

ISC11与ISC10控制中断1的触发方式。

下表为ISC10/11的值对应触发方式:SC11与ISC10控制中断0的触发方式。

下表为ISC00/01的值对应触发方式:我们在使用外部中断0和1的时候,其触发方式的设置便是通过以上ISC的不同值实现的。

至于INT2下面有介绍。

②MCU控制与状态寄存器(MCUCSR)这个寄存器只有一个BIT与外部中断相关。

ISC2,我们通过和INT0/1的对比可以发现ISC的后缀数字命名只有规律的,这会方便我们记忆。

同时在说明文档上说了很长一段关于ISC2的说明:他的意思说早了,他也就是想说:ISC=0的话INT2是下降沿出发中断,ISC=1是上升沿出发。

这才是应该说明的最重要的点。

他后面还说了:(1)如果你让ISC=0那么外部的低电平必须保持到当前正在运行的指令运行结束才会出发,换一句意思就是,如果外部时间过短,有可能导致INT2不被触发。

(2)他又说明,如果改变ISC2的值的话有可能触发中断,导致误判,因此如果你想改变其中断触发方式的话,首先把通用中断控制寄存器(GICR)里面控制INT2的中断开关关了,这样便不会触发中断了。

③通用中断控制寄存器(GICR)他就是个中断开关。

前面三位依次赋值便会打开响应中断。

当然总中断开关也要打开才行(SREG|=BIT(7))。

④通用中断标志寄存器(GIFR)他就是一个中断标志,我们也就是说在中断发生的时候中断对用的标志会变为1,此时程序会自动转到中断程序子函数。

然后有硬件自动清零,以等待下一次的中断发生。

AVR单片机嵌入式系统原理与应用实践——学习笔记上课讲义

AVR单片机嵌入式系统原理与应用实践——学习笔记上课讲义

A V R单片机嵌入式系统原理与应用实践——学习笔记AVR单片机嵌入式系统原理与应用实践学习笔记1.AVR单片机的基本结构1.1.单片机的基本组成1.1.1.单片机的基本组成结构单片机的基本组成单元➢CPU➢程序存储器➢数据存储器➢I/O接口CPU与各基本单元通过芯片内的内部总线连接。

一般情况下,内部总线中的数据总线宽度(或指CPU字长)也是单片机等级的一个重要指标。

内部总线:数据总线、地址总线、控制总线。

1.1.2.单片机的基本单元与作用1)MCU单元MCU单元部分包括CPU、时钟系统、复位、总线控制逻辑等电路。

➢CPU:➢时钟和复位电路:➢总线控制电路:2)片内存储器单片机的存储器一般分为程序存储器和数据存储器,它们往往构成互不相同的两个存储空间,分别寻址,互不干扰。

单片机的内部结构通常使用哈佛体系结构,在这种体系中采用分开的指令和数据总线以及分开的指令和数据空间,分别采用专用的总线与CPU交换,可以实现对程序和数据的同时访问,提高了CPU的执行速度和数据的吞吐量。

3)程序存储器程序存储器用于存放嵌入式系统的应用程序。

4)数据存储器单片机在片内集成的数据存储器一般有两类:随机存储器RAM、电可擦除存储器EEPROM。

➢随机存储器RAM:➢电可擦除存储器EEPROM5)输入输出端口➢并行总线I/O端口:➢通用数字I/O端口:➢片内功能单元的I/O端口:➢串行I/O通信口:➢其他专用接口:6)操作管理寄存器管理、协调、控制、操作单片机芯片中各功能单元的使用和运行。

1.2.ATmega16单片机的组成1.2.1.AVR单片机的内核结构“快速访问”意味着在一个周期内执行一个完整的ALU操作。

AVR的算术逻辑单元ALU支持寄存器之间、立即数与寄存器之间的算术与逻辑运算功能,以及单一寄存器操作。

每一次运算操作的结果将影响和改变状态寄存器(SREG)的值。

ALU操作➢从寄存器组中读取两个操作数➢将执行结果写回目的寄存器➢操作数被执行1.2.2.ATmega16的外部引脚与封装I/O引脚共32只,分成PA、PB、PC、PD4个8位端口,它们全部是可编程控制的多功能复用的I/O引脚。

AVR学习笔记二、基本输入和外部中断实验

AVR学习笔记二、基本输入和外部中断实验

A VR学习笔记二、基本输入和外部中断实验-------基于LT_Mini_M162.1 利用按键控制发光二极管的亮灭2.1.1 实例功能在“点亮发光二极管”和“让发光二极管动起来”这两个例子中,都是通过单片机程序来控制发光二极管的亮灭。

如果想要控制发光二极管的亮灭,只有通过打开或者关闭电源来实现控制。

那么怎样实现人工参与控制呢?在有些应用场合,需要单片机对人工的开关信号作出相应的响应和处理,通过控制电源的通断会影响到单片机系统中的其他功能,所以通过控制电源的方法并不明智。

能不能通过按动一个按键来实现发光二极管的亮灭呢?当然可以,前面已经讲过,A VR单片机的I/O口都是双向的,也就是既能当作输出控制端口,也能当作输入检测端口。

既然我们可以通过控制端口输出不同的高低电平使发光二极管实现点亮和熄灭;那么为什么不能通过监测端口输入电平的状态来进行相应的处理呢。

在本例中,通过介绍利用按键开关控制发光二极管的亮灭来了解A VR单片机的端口检测外部信号的功能和方法。

本例中有3个功能模块,描述如下:●单片机系统:检测外界的按键开关信号,根据按键的开关状态控制发光二极管的亮灭状态。

●外围电路:首先是产生信号的按键电路,包括对按键去抖动电路的介绍;然后是发光二极管的控制电路。

●软件程序:通过读取AVR单片机相应端口的状态,编写相应的程序控制发光二极管的亮灭。

本例的目的在于希望读者完成本例后,能完成相关电路的设计和相应程序的编写,从而掌握以下知识点:◆了解AVR单片机端口输入功能,掌握使用AVR单片机端口输入功能检测外部信号的原理。

◆熟悉单片机端口输入输出功能的综合使用。

◆掌握AVR单片机按键的硬件去抖动的电路设计和原理。

◆掌握AVR单片机端口输入输出程序的编写。

◆掌握AVR单片机按键软件去抖动功能的实现。

2.1.2 器件和原理本例主要介绍A VR单片机外围电路中按键去抖电路的设计,分别介绍相应的软件和硬件解决方案。

AVR单片机学习笔记

AVR单片机学习笔记

AVR单片机学习笔记
Atmega16A
一、寄存器
1.特殊功能寄存器SFIOR
位2-PUD为上拉电阻禁止位。

置位时即使DDRxn和PORTxn配置位使能上拉电阻,I/O 端口的上拉电阻也会被禁止。

PA端口:
2.端口A数据寄存器PORTA
确定PA口的工作状态;
PORTAn(n=0-7)初始值为0x00(十六进制)。

3.端口A方向寄存器DDRA
指定PA端口是作为输入还是输出口用;
DDRAn(n=0-7)初始值为0x00(十六进制)。

4.端口A输入引脚PINA
用来访问端口A的逻辑值且只允许进行读操作。

PB端口:
5.端口B数据寄存器PORTB
确定PB口的工作状态;
PORTBn(n=0-7)初始值为0x00(十六进制)。

6.端口B方向寄存器DDRB
指定PB端口是作为输入还是输出口用;
DDRBn(n=0-7)初始值为0x00(十六进制)。

7.端口B输入引脚PINB
用来访问端口B的逻辑值且只允许进行读操作。

PC端口、PD端口同上
二、数码管
1.段选数据输出-->>位选数据输出-->>数码管显示数字
2.段选
选择数码管的序号i,使第i个数码管发光(i为一整型数)。

3.位选
选择第i个数码管的发光位置,使其显示特定的数字。

AVR学习笔记移植笔记_1

AVR学习笔记移植笔记_1

林夕依然ATmega16学习笔记例程移植到Atmel Studio 6.2笔记相信你已经有了一定的C语言及数字电路基础,以及能定下心来,决心学点东西。

如果做不到的话,麻烦您把我轻轻的放开,该干啥干啥去。

前言最近学习A VR,网上找了N多资料后,发现就算林夕依然ATmega16学习笔记最合俺的心意。

优点如下:1、不讲原理,直接操作,适合俺这种不愿背书的差生。

2、每个例程都附有源程序及PROTEUS仿真文件,省了买零件的金钱及焊板的时间。

缺点当然也有:1、太省事了,初学者容易只跑跑例程,不求甚解(这也是市售所有学习板的通病)。

2、基于ICCA VR,而不是最新的AtmelStudio。

3、理论知识太少(也算是优点)。

还有一条就是这玩意是用EXE文件打包的,初次下载时,我不敢打开,生怕会给我强装软件或者开个后门什么的。

后来在网上下载了一个开发板的附带光盘文件,发现里面也带着这玩意。

心想这里面不该会有问题呀,才不是太放心的打开,打开后发现相见恨晚呀!好吧,先把这些例程一个一个琢磨完吧。

不过看程序时发现想打瞌睡,也难怪,看这玩意也太没挑战性了。

既然我的电脑中装了AtmelStudio,即然ICCA VR迟早要过时,不如把这里面的例程移植到AtmelStudio中吧!顺便也可以学习一下编程。

笔记不妨公开,俺也好刷一点成在感。

本文中所有例程均在AtmelStudio6.2+Proteus7.8中调试通过。

本文是我个人学习时的笔记,希望后来者能少走一点弯路。

学习MCU的惟一捷径是多读例程,多写程序,别无他法。

林夕依然ATmega16学习笔记下载链结如下:链接:密码:mzah实验1:8种LED点亮模式1、移植到AtmelStudio中的步骤打开Atmel Studio 6.2,新建一个项目。

不知道啥意思,我选第二个后,在下面起好项目名称及选好项目目录后OK。

这个好办,按CPU型号选就好了。

终于进入编辑窗口了。

一言蔽之,提取包中所有.c(C源码)、.h(C头文件)、.dsn(PROTEUS仿真文件)文件。

21IC-AVR学习笔记,AVR单片机教程

21IC-AVR学习笔记,AVR单片机教程

21IC-AVR 学习笔记,AVR 单片机教程AVR 学习笔记一、基本输出实验(电路原理图)
本实验包括七个例程:1、点亮LED 试验,2、流水灯试验,3、蜂鸣器试验,4、1 位数码管显示试验,5、四位数码管显示试验,6、1602 液晶显示试验,7、12864 液晶显示实验。

AVR 学习笔记二、基本输入和外部中断实验
本实验包括二个例程:1、检测按键,实现按键控制LED 的亮灭,2、外部中断实验,利用中断检测按键,并在数码管上显示。

AVR 学习笔记三、定时记数器0 实验
本实验包括五个例程:1、定时/计数器0 的计数实验,2、定时/计数器0 的定时实验,3、定时/计数器0 的比较匹配(CTC)实验,4、定时/计数器0 的快速PWM 实验,5、定时/计数器0 的相位修正PWM 实验。

AVR 学习笔记四、定时记数器1 实验
由于在定时/计数器0 的实验中我们已经学会了定时/计数器的定时、计数、PWM 等基本功能的使用方法。

而单片机中的定时/计数器的基本功能大致上是一样的。

主要区别只是在于对不同寄存器的设置。

所以在定时/计数器1 的。

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

A VR学习笔记(基于LT_Mini_M16)一、点亮发光二极管一、实验内容和目的本实验通过硬件电路和软件程序,利用A TMega16单片机来控制发光二极管的点亮和熄灭。

通过此实验初步掌握单片机的I/O口功能。

二、硬件电路1、电路分析(对照LT_Mini_M16原理图)1)电源电路:外接稳压直流电源(最好是DC9V)加到电路的U1处,经过电容C16稳压滤波后加到稳压模块AMS1117-5.0上,然后连接到电源开关按钮S1,从开关按钮出来后经过发光二极管D9和电阻R7,再经过电容C1、C2、C3、C4、C5、C7稳压滤波后加到单片机以及各个模块的电源端。

分析:a) 电容的作用是稳压滤波,其中C1、C2、C3、C4、C5这5电容为0.1PF (俗称104电容,一般为瓷片电容)。

主要作用为滤出电源电路中的高频成分;而C16、C7是电解电容,主要作用是稳压,即把电源电路中的尖峰电压拉低到正常电压水平;C16是稳定外接直流电源的电压(9V),C7是稳定AMS1117-5.0输出的5V电压。

b)稳压芯片采用ASM1117-5.0,该稳压芯片输入电压范围为6.5V-15V,输出电压稳定在5.0+0.1V,最大输出电流可达1A,可以满足一般电路需要。

c) 电源开关按钮S1的作用当然是接通和断开电源了。

在此电路中S1采用的是单刀双掷开关,一旦断开电源,则电源的正负极都断开了。

d)发光二极管D9的作用是指示电源是否连接成功,如果外部电源成功的连接上,则发光二极管发光指示电源连接成功;电阻R7的作用是对发光二极管进行限流,一般发光二极管只能通过10mA左右的电流,且发光二极管上面的压降只需要1.5V左右,加到发光二极管上面的电流如果超出额定值,则会烧毁。

而系统工作的电压是5V,如果全部加在发光二极管上,则发光二极管很容易就会被烧毁。

所以要在电源和发光二极管之间串接一个限流电阻。

该限流电阻阻值的计算:(VCC-发光二极管上的电压)/流过发光二极管的电流。

一般发光二极管的压降是1.5V左右,电流为10mA左右,则可计算如下:限流电阻的阻值=(5.0-1.5)/0.01=350欧姆,一般这个阻值可以取得稍微大一些。

2)复位电路:单片机的第9脚(RESET,复位管脚)经过按钮K5连接到地。

分析:a)A VR单片机是低电平复位(51单片机是高电平复位,刚好相反)。

需要单片机复位时,最少要在复位管脚加上1.5微秒的低电平,才能确保单片机正确复位。

b)按下按钮K5,复位管脚被直接拉到电源地,这样复位管脚的电平就被拉低,从而使单片机复位;一般情况下按钮按下的时间超过毫秒级别,这样就能确保单片机正确复位。

3)ISP电路(程序下载电路):ISP下载接口不需要任何的外围零件。

使用双排2*5排针。

分析:a)由于没有外围零件,故PB5(MOSI)、PB6(MISO)、PB7(SCK)、复位脚仍可以正常使用,不受ISP的干扰。

b)ISP下载接口的1、3、5、7、9脚分别接单片机的PB5(MOSI)、PB6(MISO)、PB7(SCK)、复位脚;2接VCC,4、6、8、10都接在GND上。

4)晶振电路:晶体的两脚分别接单片机的12、13脚(晶体的管脚没有正负和顺序,可以随意连接),电容C11、C12分别于晶体的两脚和地连接。

分析:a)单片机的正常工作离不开稳定的时钟信号。

晶体就是提供稳定时钟信号的器件。

b)A VR单片机内部集成有RC振荡器,可以为系统提供用以精度要求不高的时钟信号,这是可以不接外部晶体,利用熔丝配置,设置单片机工作与内部RC振荡器模式。

这个时候可以不用连接警惕和C11、C12两个电容。

c)电容C11、C12的作用是让晶体工作的更稳定。

5)发光二极管驱动电路:单片机的PB0-PB7口分别连接到排阻的八个电阻脚,排阻的公共脚接地。

分析:a)单片机的PB0-PB7口中的任一个输出高电平(5V),则5V电压通过这个口输出到发光二极管的正极,然后通过电阻连接到地,从而构成一个放电电路。

发光二极管正极加上超过1.5V的电压后,就能够点亮发光。

b)排阻的作用同样是为八个发光二极管分压限流。

2、A VR单片机的I/O端口1)学习单片机的主要任务就是了解、掌握单片机I/O端口的功能,以及如何正确设计这些端口与外围电路的连接,从而能够组成一个嵌入式系统,并编程、管理和运用他们完成各种各样的任务。

2)A Tmega16有4个8位的双向I/O端口PA、PB、PC、PD,他们对外对应32个I/O 引脚,每一位都可以独立地用于逻辑信号的输入和输出。

在5V工作电压下,输出高点平时,每个引脚可输出达20mA的驱动电流;而输出低电平时,每个引脚可吸收最大为40mA的电流,可以直接驱动发光二极管(一般的发光二极管的驱动电流为10mA)和小型继电器等小功率器件。

A VR大部分的I/O端口都具备双重功能(有的还有第三功能)。

其中第一功能是作为数字通用I/O接口使用,而复用的功能可分别与片内的各种不同功能的外围接口电路组合成一些可以完成特殊功能的I/O口,如定时器、计数器、串行接口、模拟比较器、捕捉器、USART、SPI等。

3)A VR单片机的每组I/O口都配备有三个8为寄存器,分别是:方向控制寄存器DDRx、数据寄存器PORTx、输入引脚寄存器PINx(x=A/B/C/D).I/O口的工作方式和表现特征由这三个I/O寄存器控制。

方向控制寄存器DDRx用于控制I/O口的输入输出方向,及控制I/O口的工作方式为输出方式还是输入方式。

DDRx=1时,I/O口处于输出工作方式;此时数据寄存器PORTx中的数据输出到外部引脚。

DDRx=0时,I/O口处于输入工作方式;此时输入引脚寄存器PINx中的数据就是外部引脚的实际电平,通过读I/O指令可将物理引脚的真实数据读入MCU。

此外,当I/O口定义为输入时(DDRx=0),通过PORTx的控制,可使用或不使用内部的上拉电阻。

(关于上拉电阻的解释请看后面附录2)4)A VR 通用I/O端口的主要特点为:a)双向可独立位控的I/O口A Tmega16的PA、PB、PC、PD 四个端口都是8 位双向I/O 口,每一位引脚都可以单独的进行定义,相互不受影响。

如用户可以在定义PA口第0、2、3、4、5、6 位用于输入的同时定义第1、7位用于输出,互不影响。

b)Push-Pull 大电流驱动(最大40mA)每个I/O 口输出方式均采用推挽(关于推挽电路,请参阅附录3)式缓冲器输出,提供大电流的驱动,可以输出(吸入)20mA的电流,因而能直接驱动LED显示器。

c)可控制的引脚内部上拉电阻每一位引脚内部都有独立的,可通过编程设置的,设定为上拉有效或无效的内部上拉电阻。

当I/O口被用于输入状态,且内部上拉电阻被激活(有效)时,如果外部引脚被拉低,则构成电流源输出电流(uA量级)。

d)DDRx 可控的方向寄存器。

A VR 的I/O 端口结构同其它类型单片机的明显区别是,A VR 采用 3 个寄存器来控制I/O端口。

一般单片机的I/O 仅有数据寄存器和控制寄存器,而A VR 还多了一个方向控制器,用于控制I/O 的输入输出方向。

由于输入寄存器PINx 实际不是一个寄存器,而是一个可选通的三态缓冲器,外部引脚通过该三态缓冲器与MCU 的内部总线连接,因此,读PINx 时是读取外部引脚上的真实和实际逻辑值,实现了外部信号的同步输入。

3、电路工作过程:本实验的整个电路工作过程是:1)将外接稳压电源连接到电路板的电源插孔P1处,按下电源开关按钮S1,将电源加到单片机上。

2)将下载器的ISP插口插到电路板的ISP插座处。

下载软件到单片机内。

3)软件下载成功后,电路板上所要点亮的那个发光二极管就会点亮。

4)按下复位按钮,电路板上点亮的那个发光二极管就会熄灭,当复位按钮松开后,发光二极管再次点亮。

三、软件编写1、使用WinA VR(GCC)开发环境。

2、文件包含:用C语言编写A VR单片机程序时,一般都要在程序的开头加上文件包含预编译指令。

文件包含是将一些已经定义好的寄存器、变量、函数等添加到所要编写的程序中,那么所要编写的程序中就可以直接使用这些定义好的寄存器、变量、函数等就可以在程序中直接使用,省去了重复定义大量经常使用的寄存器、变量、函数等的麻烦。

3、makefile文件:一个工程中的源文件不计数,其按类型、功能、模块分别放在若干个目录中,makefile定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能操作,因为makefile就像一个Shell 脚本一样,其中也可以执行操作系统的命令。

A VR单片机中的makefile文件可以使用WINA VR中的mfile工具生成。

makefile文件中需要注意并修改的几点是:[单片机类型]、[目标文件名]、[C源文件名]、[系统时钟频率]。

4、A VR单片机中的端口配置寄存器:A VR单片机的I/O口是标准的三态口(高电平、低电平、高阻态这三种状态)。

1)使用A VR 的I/O 口,首先要正确设置其工作方式,确定其工作在输出方式还是输入方式。

2)当I/O 工作在输入方式,要读取外部引脚上的电平时,应读取PINxn 的值,而不是PORTxn 的值。

3)当I/O 工作在输入方式,要根据实际情况使用或不使用内部的上拉电阻。

4)一旦将I/O口的工作方式由输出设置成输入方式后,必须等待一个时钟周期后才能正确的读到外部引脚PINxn 的值。

5、程序的编写:Programmers Notepad [WinA VR],新建一个空白文档,开始编写程序。

1)首先要在程序中加入A Tmega16的I/O寄存器配置头文件:#include <avr/io.h>,加上这个文件后,程序就可以直接使用各个寄存器的名称进行相应设置。

2)然后编写主函数程序,GCC中规定main函数必须是有整形返回值的函数,定义为int main(void){此处加入具体代码return 0;(这句话可以不要)}在这个例子中是用PORTA口控制发光二极管的亮灭,所以在主函数里,首先设置PORTA口相应位为输出方式,然后使端口输出低电平,先使发光二极管不亮。

我们可以直接使用C的语句对I/O 口寄存器进行操作,如:// 定义PortA口的工作方式PORTA = 0x00; // PA口的第0位输出“1”,LED不亮DDRA = 0x01; // 定义PA口的第0位为输出方式PORTA|= ~(1 << PA0); // PA口第0位输出取反其中PA0 是GCC 中对C的扩展语句,它实现了对寄存器的位操作。

这种语句在标准C 中是没有的,该扩展更加适合编写单片机的系统程序,因为在单片机的系统程序中,是经常需要直接对位进行操作的。

相关文档
最新文档