返回首页

avr单片机教程(avr单片机编程软件)

来源:www.haichao.net  时间:2022-12-14 02:38   点击:62  编辑:admin   手机版

1. avr单片机编程软件

看你开发什么单片机。51(STC89C51或者52等51核)AVRMSP430KeilAVRStudio或者ICCAVRIARforMSP430或者CCSARMKeil&MDK或者IARforARM

2. avr单片机下载程序

stc12c5a60s2与51单片机区别:  1、同样晶振的情况下,stc12c5a60s2速度是普通51的8~12倍 对于AT89c51,1个机器周期=12个震荡周期,对于STC12C5A60S2,1个机器周期=1个震荡周期;  2、stc12c5a60s2有8路10位AD;  3、stc12c5a60s2多了两个定时器,带PWM功能;  4、stc12c5a60s2有SPI接口;  5、stc12c5a60s2有EEPROM;  6、stc12c5a60s2有1K内部扩展RAM;  7、stc12c5a60s2有WATCH_DOG;  8、stc12c5a60s2多一个串口;  9、stc12c5a60s2的IO口可以定义,有四种状态;  10、stc12c5a60s2中断优先级有四种状态可定义。

3. Avr单片机

AVR单片机中

  asm("nop");

  这条语句,其中asm()的作用是指函数内部的参数翻译为汇编指令,其作用是在C语言环境下直接使用汇编指令执行。

  nop是一个空等待汇编指令,这个指令执行时,单片机是什么也不做的,仅仅起一个时间延时作用。

  对于AVR单片机来与,如果不分频,那么一个振荡周期就是一个指令周期,因此8M晶振时,其一个指令周期时间是1/8000000秒,即125纳秒。

4. avr单片机仿真软件

不是免费的

iar软件是一款嵌入式单片机集成开发环境,新版本增加了对诸多型号的支持,支持ARM、AVR、MSP430等芯片内核平台,还内置了强大的C/C++编译器和调试器集成开发环境、状态机建模工具等,是您进行单片机开发的不二选择。iar软件基于所有ARM内核设备的广泛支持,来自所有主要供应商。

5. avr单片机开发软件

1. Arduino更倾向于创意,它弱化了具体的硬件的操作,它的函数和语法都非常简单,而且非常“傻瓜”;2.大部分Arduino的主控是AVR单片机,Arduino的优势还是代码封装性高,所需语句少,降低软件的开发难度;3.Arduino上手比较容易,只要懂一点点硬件和C++就能开发。4.Arduino大多数功能都有做好了的库,所以使用起来很简单,但是对于稍微复杂点的功能可控性较差。

6. avr单片机编程入门

①AVR单片机(ATmega16)的时钟源(晶振、内部RC

等)可以不经过分频直接提供给CPU使用,而51的CPU主频等于晶振的12分频,ATmega16外部提供16M的晶振,所以AVR单片机的运行速度比51单片机的运行速度要快得多,并且AVR单片机可提供内容1M、2M、4M、8M等可变的CUP频率。

②AVR具有超功能精简指令。具有32个通用工作寄存器(相当于8051中的32个累加器,克服了单一累加器数据处理造成的瓶颈现象),有128B~4KB个SRAM,可灵活使用指令运算。

③AVRI/O口是真正的双向I/O口,单片机读取外部引脚电平直接通过PINX读取,不需要像51那样先给I/O口全写1操作后才能读取外部引脚电平,使得单片机读取外部数据更容易。

④AVR内部提供丰富的中断及寄存器资源,光外部中断就有3个,定时器有3个,丰富的寄存器资源使得可以设置外部中断的多种触发方式,以及设置内部定时分频系数,丰富的寄存器资源使得可以对AVR的I/O口进行多功能操作

