avr单片机编程入门精品,新手学习必看(有典型实例哦)
单片机分为很多种,有什么avr单片机,stm32单片机等,随着单片机被广泛的使用,这些都是在单片机学习中需要接触的,有很多人问我:对于avr单片机编程来说,学习这个的时候很是迷茫,死活入不了门,到底avr单片机编程如何入门,这里就让我这个老鸟教会你。
首先要知道,avr单片机是什么?不然不了解这个,那接下来的学习也是白瞎,AVR单片机是1997年由ATMEL公司研发出的增强型内置Flash的RISC(Reduced Instruction Set CPU) 精简指令集高速8位单片机。可以广泛应用于计算机外部设备、工业实时控制、仪器仪表、通讯设备、家用电器等各个领域。
AVR单片机特点(ATmega16):
1、131条机器指令,且大多数指令的执行时间为单个系统时钟周期;
2、32个8位通用工作寄存器;
3、工作在16MHz时具有16MIPS的性能;
4、配备只需要2个时钟周期的硬件乘法器。
AVR单片机优势:
AVR单片机是Atmel公司推出的较为新颖的单片机,其显著的特点为高性能、高速度、低功耗。它取消机器周期,以时钟周期为指令周期,实行流水作 业。AVR单片机指令以字为单位,且大部分指令都为单周期指令。而单周期既可执行本指令功能,同时完成下一条指令的读取。通常时钟频率用4~8MHz,故 最短指令执行时间为250~125ns。
了解了这些,那接下来就通过一系列的实例,让你对avr单片机了解透彻
系统时钟:
ATmega16的片内含有4种频率(1/2/4/8M)的RC振荡源,可直接作为系统的工作时钟使用。同时片内还设有一个由反向放大器所构成的OSC(Oscillator)振荡电路,外围引脚XTAL1和XTAL2分别为OSC振荡电路的输入端和输出端,用于外接石英晶体等,构成高精度的或其它标称频率的系统时钟系统。
为ATmega16提供系统时钟源时,有三种主要的选择:(1)直接使用片内的1/2/4/8M的RC振荡源;(2)在引脚XTAL1和XTAL2上外接由石英晶体和电容组成的谐振回路,配合片内的OSC(Oscillator)振荡电路构成的振荡源;(3)直接使用外部的时钟源输出的脉冲信号。方式2和方式3的电路连接见图2-6(a)和2-6(b)。
内部看门狗:
在AVR片内还集成了一个1MHz独立的时钟电路,它仅供片内的看门狗定时器(WDT)使用。因此,AVR片内的WDT是独立硬件形式的看门狗,使用AVR可以省掉外部的WDT芯片。使用WDT可以有效的提高系统的可靠行。
avr单片机的工作流程:
AVR CPU的工作是由系统时钟直接驱动的,在片内不再进行分频。图2-7所示为Harvard结构和快速访问寄存器组的并行指令存取和指令执行时序。CPU在启动后第一个时钟周期T1取出第一条指令,在T2周期便执行取出的指令,并同时又取出第二条指令,依次进行。这种基于流水线形式的取指方式,使AVR可以以非常高的速度执行指令,获得高达1MIPS/MHz的效率。
存储器:
所有的I/O寄存器可以通过IN(I/O口输入)和OUT(输出到I/O口)指令访问,这些指令是在32个通用寄存器与I/O寄存器空间之间传输交换数据,指令周期为1个时钟周期。此外,I/O寄存器地址范围在$00-$1F之间的寄存器(前32个)还可通过指令实现bit位操作和bit位判断跳转。SBI(I/O寄存器中指定位置1)和CBI(I/O寄存器中指定位清零)指令可直接对I/O寄存器中的每一位进行位操作。使用SBIS(I/O寄存器中指定位为1跳行)和SBIC(I/O寄存器中指定位为0跳行)指令能够对这些I/O寄存器中的每一位的值进行检验判断,实现跳过一条指令执行下一条指令的跳转。
在I/O寄存器专用指令IN、OUT、SBI、CBI、SBIS和SBIC中使用I/O寄存器地址$OO~$3F。
当以SRAM方式寻址I/0寄存器时,必须将该其地址加上$0020,映射成在数据存储器空间的地址。
两个重要的寄存器:状态寄存器SREG和堆栈指针寄存器SP
堆栈是数据结构中所使用的专用名词,它是由一块连续的SRAM空间和一个堆栈指针寄存器组成,主要应用于快速便捷的保存临时数据、局部变量和中断调用或子程序调用的返回地址。堆栈在系统程序的设计和运行中起者非常重要的作用,只要程序中使用了中断和子程序调用,就必须正确的设置堆栈指针寄存器SP,在SRAM空间建立堆栈区。
处在I/O地址空间的$3E($005E)和$3D($005D)的两个8位寄存器构成了AVR单片机的16位堆栈指针寄存器SP。AVR单片机复位后堆栈寄存器的初始值为SPH=$00、SPL=$00,因此建议用户程序必须首先对堆栈指针寄存器SP进行初始化设置。
AVR的堆栈区是建立在SRAM空间的,16位的SP寄存器可以寻址的空间为64K。
由于AVR的堆栈是向下增长的,即新数据进入堆栈时栈顶指针的数据将减小(注意:这里与51不同,51的堆栈是向上增长的,即进栈操作时栈顶指针的数据将增加),所以尽管原则上堆栈可以在SRAM的任何区域中,但通常初始化时将SP的指针设在SRAM最高处。
对于具体的ATmega16芯片,堆栈指针必须指向高于$0060的SRAM 地址空间,因为低于$0060的区域为寄存器空间。ATmega16片内集成有1K的SRAM,不支持外部扩展SRAM,所以堆栈指针寄存器SP的初始值应设在SRAM的最高端:$045F处。
根据上面所讲述,AVR的SP堆栈指针寄存器指示了在数据SRAM中堆栈区域的栈顶地址,一些临时数据、局部变量,以及子程序返回地址和中断返回地址将被放置在堆栈区域中。在数据SRAM中,该堆栈空间的顶部地址必须在系统程序初始化时由初始化程序定义和设置。
当执行PUSH指令,一个字节的数据被压入堆栈,堆栈指针(SP中的数据)将自动减1;当执行子程序调用指令CALL或CPU响应中断时,硬件会自动把返回地址(16位数据)压入堆栈中,同时将堆栈指针自动减2。反之,当执行POP指令,从堆栈顶部弹出一个字节的数据,堆栈指针将自动加1;当执行从子程序RET返回或从中断RETI返回指令时,返回地址将从堆栈顶部弹出,堆栈指针自动加2。
通过这些原理及实例,你是否对avr单片机编程有了更深入的了解呢,其实avr单片机学习并不难,只要你认真去学,把每一步每一个流程都掌握透彻,那你就在avr单片机编程方面就已经入门了,这些你是否get到了呢?
AVR单片机学习(四)开发基础知识
一、AVR开发工具简介及开发环境的建立软件开发工具
编译环境:WinAVR
下载软件:MucodeISP
仿真环境:AVR Studio
集成环境:AVR Studio,可以内联WinAVR 成为一个具有编译、仿真、下载功能的集成环境
硬件开发工具
下载线(并口也有USB接口的,功能是下载程序配置熔丝位)
仿真器
学习板(或手工焊接的系统板)
工具手册
WinAVR技术手册
ATmega16官方中文版技术手册(英文水平好也可以看看英文版)
WinAVR 说明
WinAVR 下载安装后只用到PN其他删除就行了、PN我们一般把他作为一个编辑环境来使用,保存为.c文件之后他就会变成一个有颜色的C文件了,这个有点就显示出来了(关键字带颜色深蓝色和点击小括号其中另一半就会高亮很多层括号就有用了)而WinAVR 的编译功能需要编写Makefile文件所以对初学者有难度先不介绍了。而编译使用AVR Studio来完成就可以了。
下载线作用
一、修改熔丝位 熔丝位可理解为是一个独立于CPU之外的一块小存储区它保存了一些关键的控制位、如:时钟源、一些I/O口的特殊作用。
二、向单片机Flash中下载程序代码。不具备单步调试仿真功能。
三、下载线有很多种,最常用的是插在计算机并口上的STK200/300
下载软件说明
下载软件有很多、但推荐初学者使用Mucode isp 优点是熔丝位设置很清晰,不至于设错而锁死芯片
MUcode ISP 如果外部石英晶振高于8MHZ 也选3.0---8MHZ 防止锁死如果芯片锁死了,就下载不进去程序了。芯片解锁只能采用高压编程器,将熔丝位修改回来。然后另一个比较重要的熔丝位是(共16个红点和绿点)这个表示的是ATmega16 的2字节的熔丝位,上面8个表示时钟电源模式。更改时钟的话上面8个自动做出相应的变化。变绿=1 表示没有使能变红表示使能的红点按下去就是使能的意思就好在这里。下面8个最重要的是JTAGEN这个,打开ATmega16 技术文档发现JTAG有个4个脚和普通的I/O口是复用的(TDI TDO TMS TCK )可以配置成普通I/O用也可以当JTAG接口用。现在JTAGEN =0 红色 说明这个4个只能当JTAG 口用。所以在编程的时候对这4个I/O操作就是无效的。点一下变绿了就不使能了,可以当普通I/O口用,当然这个时候JTAG仿真器就连不上了。CKOPT 这个熔丝位如果使能外部晶振的振幅就会变得比较大,示波器就能看的出来会变成5V左右的振幅,如果不使能,晶振就工作与一种低功耗的模式,振幅比较小。初学不用管。EESAVE表示向Flash编程的时候是否擦出内部的EEPROM ,使能就是不擦出,当初学用不到。
一般我们只管设置时钟(前8个 选了就不用管了)和JTAGEN (下面8个其中的一个)就行了。下载线和下载软件
AVR Studio 是Atmel公司官方的汇编、下载与仿真软件可以内联WinAVR获得C语言编译能力。单独装AVR Studio只能编译汇编语言的代码,通过JTAGE 工具也具有下载仿真的功能也可以更改熔丝位不过熔丝位不够直观。内联就可以获得C语言编译能力了。
JTAG ICE 是Atmel公司官方的仿真调试器,但已经被仿制,价格比官方版本要便宜十倍,可以使用淘宝购买的JTAGEICE 当然你买的时候最要要卖家给发给你个AVR Studio 的版本装了AVR Studio 4,创建一个项目如下图,点击下一步
选着JTAGE ICE ATmega16 点击完成
进入项目
点击project 下的配置选项 (configuration options)
填入:晶振频率和代码优化 选项(-00 -01 -02 -03 -0s) 从小到大 0s 最大的优化越好编译出的代码越小,执行速度越快。我们选-00 因为在优化的情况下有些时候会出现一些极其少见的问题。建议选-00。点击确定。
注意AVR都要包含一个最为基本的头文件
#include //在C:\WinAVR\avr\include\avr 这个路径下就有io.h文本文件 可以用PN打开看看
//在AVR Studio下编译代码就不如在 WinAVR下编译好如括号不好用。
调试如下
这样其实已经通过仿真器已经下载到了单片机里面了,这就提到一个JTAG的一个好处,JTAG 一边是DB9头一边就是JTAG仿真接口接单片机。所以仿真什么结果实际运行就是什么结果是一样的。51不带JTAG口一般采用伟福仿真器。、它的仿真是一种ROM仿真,仿真时候使用仿真头来代替单片机来进行仿真,最后再下载进去,所以最后运行的结果不一定是一样的。
二、计算机原理基础知识讲解
数值就是一位数字能够表示的数的数量,N进制数的进位规则是“冯N进1,常用的数制有十进制、二进制、十六进制。人类有十个指头,所以习惯采用十进制。计算机只能识别0和1,采用二进制。为了计算机学中的数据写方便,采用十六进制。位于字节的概念:
位(bit):简写为b,表示二进制数的一位。
字节(byte):简写为B,8位为一字节
数值转换工具:Windows自带的计算器
1Byte = 8bit
1字节=2位十六进制数
例如:
0x55 = 0b01010101 = 85
0xa3 = 0b10100011 = 163
存储器
对于8位单片机,其内部存储器均为8位。
RAM与ROM 模型
这是一个1K大小的ROM 1024-1=1023 = 0x3FF 1维的模型 每一个地址对应一个存储单元,一个存储单元房的有数据像上图的0x23 0x55 0x6a ...0xcf等 存储的都是8位的二进制数。外部模型如右边的 主要有2组总线一边是地址线一边是数据线(其实还有个控制总线没画出),对这个RAM读写给地址线送一个相应地址通过控制总线表示当前是读模式,相应的数据线就将对应的地址存的内容送到数据线上。对于ROM也是这样的。
CPU
CPU即是为中央处理器
取指令-执行
三、C语言基础知识讲解
变量
运算符
语句
函数
顺序语句
选择语句
循环语句
数组和指针
变量:变量就是存储于RAM或ROM中的数据
变量的分类:
单片机中比较常用的是字符型(char)和整型(int)
实型(float)变量在单片机C语言中一般用不到(浮点)
运算符:类似于数学运算中的运算符号(+ - * / 移位等C语言课本后有附表)
语句:C语言中以分号作为一条语句的结束
习惯上每条语句单独占用一行,但也可以每行有多条语句, 用分号隔开即可
DDRx PORTx 都在io.h 里面有定义 当然内嵌一层(
#elif defined (__AVR_ATmega16__)
# include )
在找到iom16.h就有定义地址了
#define DDRC _SFR_IO8(0x14)
#define DDC0 0
#define DDC1 1
#define DDC2 2
#define DDC3 3
#define DDC4 4
#define DDC5 5
#define DDC6 6
#define DDC7 7
就是说明在 0x14位置 0001 0100 这个地址保存一个8位二进制数 没一位表示一个I/O口的方向
字符型变量
占用存储器中的一个字节空间,即8位二进制数
取值范围:0~(2^8 - 1 )即0~255
可以赋值为整数或ASCII码
char zifu =97;
char zifu = 'a'//这种特殊方式是‘a’ 字符就是把ASCII码值给了ASCII(2)0--255对应一个字符是一种映射关系单引号告诉编译器从这个码表中取出对应的ASCII码赋值给zifu 查下表得出对应就是97,所以这两条语句是等效的。
前提是先进入调试模式下view下的Watch才能用 不然是灰色的
在Value右键可以选十六进制和十进制 看看 location下显示的是地址(SRAM)中的位置
整形变量
占用存储器中的2个字节,即16位二进制数
有无符号子类型
unsigned int :无符号整型
取值范围0~(2^16-1)即0~65535
signed int 有符号整形,signed 可以省略。
取值范围-2^15 ~ (2^15-1)即-32768 ~ 32767
长整型
取值范围更大的int 子类型
long int :长整形,长度为32位,即4个字节
long long int :长度为64位,即8个字节
常用的运算符
赋值 = 加 + 减 - 乘 * 除 / 括号() 求余%
与& 或| 取反~ 异或^ 左移 << 右移 >>
逻辑与&& 逻辑||
了解更多AVR单片机系列,请关注“云汉电子社区(ickeybbs) ”官方微信公众号,或者登录云汉电子社区官方网站(bbs.ickey.cn)
相关问答
如何用 c语言 编写 单片机 程序?使用单片机专用的编译器,比如AVR单片机要用ICCforAVR、AVRStudio等。然后在选项中选择单片机型号,比如ATmega16、ATmega128。最后要查询单片机所对应的...
会51 单片机 ,如何快速学习使用STM32 单片机 ?单片机其实都是相通的,会了一种单片机,对着数据手册查看一下寄存器的设置可以快速的入手其他型号的单片机。会51单片机,说明有单片机的基础,再去学习STM32单...
怎么逆向分析 单片机 的hex文件?有相关的书籍吗?说来话长,一时不知怎么回答你,给你推荐几本书,看看合不合适:《51单片机》,《单片机的原理与应用》,《单片机的C语言应用程序设计》作者:马忠梅《PIC单片...
单片机c语言 在什么上编译?使用单片机专用的编译器,比如AVR单片机要用ICCforAVR、AVRStudio等。然后在选项中选择单片机型号,比如ATmega16、ATmega128。最后要查询单片机所对应的...
我是一名大专生,想自学成为 单片机 硬件工程师,应该学些什么知识呢?C语言推荐谭浩强的51单片机书有很多,教学视频的话推荐郭天祥的视频教程,土豆里很多模拟、数字电子技术要画电路图,需要了解下基本知识还有就是画原理图和PCB的...
向 单片机 高手求助,怎样用 C语言 编写歌曲程序和歌曲代码?需要用那些工具怎么样编写的要求详细解答。谢谢?//绝对调试通过,AVR-GCC,mega16,带数码显示,单键开关多功能控制#include{key_state=7;key_return=3;}elsekey_state=5; ...
初学者选择哪种 单片机 学习比较好?单片机的种类很多,若基础知识扎实,不论选择哪款单片机入门皆可,但对于普通的单片机初学者建议还是以简单的AT89S51单片机入门较好。选用该单片机入门有以下优...
单片机 什么书最好?51:《单片机的C语言应用程序设计》作者:马忠梅PIC:《PIC单片机入门与实战》作者:张明峰AVR:《AVR单片机嵌入式系统原理与应用实践》作者:马潮这就是我...
avr单片机 和51的区别?①AVR单片机(ATmega16)的时钟源(晶振、内部RC等)可以不经过分频直接提供给CPU使用,而51的CPU主频等于晶振的12分频,ATmega16外部提供16M的晶振,所以AVR单...
Arduino和 单片机 有什么区别?先学哪个比较好?Arduino的核心是一块AVR单片机,单片机就是一个芯片,而Arduino是一套软硬件都封装了的模块。肯定是学单片机啊,Arduino也就是玩玩而已,真正有技术含量有产品应...