-【优秀文档资料】AVR学习板(提交版)(打印版)_第1页
-【优秀文档资料】AVR学习板(提交版)(打印版)_第2页
-【优秀文档资料】AVR学习板(提交版)(打印版)_第3页
-【优秀文档资料】AVR学习板(提交版)(打印版)_第4页
-【优秀文档资料】AVR学习板(提交版)(打印版)_第5页
已阅读5页,还剩34页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、【高手坐堂】系列之万人学习51单片机!专家:老练 【老练淘宝店】 具体活动地址:hup:/bbseeworldcomcn/thread-66169-1j html【高手坐堂】系列之让我们学学avr!专家:老练 【老练淘宝店】 具体活动地址:http:/bbs eeworld. com cn/thread-66668l一1 htmlavr讲座:第一讲:avr软件、工具、ml6的基础知识第一步安装1ccavr第二步安装stdio第三步 介绍avr c语言的语法1、一个简单的avr程序ttinclude <ioml6v. h>#inelude <macros h>void m

2、ain()porta二oxof; /给pa 口赋值,让pa 口低四位为1,高四位为0 wh i1e (1);本程序的作用是把pa 口的值设为oxof。a、程序中以#号开头的语句#includeioml6v. h>是包含特定的头文件,叫预处 理指令,ioml6v表示使用的是megal6, macros, h包含了必须的avr操作命令。b、c语言的程序是由函数构成的,如上面的那个void maino ,前面的void表 明函数没冇返回值。每一个c程序里而里冇但只冇一个maino函数,系统启动 后就从main ()开始运行。c、函数内部的内容以大括号“ ”和扩起来,每句语句用分号”结朿, 若分

3、号前面没有内容,编译之后也无任何操作语句。d、c程序中可以加入一些说明文字,单行以双斜扛“/”开始,如果是多行, 就用7*"开始,以“*/”结束,如/*注释*/ oe、函数可以有参数,一律放在小扌舌号内。f、利用c语言可以轻松的对avr的设备组件进行操作,如程序屮的porta二oxof; g>任何一个avr c程序都必须是一个无限循环,否则程序会沿着程序存储区一 直运行,直至溢出程序存储区,程序从头运行。2、avr c语言的基本字符、标识符和关键字avr c语言和普通c语言一样,基本字符有阿拉伯数字09;大小写拉丁字母a z和az; 些选定的可打印字符,如”! #¥%

4、八&* ()_ + = :,.;<>/? i n ;空格符、换行符和制表符这三种空白符起到分割成 分和编排格式的作用。对系统对象命名,称为标识符。标识符由数字、字母、下划线组合的字符串序列 构成,字母区分大小写。如卜都是合法的表示符:avr_10 porta csr ito tempi注意:不能以数字开头的字符串做标识符。比如labc是不合法的。c语言的合法标识符有一部分被编译器保留作为特殊用途,这样的标识符称为关 键字。c语言的关键字有:(以字母先后为序)auto break case char const continue dcfauit do double else

5、enum extern float for goto if int long register return short signed sizeof static struct switch typedef union unsigned void volatile while注意,原则上除关键字外,可以使用任何有效的标识符。但实际上,根据系统不 同,有些特殊标识符具有特殊含义,不应被使用。在avr里,一些端口的名称、 寄存器的名称已经被系统定义,最好不要改变其定义,如porta ddr a ti mask等。3、数据类型c语言严格规定数据类型,avr资源有限,如果数拯类型选用不好,资源很快就

