AVR C语言开发简介

发布者:传邮万里最新更新时间:2020-03-02 来源: eefocus关键字:AVR  C语言  开发简介 手机看文章 扫描二维码
随时随地手机看文章

Avr单片机和其他单片机一样,有自己的指令和寄存器,特定的IO口操作方法,有定时器,AD转换,串行口,PWM输出,EEPROM等。为了缩短大家学习的时间,快速的了解avr编程思路,拟定avr程序设计系列教程。我使用avr也不是很长时间,技术有限,错误再所难免,还请指出,以期改正。


【说明】:本页是针对从来没有碰过单片机或者用过单片机而没有用c语言的朋友,如果你已经用过其他单片机,此页说明可能对你没有很大帮助,且显得有些幼稚,请你跳过。


本站所有程序都是在icc+avrstudio下进行的,如果你没有配置好环境


采用icc的原因之一是它自带一个非常好用的application builder,生成的代码结构清晰,层次清楚,特别适合新手,如下图。


非常好用的 icc application builder

1.jpg下面通过一个简单的程序,分析avr程序要素,使用icc的程序生成器,Application Builder 界面如下:

icc的程序生成器

2.jpg

进入该界面后,我更改设置,Target CPU,及目标芯片设置位mega16这个非常常用的芯片,Xtal speed 及晶振频率,我选了我用的7.3728MHz。


下面我们来看看我们得到的代码。【说明】:“#”只是为了方便解释代码,并非为程序内容。


#1 //ICC-AVR application builder : 2006-11-3 14:42:54


#2 // Target : M16


#3 // Crystal: 7.3728Mhz


#4 #include


#5 #include


#6 void port_init(void)


#7 {


#8 PORTA = 0x00;


#9 DDRA = 0x00;


PORTB = 0x00;


DDRB = 0x00;


PORTC = 0x00; //m103 output only


DDRC = 0x00;


PORTD = 0x00;


DDRD = 0x00;


#10 }


#11 //call this routine to initialize all peripherals


#12 void init_devices(void)


#13 {


#14 //stop errant interrupts until set up


#15 CLI(); //disable all interrupts


#16 port_init();


#17 MCUCR = 0x00;


#18 GICR = 0x00;


#19 TIMSK = 0x00; //timer interrupt sources


#20 SEI(); //re-enable interrupts


#21 //all peripherals are now initialized


#13 }


#1——#3,注释行,分别说明了程序生成者是ICC-AVR application builder,生成时间,CPU类型,晶振大小,在本例中晶振大小没有用途,但在实际操作中,晶振大小将影响定时器的设置,PWM波形的输出,串口波特率的设定,总线时序等多方面的问题。


#4——#5,包含特定头文件,学过c语言的人都知道,c语言里几乎每个程序都要包含特定的头文件,在这里,iom16v.h和macros.h都在icc程序安装文件夹下一个include的目录中,iom16v.h和你选择的芯片相对应,如果你选择的是atmega32,那个这个文件就是iom32v.h,等等,在这样的文件中定义了对应的芯片的各个硬件地址。macros.h文件中定义了一些宏命令和一些老的语言写法。通常每一个程序都要包含这个头文件。


#6 void port_init(void),定义函数port_init,函数的用途是初始化串口,前面一个void表示函数没有输出,括号里的void表示这个函数没有输入变量。


#7,#10 C语言中所有函数体都要写在{}内,一个开始,一个结束。


#8,定义PA口为0x00,及PA口上的所有管脚输出为低电平,同样道理,如果些微PORTA=0xFF,则都输入高电平,0xFF及二进制的11111111,如果想让某一位输出高,其他为低,如00000001,则是PA0输出为高电平,PA1——PA7输出为低电平。说明:每个口线与单片机实际引脚的对应关系请参看技术手册。


#9,定义引脚的输出输入模式,1为输出,0为输入。当使用输出模式及设置为1时,PORTA的值将影响内部上拉电阻的使用,如果PORTA对应管脚的值为1,则使用内部上拉电阻,否则不采用。 除了这里说的“=”之外,管脚的控制还有其他算符,|= ,&=! ,^=,==,请参考学习笔记:avr端口操作的例子理解,将在本页后面部分说明。