⑤两者的CPU构架以及指令集完全不同,51系列单片机所使用的是CISC指令系统,冯诺依曼结构体系的总线;而AVR系列的单片机则使用的是RISC指令系统,哈佛结构的总线,AVR系列的单片机每个震荡周期处理一条指令,而相应的,51系列的单片机则需要12个震荡周期来完成一条指令的处理。

⑥针对51系列单片机的I/O脚所体现出来的弊端,AVR单片机做了相应的改进,即加入了控制输入或输出的方向寄存器,从而解决了51系列单片机I/O脚位高电平时同为输入和输出的状态。

7. avr单片机编程语言

//绝对调试通过,AVR-GCC,mega16,带数码显示,单键开关多功能控制

#include <avr/io.h>

#include <avr/interrupt.h>

#include <tone.h>

#include <avr/pgmspace.h>

#define uchar unsigned char

#define uint unsigned int

#define key_input PINA

#define pgm16(A) ((typeof(A))pgm_read_word(&(A)))

const unsigned char seg_code[] ={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E,0x7f,0x3f};

const uint music[] PROGMEM={M3,F2,M5,B1,M3,F4,M2,F4,M1,B2,L6,F2,M1,F2,MM,M1,F2,L6,F2,L5,B2, L6,F2,M1,B1,MM,M1,F2,L6,F2,M6,F2,L5,F2,M3,F2,M2,F2,MM,M2,F4,M1,F4,L6,F2,M3,F2,M2,B2, M3,F2,MM,M3,F2,MM,M3,F2,M2,F2,M1,B2,L6,F2,M1,F2,L7,F2,L5,F2,L6,B2, L5,F2,L6,F2,MM,L6,F2,L5,F2,M6,F2,M5,F2,MM,M5,F2,M3,F2,M2,F2,MM,M2,F4,M3,F4,M3,F2,M2,F2,M1,B2, M6,F2,H1,B1,M6,F2,H2,F2,H1,F2,MM,H1,F2,M6,F2,MM,M6,F2,M5,F2,MM,M5,F2,M3,F2,M5,B2, M6,F2,H1,B1,M6,F2,H2,F2,H1,F2,MM,H1,F2,M6,F2,M5,F2,MM,M5,F2,MM,M5,F2,M3,F2,M2,B2, M3,B1,MM,M3,F2,M5,F2,M6,F2,M5,F2,MM,M5,F2,M3,F2,MM,M3,F2,M2,F2,MM,M2,F2,M1,F2,L6,B2, L5,F2,M5,F4,MM,M5,F4,MM,M5,F2,M6,F2,M5,F2,M3,F2,M2,F2,M3,F2,MM,M3,F2,M2,B1,L6,F2,M1,B2, M6,F2,H1,B1,M6,F2,H2,F2,H1,B1,M6,F2,MM,M6,F2,M5,F2,MM,M5,F2,M3,F2,M5,B2, M6,F2,H1,B1,M6,F2,H2,F2,H1,B1,M6,F2, M5,F2,MM,M5,F2,MM,M5,F2,M3,F2,M2,B2,MM, M2,F2,MM,M2,F4,M1,F4,M2,F2,M3,F2,M5,F2,MM,M5,F2,MM,M5,F2,M3,F2,M2,F2,MM,M2,F4,M3,F4,M2,F2,M1,F2,L6,B2, L5,F2,M5,F4,MM,M4,F4,MM,M5,F2,M6,F2,M5,F2,M3,F2,M2,F2,M2,F4,M3,F4,MM,M3,F2,M2,B1,L6,F2,M1,B3,0XFF,0XFF};

//因为两个相同的音符之间无停顿,人为插入了MM(极短暂的

volatile uint i=1;

volatile uchar timeOK=0;

uchar key_scan(void);

ISR(TIMER0_COMP_vect) //CTC模式,控制音调高低

{

OCR0=pgm16(music[i-1]);

}

ISR(TIMER1_OVF_vect) //时间溢出模式,控制节拍长短