6、会耗尽。如,尽量不要使用浮点类型的运算,1.2*1. 2的浮点数运算至少要占用 megal6的百分之十以上的空间。选择数据类型时需要注意不要操作数据能表示的范围,比如要表示60000,就不 能用char,必须用into整数类型的类型名前可加修饰符unsigned和signed,表示无符号数和有符号数, 其屮unsigned可以省略,默认表示无符号数,一般来说,尽量使用无符号数可 以节约资源。以下三种为整数类型:1、整数类型:一般类型的整型int, 16位二进制编码,表示的数065536,及 2160有符号类型,signed int表示范围一3276832767。2、长整型类型:长整型(long

7、 int)类型的二进制编码是32位。有符号的长整 型类型(long)表示范围一231231 1;无符号的类型(unsigned long)的表 示范围为0232 1。3、超长整数类型:超长整数类型(long long)的二进制编码是64位。冇符号 的氏整型类型(long)表示范围一2632631;无符号的类型(unsigned long) 的表示范围为02641。以下为实数类型(浮点数类型):1、单精度浮点数类型:float,用32位二进制数表示。2、双精度浮点数类型:long double,用64位二进制数表示。 字符类型和字符串字符类型的类型名为char, 口前最常用的是ascii字符集,

8、其屮字符包扩所有 的大小写字母,数字,常用字符等共计128割字符。扩展的asctt字符集包括 256个字符,字符类型占用一个字节。一些特殊的字符串的表示方法:以反斜扛加特定字符。如n '回车符;''双引号;''单引号字符;' '反斜杠。无符号的字符类型:char表示范围0255。有符号的字符类型:signed char表示范围一128127。第四步avr的特性介绍高可靠性、功能强、高速度、低功耗和低价位,一直是衡量单片机性能的 重要指标,也是单片机占领场、赖以生存的必要条件。早期单片机主要由于工艺及设计水平不高、功耗高和抗干扰性能井等原因

9、, 所以采取稳妥方案:即采用较高的分频系数对时钟分频,使得指令周期长,执行 速度慢。以后的cmos单片机虽然采用提高时钟频率和缩小分频系数等措施,但 这种状态并未被彻底改观(51以及51兼容)。此间虽有某些精简指令集单片机 (risc)问世,但依然沿袭对时钟分频的作法。avr单片机的推出,彻底打破这种旧设计格局,废除了机器周期,抛弃复杂 指令计算机(cisc)追求指令完备的做法;采用精简指令集,以字作为指令长度单 位,将内容丰富的操作数与操作码安排在一字之屮(指令集屮占大多数的单周期 指令都是如此),取指周期短,又可预取指令,实现流水作业,故可高速执行指 令。当然这种速度上的升跃,是以高可靠性

10、为其后盾的。avr单片机硕件结构采取8位机与16位机的折屮策略,即采用局部寄存器 存堆(32个寄存器文件)和单-体高速输入/输出的方案(即输入捕获寄存器、输出 比较匹配寄存器及相应控制逻辑)。提高了指令执行速度(imips/miiz),克服了瓶 颈现彖,增强了功能;同时乂减少了对外设管理的开销,相对简化了硕件结构, 降低了成本。故avr单片机在软/硬件开销、速度、性能和成本诸多方面取得了 优化平衡,是高性价比的单片机。avr单片机内嵌高质量的flash程序存储器,擦写方便,支持isp和iap, 便于产品的调试、开发、生产、更新。内嵌长寿命的eeprom可长期保存关键数 据,避免断电丢失。片内大

11、容量的ram不仅能满足一般场合的使用,同时也更有 效的支持使用高级语言开发系统程序,并可像mcs-51单片机那样扩展外部ramoavr单片机的i/o线全部带可设置的上拉电阻、可单独设定为输入/输出、 可设定(初始)高阻输入、骡动能力强(可省去功率欤动器件)等特性,使的得 i/o 口资源灵活、功能强大、可充分利用。avr单片机片内具备多利|独立的吋钟分频器,分别供urat、i2c、spi使用。 其中与8/16位定时器配合的具有多达10位的预分频器,可通过软件设定分频 系数提供多利稻次的定时时间。avr单片机独有的“以定时器/计数器(单)双 向计数形成三角波,再与输出比较匹配寄存器配合,生成占空比