同理,下面部分为BCD口的操作。


#11,注释,说明你可以使用下面的程序来实现初始化。


#13,程序的开始和结束。


#15,内部定义的宏,关闭所有中断。


#16,调用端口初始化的程序。


#17,MCUCR = 0x00;电源管理及睡眠模式寄存器设置,这里设为0x00,为空闲模式,更多内容,请参看atmega16技术手册。


#18,GICR = 0x00;通用中断控制寄存器设置,0x00,代表禁用任何中断,更多内容请参考技术手册。


#19,TIMSK = 0x00;定时器设置,0x00代表不使用定时器。


#20,与#15对应,内部定义的宏,开中断。


#21,注释,所有功能初始化完成。


到此,一个简单的程序就看完了,本程序并不能真正运行,因为没有main主函数。进一步的学习请看


【icc + AVRStudio】下的第一个程序【一】AVR端口操作说明


一些端口操作的运算符总结,我初学时总结出来的东西,端口操作是单片机操作的基本要素。 以下给出不是完整的程序,只是对端口操作的一些理解。


#include


void main(void)


{


PORTA=0xff; //在定义DDRA之前定义PORTA将影响上拉电阻的使用。 1为使用上拉电阻,0为不使用。


DDRA=0xff; //输出 模式 ,IO口上,1为输出,0为输入。


PORTA=0xf0; //等


PORTA&=~0xf0; //清零


PORTA|=0x77; //置一


PORTA^=0x70; //翻转


(P & 0x80)==0x80; //按位与 判断p的第七位是否是一,是则成立


}


ADIF就是4 跟手册的为定义是一样的


