请教 AVR单片机编译成功,但烧写后无结果。

我是新手,写了一个简单的流水灯程序,已设置延时,但写到芯片上八个灯还是常亮的。采用的是AVR Studio +AVR ToolChain进行编译的,所用芯片是ATmega16A,直接烧录开发板自带的hex文件没有问题,但自己编译的烧上就不行。求高手指点,不胜感激!

#include <avr/io.h>
#include <avr/delay.h>
//注: 内部函数_delay_ms() 最高延时 262.144mS@1MHz 即 32.768ms@8MHz
// 该函数可以实现较精确的定时for()/while()指令很难计算延时时间
// 为了使 _delay_ms()函数的延时正确,须在makefile中设定F_CPU为实际的系统时钟频
// 本范例为6MHz外部晶振振荡器 即 F_CPU=6000000

//-----------位操作定义------------------------
#define sbi(sfr, bit) (_SFR_BYTE(sfr) |= _BV(bit))
#define cbi(sfr, bit) (_SFR_BYTE(sfr) &= ~_BV(bit))

#define LED_ON cbi(PORTD,7)//在程序用LED_ON代替cbi(PORTD,7)

//内部函数_delay_ms() 最高延时 262.144mS@1MHz 即 32.768ms@8MHz
void delay_ms(unsigned int ms);//----ms级延时

//内部函数_delay_us() 最高延时 768 us@1MHz 即 96 us@8MHz
void delay_us(unsigned int us);//----us级延时

//--------------------------------------------------------------------------
int main(void)
{
unsigned char i,j; //定义变量

DDRA=0xFF; //定义了端口PORTA全部为输出
PORTA=0xFF; //PA口设为输出高电平,灯灭PORTA

//第一种方法选通PD7(LED的电源控制的端)
//DDRD=0xFF; //PORTD全部设置为输出
//PORTD=PORTD & 0x7F; //0x7F=0b0111 1111

//第二种方法选通PD7(LED的电源控制的端)
//DDRD=0xFF; //PORTD全部设置为输出
//PORTD=0x7F; //0b0111 1111

//第三种方法选通PD7(LED的电源控制的端)
sbi(DDRD,7);//对PD7的DDR清零,PD7设置为输出
LED_ON;//PD7输出低电平

while(1)
{
i=0x01;
for (j=0;j<8;j++) //循环8次,即PA0~~PA7轮流闪亮
{
PORTA=~i; //反相输出,低电平有效
delay_ms(100);
i=i<<1; //左移一位
// 0b00000001 PB0
// 0b00000010 PB1
// 0b00000100 PB2
// 0b00001000 PB3
// 0b00010000 PB4
// 0b00100000 PB5
// 0b01000000 PB6
// 0b10000000 PB7
}

i=0x80;
for (j=0;j<8;j++) //循环8次,即PA0~~PA7轮流闪亮
{
PORTA=~i; //反相输出,低电平有效,
delay_ms(100);
i=i>>1; //右移一位
}
}
}

//----------------ms级延时---------------
void delay_ms(unsigned int ms)
{
unsigned int i;
for(i=0;i<ms;i++) _delay_ms(1); //延时 i*ms= 毫秒,可自行调节
}

//----------------us级延时---------------
void delay_us(unsigned int us)
{
unsigned int i;
for(i=0;i<us;i++) _delay_us(1); //延时 i*us= 毫秒,可自行调节
}

我实验板的流水灯,参考一下,这个程序用gcc写的,板子也不一样,你要改一下。
一,编译时有错误或者警告吗,警告也是不允许的。程序开始时,端口初始化代码对不对?

二,先点一个灯,看看程序能运行不能,如果能再加入多个灯的程序。

三,看看你的延时程序对不对。是不是变量让编译器优化掉了。
温馨提示:内容为网友见解,仅供参考
第1个回答  2013-07-23
你这种情况可能是时间设置的太短,试试很大的数看能不能长灭。还有可能是设置的端口不对,好好的看看。还有可能逻辑错误,由于一般人们总是先学习的51单片机,语言操作相对简单,而到avr上一般很容易操作的逻辑会出错。看看这3个问题有没有。
第2个回答  2013-07-23
想老师请教一下