12、可变、频率可变、 相位可变方波的设计方法(即脉宽调制输出pwm)”更是令人耳目一新。增强性的高速同/异步串口,具有硬件产生校验码、硬件检测和校验侦错、 两级接收缓冲、波特率口动调整定位(接收时)、屏蔽数据帧等功能,提高了通 信的叮靠性,方便程序编写,更便于组成分布式网络和实现多机通信系统的复杂 应用,串口功能大大超过mcs-51/96单片机的串口,加之avr单片机高速,屮断 服务时间短,故可实现高波特率通讯。面向字节的高速硕件串行接口 twi、spio twi与i2c接口兼容,具备ack 信号硬件发送与识别、地址识别、总线仲裁等功能,能实现主/从机的收/发全部 4种组合的多机通信。sp1支持主

13、/从机等4种组合的多机通信。avr单片机有口动上电复位电路、独立的看门狗电路、低电压检测电路b0d, 多个复位源(自动上下电复位、外部复位、看门狗复位、b0d复位),可设置的启 动后延时运行程序,増强了嵌入式系统的可靠性。avr单片机具有多种省电休眠模式,且可宽电压运行(5-2.7v),抗干扰能 力强,可降低一般8位机小的软件抗干扰设计工作量和硬件的使用量。avr单片机技术体现了单片机集多种器件(包括flash程序存储器、看门狗、 eepr0m、同/异步串行口、twi、spi、a/d模数转换器、定时器/计数器等)和多 种功能(增强可靠性的复位系统、降低功耗抗干扰的休眠模式、詁种多门类全的 中断

14、系统、具输入捕获和比较匹配输出等多样化功能的定时器/计数器、具替换 功能的i/o端口)于一身,充分体现了单片机技术的从“片自为战”向“片 上系统soc”过渡的发展方向。综上所述,avr单片机博采众长,又具独特技术,不愧为8位机中的佼佼者。第二讲m16i0 口的使用方法我们使用的是mega 16芯片,在使用之前,我们首先要做的就是将最小系统构建好。 复位电路,由于mega 16是低电平复位。如下图所示.2kk二二-ltas1 ilsss astoin在这个电路里而,当mega 16单片机进行丄作的时候,我们吋以使用按键给单片机系统进行 手动复位。晶振电路:在这个电路里面,我们采用了,7.3728

15、mhz的晶振,方便我们进行串口实验。 模拟电压和参考电压:这个地方在模拟电压和数字电压之间我们使用一个电感隔离一下。isp下载电路:mosi对应的是pb5sck 对应的是pb7miso 对应的是pb6jtag仿真电路:j2tck1234567s910tdorvrrtx-vccrtdijtag这里:tck对应的是pc2tdo对应的是pc4tms对应的是pc3tdi对应的是pc5按照这个进行连接,我们就可以让mega 16进行工作了。下面我们可以结合iccavr软件进行学习io的使用了 我们先看看硬件电路上面如何连接:11:151;-14;1:;£i;£:;£:一5g

16、£二硬件对应的io接口ledopa6led1pa7pc0pc1led2led3led4pc6led5pc7现在我们先熟悉一 f iccavr软件吧,安装好以后并crack以后,我们对以看见如卜的图标:icc avr我们双击便叮以打开界面,如果看见 !agecraft ide for iccave (professiomal),这个样了就表示crack成功,如果file edit search vi ew froject studi o+ rcs tools没有成功,请重新crack 下。froject :打开软件后,我们先建立一个工程,-new,然示我们可以根据需要进行设置路proj

17、ect :选择器件。如下图所示:径和项目名称。然后在optioncoapiler optionscompiler optionspaths| compiler target | config salvo device con figuration| custommemory sizes (bytes)program m emory同5ltrimx mpmnm厂pri厂apaths | compiler target | config salvo |现在一个工程就建立好了,然后我们就要进行mega 16单片机设置了。选择界面上的.,这个操作,我们就可以看见一个配逍界面。port adirecti

18、onvaluechangeport bdirecti onvaluechangeorr厂厂 1it厂厂 2rr厂厂 3rr厂厂 4rr厂厂 5rr厂厂 6rr厂厂 7t r厂选择好h标cpu和晶振以后,我们就可以选择ports 了。点击ports,然后我们看到如下 的界面:iccavk application builder 116cpu ports |timero | timerl | timer2 | uart | spi | analog |7 6 5 4 3 2 1 0 rrrrrrrrrrrrrrrr 厂厂厂厂厂厂厂厂 厂厂厂厂厂厂厂厂port cdirectionvaluechan

