一乐电子

一乐电子百科

 找回密码
 请使用微信账号登录和注册会员

QQ登录

只需一步,快速开始

快捷登录

手机号码,快捷登录

搜索
查看: 2371|回复: 17
收起左侧

[avr] 新手玩AVR单片机求指教 低级LED闪烁问题

[复制链接]
发表于 2013-8-14 17:07 | 显示全部楼层 |阅读模式
#include <AVR/io.h>


int main(void)
{
   int i = 0, j = 0;
        DDRB=0xff;
        while(1)
        {

        PORTB=0b10000000;
        for(j=0;j<20;j++)
          for(i=0;i<10000;i++);


        PORTB=0b00000001;
        for(j=0;j<20;j++)
          for(i=0;i<10000;i++);
       

       
        }
       
}
此程序仿真单步可以运行但是全速运行不了·下载到单片机2个LED灯一直亮着是不是延时不够啊·?在线等答案搞了一天了·哪位大神帮帮忙吧··

发表于 2013-8-14 17:19 | 显示全部楼层
用AVR SDK自带的延时函数就好了
发表于 2013-8-14 17:19 | 显示全部楼层
发表于 2013-8-14 17:21 | 显示全部楼层
延时短了吧,晶振多大的,按8M算,延时20*10000/8000000=1/40s,刚好看不到闪烁,再长一点就能看到闪了
发表于 2013-8-14 18:56 | 显示全部楼层
不规范的代码书写而已。

        for(j=0;j<20;j++)
          for(i=0;i<10000;i++);

经过编译器优化后,等于
{};
也就是什么都不做

良好的习惯,决定一个民族
发表于 2013-8-14 19:42 | 显示全部楼层
楼上正解!
 楼主| 发表于 2013-8-14 20:29 | 显示全部楼层
狗狗百里游 发表于 2013-8-14 18:56
不规范的代码书写而已。

        for(j=0;j

规范的写法是怎么样的··我是照着视频来的 ·
发表于 2013-8-14 20:49 | 显示全部楼层
        for(j=0;j<20;j++)
          for(i=0;i<10000;i++){asm("nop")};

按照代码规范,循环后面一定要加{},表示有东西运行,{}里面放你需要运行的代码,你想做的是延时,asm("nop")表示一个时钟周期,其实这种nop延时也不规范。

另外, 循环后面不加{}就是不规范,比如    for(i=0;i<10000;i++)asm("nop");
 楼主| 发表于 2013-8-14 21:01 | 显示全部楼层
#include<avr/io.h>
void delay(void)
{
    unsigned int i,j;
    for(i=0;i<100;i++)
    {
       for(j=0;j<50000;j++)
       ;
    }
}

void main(void)
{
DDRB=0xff;
PORTB=0xff;
   while(1)
   {
   PORTB=0x00;
   delay();
   PORTB=0xff;
   delay();
   }
}
这个程序灯还是亮着的看不到闪· QQ图片20130814205922.jpg 还有晶振不是图哪里设的吗》?
发表于 2013-8-14 21:03 | 显示全部楼层
看下你的编译器int字长是几位的,如果是8位,for(I = 0; I < 10000; I++)是个死循环,改成unsigned long类型的。延时再长点

本版积分规则

QQ|一淘宝店|手机版|商店|电子DIY套件|一乐电子 ( 粤ICP备09076165号 ) 公安备案粤公网安备 44522102000183号

GMT+8, 2024-5-18 10:28 , Processed in 0.064369 second(s), 47 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表