{

i+=2;

TCNT1H=(65536-pgm16(music[i]))/256; //相当于(65536-beat[i])/256

TCNT1L=(65536-pgm16(music[i]))%256; //相当于(65536-beat[i])%256

if(pgm16(music[i])==0xff)i=1; //在音调数组的最后加一个0xff,作为终止信号

if(pgm16(music[i])==0x00)TIMSK&=(~(1<<OCIE0));

else TIMSK|=(1<<OCIE0);

}

ISR(TIMER2_OVF_vect) //时间溢出模式,用于检测按键,周期10ms

{

TCNT2=100;

timeOK=1;

}

void timer0_init(void)

{

TCCR0=0x00;

TCNT0=0x00;

OCR0=pgm16(music[i-1]);

TCCR0=0x1a;

//TIMSK|=(1<<OCIE0);

}

void timer1_init(void)

{

TCCR1B=0x00;

TCNT1H=(65536-pgm16(music[i]))/256;

TCNT1L=(65536-pgm16(music[i]))%256;

TCCR1A=0x00;

TCCR1B=0x05;

//TIMSK|=(1<<TOIE1);

}

void timer2_init(void)

{

TCCR2=0x00;

TCNT2=100;

TCCR2=0x03;

TIMSK|=(1<<TOIE2);

}

void MCU_init(void)

{

DDRA=0X00;

DDRB=0X00;

DDRC=0XFF;

DDRD=0XFF;

PORTB=0X00;

PORTC=0xfe;

PORTD=0xff;

}

uchar key_scan(void) //按钮扫描函数

{

static uchar key_state=0,key_time1=0,key_time0=0; //静态变量,调用以后,值被保留;

uchar key_press,key_return=0;

key_press=(~key_input)&0x01; //有键1,无键0

switch(key_state) //状态机

{

case 0: //状态0:无按钮按下状态

if(key_press)key_state=1;

break;

case 1: //状态1:检测到有按钮被按下

if(key_press) //按钮仍按下,转2

{

//TIMSK^=(1<<TOIE0);

key_state=2;

key_time1=0; //按下时间初始

}

else //按钮已经释放,消抖

key_state=0;

break;

case 2: //状态2:等待释放或等待按下时间达到长按要求

if(!key_press) //按钮已经释放,转3,继续判断是双按还是单按

{

key_state=3;

key_time0=0; //释放时间初始

}

else if (++key_time1>=100) //按下时间达到1000ms,返回值2,作长按判断,转7等待按钮释放

{

key_state=8;

key_time1=0;

key_return=2;

}

break;

case 8:

if(!key_press)

{

key_state=0;

key_time1=0;

}

else if (++key_time1>=50)

{

key_return=2;

key_time1=0;

}

break;

case 3: //状态3:双按的第二次按钮输入前的等待间隙,设定100ms(经过测试,100ms为比较合适的时间间隙,即为人体普通可以双击的速度

if(key_press)key_state=4; //在此时间,如果有按钮被按下,将当作释放抖动,转4进一步作出判断

else if (++key_time0>4) //如果没有按钮被按下,则等待此100ms过去,然后转5

{

key_state=5;

key_time0=0;

}

break;

case 4: //状态4:第二按的消抖处理

if(key_press)key_state=2; //快速连按(被认为人手指达不到要求的速率)将被返回到2,当作第一按处理

else key_state=3; //如果第二按只出现一次,不到10ms,消抖

break;

case 5: //状态5:第二按前等待时间到达,进入正常的第二按等待输入状态,第二按只允许在此时间内输入方为有效

if(key_press)key_state=6; //此时间内有被按下,转6,判决抖动;

else if(++key_time0>14) //无输入,则等待输入有效时间过去,时间满后,判定为单按,返回值1,状态位回到0

{

key_state=0;

key_time0=0; //双击间隔时间一般为100ms,能够稳定做到第二击完成时间总共约180~200ms(因人而异)

key_return=1; //为增加采样成功率,可适当缩短第二按前的间隙时间,增加第二按等待输入时间,但总时间不可短于150ms

} //小于150ms,手指将很难达到双击的速度要求,如果时间太长则单按判断时间过长,按钮不灵敏,此处180ms经测试较为合适

break;

case 6: //状态6:第二按的抖动判断

if(key_press) //按钮仍有效,按下有效,返回3,双按成立,转7等待按钮释放

{

key_state=7;

key_return=3;

}

else key_state=5; //抖动消除,退回5继续等待输入或等待输入有效时间过去

case 7: //按钮释放等待状态,所有已按下并被识别操作目的的按钮状态都将转到7等待按钮释放,并将所有计时初始

if(!key_press)key_state=0;

key_time1=0;

key_time0=0;

break;

}

return key_return;

}