19、geok ioptionspreviewcancel7 6 5 4 3 2 1 0 rrrrrrrrrrrrrrrr 厂厂厂厂厂厂厂厂 厂厂厂厂厂厂厂厂.7 6 5 4 3 2 1 0direction fifififififififivalue厂厂厂厂厂厂厂厂change 厂厂厂厂厂厂厂厂nght click on a alue" bit to define signal nameport adirectionvaluechange因为我们使用的io 口为pa6和pa7,那么,我们婆做如下的设置7 6 5 4 3 2 1 0 ro ro rtfirtfirtri rrn厂厂厂厂厂厂

20、 厂厂厂厂厂厂厂厂i-port b在port a 口上面设置io输岀,并且是高电平输岀。 我们现在就可以点击ok to此吋界而上出现如下的程序:/icc-avr application builder : 2008-10-9 8:12:38/ target : m16/ crystal: 7.3728mhz/作者:南京华岳电子练祥华/功能:学习i。的程序#inelude <ioml6v.h>#inclucie <macros h>void port_init(void)porta =oxco;ddra =oxco;portb =0x00;ddrb =0x00;portc

21、 =0x00; /ml03 output onlyddrc =0x00;portd =0x00;ddrd =0x00;/call this routine to initialize all peripheralsvoid init_devices(void)/stop errant interrupts until set upcli(); /disable all interruptspor;mcucr = 0x00;gicr = 0x00;timsk = 0x00; /timer interrupt sourcessei (); /re-enable interrupts/all per

22、ipherals are now initialized/void main(void)init_devices();/insert your functional code here-然后我们进行手工添加部分程序,将这个程序编写完整就可以了,具体程序如/icc-avr application builder : 2008-10-9 8:12:38/ target : ml6/ crystal: 7.3728mhz/作者:南京华岳电子练祥华/功能:学习i。的程序#include <ioml6vh>#include <macros.h> void delay () /no

23、e±x63iddusnigned int i;for (i = 0;i<50000;i + +) void por(void)porta =oxco;ddra =oxco;portb =0x00;ddrb =0x00;portc =0x00; /ml03 output onlyddrc =0x00;portd =0x00;ddrd =0x00;/call this routine to initialize all peripherals void init_devices(void)/stop errant interrupts until set upcli(); /dis

24、able all interruptsport_init();mcucr = 0x00;gicr = 0x00;timsk = 0x00; /timer interrupt sourcessei (); /re-enable interrupts/all peripherals are now initialized/void main(void)init_devices();/insert your functio2丄 code here .while (1)porta = oxco;delay();porta = 0x80;delay ();porta = 0x00;delay();现在我

25、们编好程序了,然后添加到项冃中去,进行编译,点击这个图标就町以进行 直接编译了。s -ef t16led& files: © mled.c:o headersdocuments下面,我们进行在avr stdio中使用软件仿真,可以看出io的变化。先点击avrstdio的图标avr studio 4进行启动软件。出现如卜界面:i 園! | trace disabledugin stk500我们在open中打开刚才所建立的文件,如下图:选择.cof文件打开即可,此时,我们看到打开后的界面。select debug plat£orm and devicedebug pla

26、tform:jtagice mkllice40ice50jtag iceavr simulatorice200at90s8515at90s8535<»jatmegalo3atmegal28atmegal61:iiiatmegal62atmegal631atmegal65iatmegal68v/jj1atmegal69atmega32)evi ce:厂 open plat£orm optio« bsick| t >>|finishcancel ver 4. 10.3!然后点击finish按键,然后我们可以选择如下图的io设置,这样我们就能看清楚io

27、的变化 toayestudi o 一 d:testal6bbaled. c"el file project edit vievv tools debug window hep舟d s 0 0 x电息寻乞空;何 % % % 辜拿 i is i si ii厨匠1口£圏筑丄不丨师v/orksoace .xor ico ad_r rtecomcpu±j1/void main(void)<=> init_devices();/insert your functional code here. while(1)-a -a -bs-eefr0mexternal.ih

