请教 AVR单片机编译成功,但烧写后无结果。
我是新手,写了一个简单的流水灯程序,已设置延时,但写到芯片上八个灯还是常亮的。采用的是AVRStudio+AVRToolChain进行编译的,所用芯片是ATmega16A...
我是新手,写了一个简单的流水灯程序,已设置延时,但写到芯片上八个灯还是常亮的。采用的是AVR Studio +AVR ToolChain进行编译的,所用芯片是ATmega16A,直接烧录开发板自带的hex文件没有问题,但自己编译的烧上就不行。求高手指点,不胜感激!
展开
3个回答
展开全部
#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写的,板子也不一样,你要改一下。
一,编译时有错误或者警告吗,警告也是不允许的。程序开始时,端口初始化代码对不对?
二,先点一个灯,看看程序能运行不能,如果能再加入多个灯的程序。
三,看看你的延时程序对不对。是不是变量让编译器优化掉了。
#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写的,板子也不一样,你要改一下。
一,编译时有错误或者警告吗,警告也是不允许的。程序开始时,端口初始化代码对不对?
二,先点一个灯,看看程序能运行不能,如果能再加入多个灯的程序。
三,看看你的延时程序对不对。是不是变量让编译器优化掉了。
展开全部
你这种情况可能是时间设置的太短,试试很大的数看能不能长灭。还有可能是设置的端口不对,好好的看看。还有可能逻辑错误,由于一般人们总是先学习的51单片机,语言操作相对简单,而到avr上一般很容易操作的逻辑会出错。看看这3个问题有没有。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
想老师请教一下
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询
广告 您可能关注的内容 |