int main(void)

{

MCU_init();

timer0_init();

timer1_init();

timer2_init();

sei();

while(1)

{

if(timeOK)

{

cli();

uchar key;

key=key_scan();

if(key>0)PORTD=seg_code[key];

switch(key)

{

case 1:

TIMSK^=((1<<OCIE0)|(1<<TOIE1)); DDRB^=(1<<DDB3); PORTC=0xfd;

break;

case 2:

//TIMSK|=((1<<OCIE0)&(1<<TOIE1));

if(i>1)i+=10;

if (i>=(sizeof(music)-20))

{

i=1;

TIMSK&=(~((1<<OCIE0)|(1<<TOIE1)));

DDRB&=~(1<<DDB3);

}

PORTC=0xf0;

break;

case 3:

TIMSK&=(~((1<<OCIE0)|(1<<TOIE1)));

i=1;

TIMSK|=((1<<OCIE0)|(1<<TOIE1));

PORTC=0xfe;

break;

default:

break;

}

timeOK=0;

sei();

}

}

}

8. avr编程器

不知道你问的是该单片机是不是能用串口,还是是不是可以用串口烧程序。

这样说吧,atmega16单片机是有串口的;

它是通过单片机的SPI口烧录程序的(电脑这头是接并口或USB口),烧录时需要配置好熔丝位,不然功能完全不对,本人刚接触AVR单片机时就在这折腾过。本人用的是双龙的下载器,用着还行,如果是XP系统很多款可选,如果是WIN7系统,就必须买2代USB型号(当初也被这折腾过)。

希望对你有帮助。

9. avr单片机下载器

AVR已经衰落了,功能还可以,性能不强,而且还贵的要死。不过如果从51向ARM过渡的话,AVR是首先,AVR里边很多的外设ARM也有,但AVR非常简单,浅尝辄止。

MSP430现在也够呛了,STM32比它性能好,价格比它便宜,谁用它啊?不过,在低功耗上430还有点优势,速度上不及STM32,但也算不慢,学习起来比AVR要难,入门算不太难,只是新手不知道先学哪一部分后学哪一部分,如果按书上来,想快速入门是没指望了。不过从430过渡到ARM比较容易,复杂度上ARM只是略胜一筹(和STM32比)

STM32,强烈推荐,它的优势是性价比高,虽然在ARM里不是什么高端的片子,但是便宜啊,这是王道。从51直接入门STM32很有难度。因为现在的教程都喜欢把Contex-m3核的东西和STM32的东西杂揉在一起讲,对初学者来说没有整体的印象,鸭子听雷,一般人很快就放弃了。而且这种高端单片机都比较复杂,外设器件间都有联系,你想通过几个例程就来掌握,那基本就是填鸭,弯路要走很多。

PIC没用过,不知道。

10. avr单片机用什么软件编程

AVR单片机是1997年由ATMEL公司研发出的增强型内置Flash的RISC(Reduced Instruction Set Computer) 精简指令集高速8位单片机。AVR的单片机可以广泛应用于计算机外部设备、工业实时控制、仪器仪表、通讯设备、家用电器等各个领域。

顶一下
(0)
0%
踩一下
(0)
0%