28、terrupt jtagporta m porta p ddra 是 pina portbportc portd spi timer.coiqtter.o timer cower 10x00dxoodxoo porta =oxcodelay () porta =*0x80delay ()porta =0x00delay ()2jproject ql/o tfo|0 d:tqstml6mmvnled.cloaded plugin stk500i valuetypelocation并且,我们点击,用來设置断点,以方便观测io变化。 现在我们运行一下程序,点击劃,就会发现如下图所示:/;orkspa

29、ce : xnames-s-l±ra-e-s-i/o atmega16q ad.converterq aitawg.comparator=)bootlbad=| cpud eeprom external.iirterrupt 韵 jtag老 portak m porta卜& ddraim portbm portcm portdla spi® timer_couhter_o© timer.couhterjoxcooxcooxcoi/void main(void)init_devices():/insert your functional code here.

30、 while(1) porta = oxco;u> delay(): porta = 0x80; delay (): porta = 0x00; delay ();继续点击全速运行图标,或者按键f5,就会出现如下:vorkspace 三n xname| y. bitsi/o atmega163e-:±1-e1-±1-:±1-e1-b-:q ad_ccinverterq a1iawg.c0mfarat0rb00t.ij3adcpueefromexter1ialjnterruft是 portab ddram pinaportbportcportd韵spi13 j

31、tag是 portaeeee宀0x80oxcooxco此时io上血的一个led应该会被点、兄。我们继续按f5,void main(void)init_devices():/insert your functional while(1)porta = oxco; delay ();porta = 0x80:u> delay (); porta = 0x00; delay ();就会出现如下:name白.i/o atmega16s-s-el-s-s-.s-.s-曰£> ad_cobvertero anad3g.c0mparat0r (=)boot.waiicpu(=)eepr

32、om external.!町erruptrran a o d i g t f d p jtaforo o o o c 8 xxx o o ojul:e.portbm portcm portd 韵spi® timer_counter_o © timer.counter.l/ivoid main(void)initdevices ();/insert your functional cod« while(1)porta = oxco; delay ();porta = 0x80; delay ():porta = 0x00;u> delay ():.昼愿“o j

33、b info | _ i i". =1 d*tpcbm1 fimmmld r 此时两个灯都被点亮了,然后取消断点,全速运行就可以了。第三讲外部屮断的使用我们先看看mega16单片机的外部中断的引脚和接口。如下图所示:txd14rxd15key116nkey217qkey318key41|9key52071pdo (rxd)pd1 (txd)pd2 (into)pd3 (inti)pd4 (oc1b)pd5 (oc1a)pd6 (icp)(i我们可以看到pd2是接在外部屮断()上而的,现在我们在这个地方接一个按键,用来表示进入外部中断,同时点亮ledo, led的电路图如下所示。qi1