烧写AVR单片机一直不成功,连识别也不可以,求大神帮忙解决
看你编程器的状态是已经连接上啦。检测一下你单片机的电源打开没有(或者有没有电源)。你点“熔丝”。设置完后点击写入熔丝位。如果能写入就正常,如果不能写入说明有可能你芯片烧死啦!换个芯片或者用高压编程器重新写熔丝。

单片机焊好之后,用AVR_fighter烧写程序提示“进入编程模式失败,请检 ...
(5)AVR芯片加密以后仅仅是不能读取芯片内部Flash和E2PROM中的数据,熔丝位的状态仍然可以读取但不能修改配置。芯片擦除命令是将Flash和E2PROM中的数据清除,并同时将两位锁定位状态配置成“11”,处于无锁定状态。但芯片擦除命令并不改变其它熔丝位的状态。(6)正确的操作程序是:在芯片无锁定状态下,...

avr单片机用avr studio编译,得到hex,然后用usbasp能下载吗,请高手指教...
usbasp是第三方设备,不能仿真avr单片机,只能烧写程序。如果要仿真的话需要用能和avrstudio联合的JTAG设备。

学习avr单片机有必要学汇编语言吗
看你是学来玩玩还是要真正使用它。学来玩玩的话那学不学无所谓。但要是真正好用好某个单片机,不管是不是AVR,都必须先学它的结构和指令,而指令就是汇编。因为不管是C语言还是Basic语言,最后还是要编译成为单片机能识别的指令文件才能烧写到单片机里运行。很多情况下,调试单片机程序都需要看指令文件。...

ICC编译成功,但用AVR_figther烧写程序时提示HEX文件内容错误,为什么呢...
这儿选atmega16点ok,再重新编译一次,应该就行了

【求助】本人想往单片机研发方面发展
软件方面方面, 51 单片机用的是 KEIL 软件,这个软件在学校图书馆软件下载和其他网站上都有,具体用法自己查找相关资料, AVR 的软件就比较多了,我用的是 CVAVR ,另外还有 ICCAVR 等多款编译软件,这要看个人喜好了,建议有了一定的 51 基础再学。另外就是烧写软件,烧写软件的作用就是将编译器...

如何用AVR Studio烧写ATMEGA8L8AU单片机程序
1,把串口线连接电脑和开发板(或产品)2,打开AVR Studio,关闭自动启动的提示窗口 3,打开开发板的电源 4,点击AVR Studio菜单上的Tools,下拉菜单里的program右边显示菜单里的connect...或者Auto connect都可以,5,如果连接正常,就会显示一个设置画面如图 6,点Main设置单片机型号(第一行),点Fuses...

AVR单片机能用什么软件写程序?
ICCAVR才是更好的选择。界面友好,功能强大,集开发环境和编译烧写于一体。AVR单片机软件主要有:1、开发环境:ICCAVR、CVAVR、GCC_WinAVR、AVR Studio等 2、ISP烧写软件(编程软件): ICCAVR、CVAVR、PnoyProg2000、SLISP等 你可以都试一下,选择自己最喜欢的用得最习惯的软件。

avr编译时,我们可不可以用单片机读出hex文件的创建时间?
可以的, C标准中指定了一些预定义的宏 __DATE__进行预处理的日期(“Mmm dd yyyy”形式的字符串文字)__TIME__源文件编译时间,格式微“hh:mm:ss”可以直接这样用 printf( "The date is %s.\\n", __DATE__ );

编程器做什么用的,还有一些关于单片机烧写的问题
4.ISP3.8这个软件应该可以烧写支持ISP程序下载的单片机。但你用的是USB转串口的硬件,所以你所选单片机应该是STC51系列单片机,而不是AT51系列单片机,两者程序下载方式是不一样的。如果要烧写AT51系列单片机必须用专用的编程器。5.51单片机的指令周期长,AVR的指令周期短,在同样的外部时钟下,AVR的运行...

相似回答