(1<


ADCSR=(1<


ADCSR|=(1<


ADCSR&=~(1<


while(ADCSR&(1<


while(1)


{


while(ADCSR&(1<


{


程序......


}


}

关键字:AVR  C语言  开发简介 引用地址:AVR C语言开发简介

上一篇:基于AVR单片机和CMX865的串口转FSK通信模块
下一篇:基于AVR的家庭语音控制器的软硬件实现

推荐阅读最新更新时间:2024-11-10 12:31

基于Atmel微控制器的功率测试
  Xbitlabs的功耗测试非常专业,能够抓取到显卡和CPU独立的功耗,比起其他网站测试整个电脑的功耗来说更具有参考价值。 大部分媒体测试功耗的方法   大部分媒体测试显卡或者CPU功耗时都使用这种功率宝宝,插在排插上,然后电源再接到功率宝宝上,而这样测试的功耗首先包含了电源自身的发热(电源转换效率在75%-90%之间),其次还包含了主板、内存等等设备的功耗。 Xbitlabs的测试工具  Xbitlabs的测试方法就是来测量电源输出测每条线上的电流大小,具体是用Allegro出品的八颗30A的电流传感器ACS713-30T,然后使用Atmel出品的8位控制器Atmega168做模数转换,来接收电流传感器的
[测试测量]
基于Atmel微控制器的功率测试
AVR单片机IAR AVR C语言中断编程
一、AVRmega16中断向量表 向量号 程序地址 中断源 描述 IAR AVR中的定义 1 000 RESET 外部引脚电平引发的复位,上电复位,掉电检测复位,看门狗复位,以及JTAG AVR 复位 RESET_vect 2 002 INT0 外部中断请求0 INT0_vect 3 004 INT1 外部中断请求1 INT1_vect 4 006 TIMER2 COMP 定时器/计数 2 比较匹配 TIMER2_COMP_vect 5 008 TIMER2 OVF 定时器/计数 2 溢出 TIMER2_OVF_vect 6 00A TIMER1 CAPT 定时器/计数 1事件捕捉 TIMER_ CAPT_vect 7 00C T
[单片机]
IAR for AVR 配置JTAGICE mkII仿真时不擦EEPROM
{业务提出的需要} 有时我们想在仿真时,依然可以使用EEPROM中配置好的参数,而不是每次仿真时都重新设置。 {配置方法} 工程- 右键- Debugger - JTAGICE mkII - JTAGICE mkII2 选中 Preserve EEPROM contents even if device is reprogrammed 如下
[单片机]
IAR for <font color='red'>AVR</font> 配置JTAGICE mkII仿真时不擦EEPROM
AVR单片机有什么优点_为什么要选择AVR单片机
  AVR单片机是ATMEL公司研制开发的一种新型单片机,它与51单片机、PIC单片机相比具有一系列的优点:   1:在相同的系统时钟下AVR运行速度最快;   2: 芯片内部的Flsah、EEPROM、SRAM容量较大;   3:所有型号的Flash、EEPROM都可以反复烧写、全部支持在线编程烧写(ISP);   4:多种频率的内部RC振荡器、上电自动复位、看门狗、启动延时等功能,零外围电路也可以工作;   5:每个IO口都可以以推换驱动的方式输出高、低电平,驱动能力强;   6:内部资源丰富,一般都集成AD、DA模数器;PWM;SPI、USART、TWI、I2C通信口;丰富的中断源等。   目前支持AVR单片机编译器的语
[单片机]
<font color='red'>AVR</font>单片机有什么优点_为什么要选择<font color='red'>AVR</font>单片机
AVR单片机按键检测
程序代码如下: #include avr/io.h #include util/delay.h int main(void) { DDRA=0XFF; PORTA=0XFF; DDRD=0X00; PORTD=0XFF; while(1) { if(PIND==0XFE) { _delay_ms(100); if(PIND==0XFE)PORTA=~PORTA; } } }
[单片机]
用Arduino最小系统板作AVR单片机的编程器
用Arduino编程具有简单易学的特点,但要配合Arduino控制板使用,使得成本比较高,体积也大,而且除单片机电路以外的大部分电路只在编程时有用,在电子制作上使用后就是多余的了,造成了浪费。能不能不用Arduino控制板,直接想办法用Arduino给单片机编程呢?答案是肯定的,只要做一个Arduino最小系统板,配合ISP下载线USBtinyISP或USBasp 就可以给AVR单片机下载程序了,Arduino最小系统板有一个锁紧座,方便单片机插上和取下,下载好程序的单片机就可以取下装到目标板上去使用了。 Arduino最小系统板电路见下图,适用于对ATmega8、ATmega168、ATmega328等型号的单片机编程
[单片机]
用Arduino最小系统板作<font color='red'>AVR</font>单片机的编程器
滚动文字与图像兼得的AVR单片机LED显示屏设计
LED 点阵块具有亮度高、发光均匀、可靠性好、拼装方便等优点,能构成各种尺寸的显示屏。目前,LED显示屏已被广泛应用于文字显示并取得了很好的效果,但是大部分仅能显示滚动的文字信息而不能显示图像,并且还存在系统复杂等缺点。本文提出了一种主从式 单片机 的LED 显示屏 解决方案,该设计方案利用AVR单片机自身的FLASH ROM和RAM,外部无需任何存储电路,电路结构简单。该系统实现了图像的16阶灰度显示,可广泛用于商场、车站等公共场合。 1 AVR单片机简介 AVR 单片机是增强型内置FLASH的RISC(ReducedInstruction Set CPU)精简指令集高速8位单片机,硬件采用哈佛(Harward)结构,达到一
[电源管理]
滚动文字与图像兼得的<font color='red'>AVR</font>单片机LED显示屏设计
利用for多重循环实现C语言精确延时
C语言最大的缺点就是实时性差,我在网上到看了一些关于延时的讨论,其中有篇文章51单片机Keil C延时程序的简单研究,作者:InfiniteSPACe Studio/isjfk 写得不错,他是用while(--i);产生DJNZ来实现精确延时,后来有人说如果while里面不能放其它语句,否则也不行,用do-while就可以,具体怎样我没有去试.所有这些都没有给出具体的实例程序来.还看到一些延时的例子多多少少总有点延时差.为此我用for循环写了几个延时的子程序贴上来,希望能对初学者有所帮助.(晶振12MHz,一个机器周期1us.) void Delay(uchar i) { while(--i); } 21: void D
[单片机]
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved