AVR学习板讲座Word格式文档下载.docx
《AVR学习板讲座Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《AVR学习板讲座Word格式文档下载.docx(18页珍藏版)》请在冰点文库上搜索。
![AVR学习板讲座Word格式文档下载.docx](https://file1.bingdoc.com/fileroot1/2023-5/10/992fb7bc-31ff-4819-967b-595160fd3602/992fb7bc-31ff-4819-967b-595160fd36021.gif)
d、C程序中可以加入一些说明文字,单行以双斜扛“//”开始,如果是多行,就用"
/*"
开始,以“*/”结束,如/*注释*/。
e、函数可以有参数,一律放在小括号内。
f、利用C语言可以轻松的对AVR的设备组件进行操作,如程序中的PORTA=0x0F;
g、任何一个AVRC程序都必须是一个无限循环,否则程序会沿着程序存储区一直运行,直至溢出程序存储区,程序从头运行。
2、AVRC语言的基本字符、标识符和关键字
avrc语言和普通c语言一样,基本字符有阿拉伯数字0~9;
大小写拉丁字母a~z和A~Z;
一些选定的可打印字符,如"~!
@#¥%^&*()_-+={}[],.;
<>/?
|\";
空格符、换行符和制表符这三种空白符起到分割成分和编排格式的作用。
对系统对象命名,称为标识符。
标识符由数字、字母、下划线组合的字符串序列构成,字母区分大小写。
如下都是合法的表示符:
AVR_IOPORTACSRIT0temp1
注意:
不能以数字开头的字符串做标识符。
比如1abc是不合法的。
C语言的合法标识符有一部分被编译器保留作为特殊用途,这样的标识符称为关键字。
C语言的关键字有:
(以字母先后为序)
autobreakcasecharconstcontinuedefaultdodoubleelseenumexternfloatforgotoifintlongregisterreturnshortsignedsizeofstaticstructswitchtypedefunionunsignedvoidvolatilewhile
注意,原则上除关键字外,可以使用任何有效的标识符。
但实际上,根据系统不同,有些特殊标识符具有特殊含义,不应被使用。
在AVR里,一些端口的名称、寄存器的名称已经被系统定义,最好不要改变其定义,如PORTADDRATIMASK等。
3、数据类型
C语言严格规定数据类型,AVR资源有限,如果数据类型选用不好,资源很快就会耗尽。
如,尽量不要使用浮点类型的运算,1.2*1.2的浮点数运算至少要占用mega16的百分之十以上的空间。
选择数据类型时需要注意不要操作数据能表示的范围,比如要表示60000,就不能用char,必须用int。
整数类型的类型名前可加修饰符unsigned和signed,表示无符号数和有符号数,其中unsigned可以省略,默认表示无符号数,一般来说,尽量使用无符号数可以节约资源。
以下三种为整数类型:
1、整数类型:
一般类型的整型int,16位二进制编码,表示的数0~65536,及216。
有符号类型,signedint表示范围-32768~32767。
2、长整型类型:
长整型(longint)类型的二进制编码是32位。
有符号的长整型类型(long)表示范围-231~231-1;
无符号的类型(unsignedlong)的表示范围为0~232-1。
3、超长整数类型:
超长整数类型(longlong)的二进制编码是64位。
有符号的长整型类型(long)表示范围-263~263-1;
无符号的类型(unsignedlong)的表示范围为0~264-1。
以下为实数类型(浮点数类型):
1、单精度浮点数类型:
float,用32位二进制数表示。
2、双精度浮点数类型:
longdouble,用64位二进制数表示。
字符类型和字符串
字符类型的类型名为char,目前最常用的是ASCII字符集,其中字符包扩所有的大小写字母,数字,常用字符等共计128割字符。
扩展的ASCII字符集包括256个字符,字符类型占用一个字节。
一些特殊的字符串的表示方法:
以反斜扛加特定字符。
如'
\n'
回车符;
‘\"
’双引号;
‘\'
’单引号字符;
‘\\’反斜杠。
无符号的字符类型:
char表示范围0~255。
有符号的字符类型:
signedchar表示范围-128~127。
第四步AVR的特性介绍
高可靠性、功能强、高速度、低功耗和低价位,一直是衡量单片机性能的重要指标,也是单片机占领场、赖以生存的必要条件。
早期单片机主要由于工艺及设计水平不高、功耗高和抗干扰性能差等原因,所以采取稳妥方案:
即采用较高的分频系数对时钟分频,使得指令周期长,执行速度慢。
以后的CMOS单片机虽然采用提高时钟频率和缩小分频系数等措施,但这种状态并未被彻底改观(51以及51兼容)。
此间虽有某些精简指令集单片机(RISC)问世,但依然沿袭对时钟分频的作法。
AVR单片机的推出,彻底打破这种旧设计格局,废除了机器周期,抛弃复杂指令计算机(CISC)追求指令完备的做法;
采用精简指令集,以字作为指令长度单位,将内容丰富的操作数与操作码安排在一字之中(指令集中占大多数的单周期指令都是如此),取指周期短,又可预取指令,实现流水作业,故可高速执行指令。
当然这种速度上的升跃,是以高可靠性为其后盾的。
AVR单片机硬件结构采取8位机与16位机的折中策略,即采用局部寄存器存堆(32个寄存器文件)和单体高速输入/输出的方案(即输入捕获寄存器、输出比较匹配寄存器及相应控制逻辑)。
提高了指令执行速度(1Mips/MHz),克服了瓶颈现象,增强了功能;
同时又减少了对外设管理的开销,相对简化了硬件结构,降低了成本。
故AVR单片机在软/硬件开销、速度、性能和成本诸多方面取得了优化平衡,是高性价比的单片机。
AVR单片机内嵌高质量的Flash程序存储器,擦写方便,支持ISP和IAP,便于产品的调试、开发、生产、更新。
内嵌长寿命的EEProm可长期保存关键数据,避免断电丢失。
片内大容量的RAM不仅能满足一般场合的使用,同时也更有效的支持使用高级语言开发系统程序,并可像MCS-51单片机那样扩展外部RAM。
AVR单片机的I/O线全部带可设置的上拉电阻、可单独设定为输入/输出、可设定(初始)高阻输入、驱动能力强(可省去功率驱动器件)等特性,使的得I/O口资源灵活、功能强大、可充分利用。
AVR单片机片内具备多种独立的时钟分频器,分别供URAT、I2C、SPI使用。
其中与8/16位定时器配合的具有多达10位的预分频器,可通过软件设定分频系数提供多种档次的定时时间。
AVR单片机独有的“以定时器/计数器(单)双向计数形成三角波,再与输出比较匹配寄存器配合,生成占空比可变、频率可变、相位可变方波的设计方法(即脉宽调制输出PWM)”更是令人耳目一新。
增强性的高速同/异步串口,具有硬件产生校验码、硬件检测和校验侦错、两级接收缓冲、波特率自动调整定位(接收时)、屏蔽数据帧等功能,提高了通信的可靠性,方便程序编写,更便于组成分布式网络和实现多机通信系统的复杂应用,串口功能大大超过MCS-51/96单片机的串口,加之AVR单片机高速,中断服务时间短,故可实现高波特率通讯。
面向字节的高速硬件串行接口TWI、SPI。
TWI与I2C接口兼容,具备ACK信号硬件发送与识别、地址识别、总线仲裁等功能,能实现主/从机的收/发全部4种组合的多机通信。
SPI支持主/从机等4种组合的多机通信。
AVR单片机有自动上电复位电路、独立的看门狗电路、低电压检测电路BOD,多个复位源(自动上下电复位、外部复位、看门狗复位、BOD复位),可设置的启动后延时运行程序,增强了嵌入式系统的可靠性。
AVR单片机具有多种省电休眠模式,且可宽电压运行(5-2.7V),抗干扰能力强,可降低一般8位机中的软件抗干扰设计工作量和硬件的使用量。
AVR单片机技术体现了单片机集多种器件(包括FLASH程序存储器、看门狗、EEPROM、同/异步串行口、TWI、SPI、A/D模数转换器、定时器/计数器等)和多种功能(增强可靠性的复位系统、降低功耗抗干扰的休眠模式、品种多门类全的中断系统、具输入捕获和比较匹配输出等多样化功能的定时器/计数器、具替换功能的I/O端口……)于一身,充分体现了单片机技术的从“片自为战”向“片上系统SoC”过渡的发展方向。
综上所述,AVR单片机博采众长,又具独特技术,不愧为8位机中的佼佼者。
第二讲M16IO口的使用方法
我们使用的是mega16芯片,在使用之前,我们首先要做的就是将最小系统构建好。
复位电路,由于mega16是低电平复位。
如下图所示
在这个电路里面,当mega16单片机进行工作的时候,我们可以使用按键给单片机系统进行手动复位。
晶振电路:
在这个电路里面,我们采用了,7.3728Mhz的晶振,方便我们进行串口实验。
模拟电压和参考电压:
这个地方在模拟电压和数字电压之间我们使用一个电感隔离一下。
ISP下载电路:
MOSI对应的是PB5
SCK对应的是PB7
MISO对应的是PB6
JTAG仿真电路:
这里:
TCK对应的是PC2
TDO对应的是PC4
TMS对应的是PC3
TDI对应的是PC5
按照这个进行连接,我们就可以让mega16进行工作了。
下面我们可以结合ICCAVR软件进行学习io的使用了
我们先看看硬件电路上面如何连接:
硬件对应的io接口
LED0-------------------PA6
LED1-------------------PA7
LED2-------------------PC0
LED3-------------------PC1
LED4-------------------PC6
LED5-------------------PC7
现在我们先熟悉一下ICCAVR软件吧,安装好以后并crack以后,我们可以看见如下的图标:
我们双击便可以打开界面,如果看见
,这个样子就表示crack成功,如果没有成功,请重新crack一下。
打开软件后,我们先建立一个工程,
-→new,然后我们可以根据需要进行设置路径和项目名称。
然后在
--→option,选择器件。
如下图所示:
现在一个工程就建立好了,然后我们就要进行mega16单片机设置了。
选择界面上的
,这个操作,我们就可以看见一个配置界面。
选择好目标cpu和晶振以后,我们就可以选择PORTS了。
点击PORTS,然后我们看到如下的界面:
因为我们使用的io口为PA6和PA7,那么,我们要做如下的设置
在PortA口上面设置io输出,并且是高电平输出。
我们现在就可以点击ok了。
此时界面上出现如下的程序:
//ICC-AVRapplicationbuilder:
2008-10-98:
12:
38
//Target:
M16
//Crystal:
7.3728Mhz
//作者:
南京华岳电子练祥华
//功能:
学习io的程序
voidport_init(void)
{
PORTA=0xC0;
DDRA=0xC0;
PORTB=0x00;
DDRB=0x00;
PORTC=0x00;
//m103outputonly
DDRC=0x00;
PORTD=0x00;
DDRD=0x00;
//callthisroutinetoinitializeallperipherals
voidinit_devices(void)
//stoperrantinterruptsuntilsetup
CLI();
//disableallinterrupts
port_init();
MCUCR=0x00;
GICR=0x00;
TIMSK=0x00;
//timerinterruptsources
SEI();
//re-enableinterrupts
//allperipheralsarenowinitialized
//
voidmain(void)
init_devices();
//insertyourfunctionalcodehere...
然后我们进行手工添加部分程序,将这个程序编写完整就可以了,具体程序如下:
voidDELAY()//Ñ
Ó
Ê
±
×
³
Ì
Ð
ò
usnignedinti;
for(i=0;
i<
50000;
i++)
{
;
}
while
(1)
DELAY();
PORTA=0x80;
PORTA=0x00;
现在我们编好程序了,然后添加到项目中去,进行编译,点击
,这个图标就可以进行直接编译了。
下面,我们进行在avrstdio中使用软件仿真,可以看出io的变化。
先点击avrstdio的图标
进行启动软件。
出现如下界面:
我们在OPEN中打开刚才所建立的文件,如下图:
选择.cof文件打开即可,此时,我们看到打开后的界面。
然后点击finish按键,然后我们可以选择如下图的io设置,这样我们就能看清楚io的变化了。
并且,我们点击
,用来设置断点,以方便观测io变化。
现在我们运行一下程序,点击
,就会发现如下图所示:
继续点击全速运行图标,或者按键F5,就会出现如下:
此时io上面的一个led应该会被点亮。
我们继续按F5,就会出现如下:
此时两个灯都被点亮了,然后取消断点,全速运行就可以了。
第三讲外部中断的使用
我们先看看Mega16单片机的外部中断的引脚和接口。
我们可以看到PD2是接在外部中断0上面的,现在我们在这个地方接一个按键,用来表示进入外部中断,同时点亮LED0,LED的电路图如下所示。
在这里我们只要对KEY1进行编程,然后使用按键操作,在stdio里面设置断点就可以了,在程序里面就能看到中断的情况了。
还是老规矩,打开iccavr,我们先建立项目,选择芯片,同时选择目标芯片,如图所示:
设置晶振,如下图所示。
此时,我们设置PORTD2为内部上拉。
点击ports按键如下设置:
然后点击ok出现如下程序:
2008-10-1010:
14:
11
学习外部中断0的程序
PORTA=0x40;
DDRA=0x40;
PORTD=0x04;
#pragmainterrupt_handlerint0_isr:
2
voidint0_isr(void)
//externalinteruptonINT0
GICR=0x40;
现在我们可以进行修改程序,在中断程序里面,我们可以修改成中断一次,给LED0取反一次。
22:
56
#defineLED_COMPORTA^=(1<
<
PA6)//
LED_COM;
编译后,在avrstdio中使用软件仿真可以看到如下结果:
先设置断点
将PORTD口如下设置:
点击全速运行可以看见如下2个结果:
这个是LED0点亮的状态
这个是LED0熄灭的状态。
第四讲定时器的使用
定时器我们在中断里面也讲过了,就是在定时一个时间周期的时候进入中断来处理中断程序,可以作为计时、计数、扫描等用途。
同样的,在今天的这一讲里面,我们要做的是,还是采用设置断点的方式对LED0进行处理,因为我们的硬件平台还没有做好,所以目前只能这么将就着,但是原理都是一样的。
首先,我们还是老规矩,建立一个工程。
1、打开iccavr软件,新建一个工程。
如图所示:
工程建好以后,下面我们就开始选择目标器件,在option里面选择mega16。
然后点击OK,选择
图标开始配置器件。
出现下图所示:
我们按照如上图配置好以后,选择PORTS,就出现了如下的界面:
这次我们选择TIMER0进行操作,则会出现如下的界面:
按照上图设置好以后,我们按下ok就会出现如下的程序:
2008-10-117:
38:
57
学习定时中断0的程序