34、3l-i.l-i.3e4l1ll999iiiiii1ii1ii1t.-52二二硬件对应的io接口ledopa6led1pa7text address (word)0x2apaths i compiler targetdevice configuration (atmega16avr studio simulator iodata address byterf17厂0x60use long ci.ll/jmp enhanced core 厂10 regs offset internal sramuse rampz/elpmextended 10boot loader optionsprogram

35、 typeapplicati onc boot loaderboot size| noneadvancedreturn stack sizenon-default startupunused rom fill patternother options: |厂 don0tuser20.r23led2pcoled3pc1led4pc6pc7led5在这里我们只要对key1进行编程,然后使用按键操作,在stdio里面设置断点就可以了, 在程序里面就能看到中断的情况了。还是老规矩,打开iccavr,我们先建立项口,选择芯片, 同时选择目标芯片,如图所示:conpiler opti onsprintf

36、versionq small (int only, no modifier) long (+ long, and modifiers) float (+floal needs > 8k)additional lib.厂 strings in flash onlynote on external ramset as default i load defaultinternal sramhelp设置晶振,如卜图所示。iccavb application builder 116cpu | ports | timero timerl | timer21 uart | spi | analog |

37、target cpu m16厂 pll enable厂 xdiv enable .轡i speed (mhz)(7.37283type a custom valuexdiv frequency|57153hz jwatchdog timer厂 enableprescale cycles “6k厂 interrupt enablecommentinew design-external interruptstrigger onreeprom厂 ready interruptok | options |previewcancel i此时,我们设置portd2为内部上拉。点击ports按键如下设置:i

38、ccavk application builder 116cpu ports | timero | timerl | timer2 | uart | spi | analog |7 6 5 4 3 2 1 0directio n ff(ofttffftrfffvalue 厂rr厂厂厂厂厂厂change 厂厂厂厂厂厂厂厂port bdirectionvaluechangeorr厂厂1rl厂厂2rl厂厂3ii厂厂4(1厂厂5rt厂厂6fl厂厂7ft厂厂-port cdirectio nvaluechange7 6 5 4 3 2 1 0rrrrrrrirrrirtrt厂厂厂厂厂厂厂厂厂厂厂厂厂厂厂

39、厂-port ddirectionvaluechange7 6 5 4 3 2 1 0ifirrrrtrrrirtri厂厂厂厂厂ff厂厂厂厂厂厂厂厂厂厂right click on a "value" bit to define signal nameoptionspreviewcancel然后点击ok出现如下程序:/icc-avr application builder : 2008-10-10 10:14:11/ target : m16/ crystal: 7.3728mhz/作者:南京华岳电子练祥华/功能:学习外部中断0的程序#include <ioml6vh

40、>#include <macrosh>void port_init(void)porta = 0x40;ddra = 0x40;portb = 0x00;ddrb = 0x00;portc = 0x00; /ml03 output onlyddrc = 0x00;portd = 0x04;ddrd = 0x00;#pragma interrupt_handler int0_isr:2void int0_isr (void)/external interupt on into/call this routine to initialize all peripheralsvoid

41、 init_devices(void)/stop errant interrupts until set upcli(); /disable all interruptsport_init();mcucr = 0x00;gicr = 0x40;timsk = 0x00; /timer interrupt sourcessei (); /re-enable interrupts/all peripherals are now initialized现在我们可以进行修改程序,在屮断程序里面,我们可以修改成小断-次,给led0取反一 次。/icc-avr application builder :

42、2008-10-10 10:22:56/ target : ml6/ crystal: 7.3728mhz/作者:南京华岳电子练祥华/功能:学习外部中断0的程序#include <ioml6vh>#include <macrosh>#define led_com porta a= (1 << pa6)void port_init (void)porta = 0x40;ddra = 0x40;portb = 0x00;ddrb = 0x00;portc = 0x00; /ml03 output onlyddrc = 0x00;portd = 0x04;ddrd

43、 = 0x00;#pragma interrupt_handler int0_isr:2void int0_isr(void)led_com;/call this routine to initialize all peripherals void init_devices(void)/stop errant interrupts until set upcli(); /disable all interruptsport_init();mcucr = 0x00;gicr = 0x40;timsk = 0x00; /timer interrupt sourcessei (); /re-enab

44、le interrupts/all peripherals are now initializedvoid main()init_devices();while(1)编译示,在avrstdio屮使用软件仿真可以看到如下结果: 先设置断点雜pragma interrupthandler int0_isr:2void int0_isr(void) _ o led_com;/call this routine to initialize all pei void init_devices(void) _/stop errant interrupts until set up将portd 口如卜设置:| i i % rj m portannnii ii ii innnii ii ii 1nnnii ii ii 1404040m porta ddra+j m portb +j m portc 二 | 罡 portdgportdox.b ddrdox.mpindox.+j 盘 watchdog点击全速运行可以看见如下2个结果:+j 曰 boot.wad£ m portam portaox.ddraox.mfinaox.+j m portb+j 老 portc£ s portdm fortdox.ddrdox.mpindox.+盘 watchdog亠v 0x

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论