标题: 菜鸟请教:STC89C55RD+单片机做流水灯效果无法点亮LED灯,问题出在哪里? [打印本页]

作者: 木示    时间: 2021-4-13 11:07
标题: 菜鸟请教:STC89C55RD+单片机做流水灯效果无法点亮LED灯,问题出在哪里?
各位,大神好。
                   本菜,利用普中学习板,想实现3个LED流水灯的效果,LED1不亮,LED2亮,LED3不亮------LED1亮,LED2不亮,LED3亮!如此循环,编译后,没有提示错误,但下载到学习板上,LED灯没有任何反应,测试对应的单片机管脚未见有电压输出!现在还不知晓问题出在哪里?向各位大神们请教!以下为代码:

#include <reg51.h>

void delay(unsigned int i);
sbit led1=P2^2;
sbit led2=P2^3;
sbit led3=P2^4;
main()
{
  unsigned char led1,led2,led3;
            
led1=  0xff  ;

  delay(600);

  led2=0x00 ;


  delay(600);

led3=0xff ;
        
         delay(600);
        
        led1=  0x00  ;
        
          delay(600);
        
        led2=0xff ;
        
          delay(600);
               
        led3=0x00 ;
        
          delay(600);
return 0;

}


void delay(unsigned int i)
{
    unsigned char j;
    for(i; i > 0; i--)   
        for(j = 255; j > 0; j--);
}



作者: 木示    时间: 2021-4-13 11:14
creating hex file from ".\Objects\LEDNO2"...
".\Objects\LEDNO2" - 0 Error(s), 0 Warning(s).
Build Time Elapsed:  00:00:02
作者: liu--2019    时间: 2021-4-13 11:36
sbit  位定义   是操作P2口   2/3/4、位的   赋值1和0 应该就能控制灯的状态   
作者: liu--2019    时间: 2021-4-13 11:41
本帖最后由 liu--2019 于 2021-4-13 14:12 编辑

#include <reg51.h>
        
void delay(unsigned int i);

sbit led1=P2^2;
sbit led2=P2^3;
sbit led3=P2^4;
void main()
{
     while(1)
     {
           led1=1;
           led2=led3=0;
           delay(600);
           led2=1;
           led1=led3=0;
           delay(600);
           led3=1;
           led1=led2=0;
           delay(600);       }  

}

void delay(unsigned int i)
{
    unsigned char j;
    for(i; i > 0; i--)   
        for(j = 255; j > 0; j--);
}

作者: 木示    时间: 2021-4-13 21:49
感谢指导,有一点没有想明白,用while语句的用意是什么?
作者: jfmdam    时间: 2021-4-13 22:23
while语句就是让单片机一直保持运行,想要单片机一直工作,就需要给它一个无限循环(C语言中叫死循环,一般不能出现,但单片机中必须要有)来让他保持工作,完成你的各种指。
作者: ANT1987    时间: 2021-4-14 08:45
你都说要如此循环了,为何程序里面却没有循环.
作者: teared    时间: 2021-4-14 11:45
#include <reg51.h>
        
void delay(unsigned int i);


void main()
{

sbit led1=P2^2;
sbit led2=P2^3;
sbit led3=P2^4;
     while(1)
     {
           led1=1;
           led2=led3=0;
           delay(600);
           led2=1;
           led1=led3=0;
           delay(600);
           led3=1;
           led1=led2=0;
           delay(600);       }  

}

void delay(unsigned int i)
{
    unsigned char j;
    for(i; i > 0; i--)   
        for(j = 255; j > 0; j--);
}
试试这个程序
作者: muzhi    时间: 2021-4-14 12:55
无操作系统时主程序里多是一个while(1)死循环在跑

Screenshot_20210414-125342_Chrome.jpg (244.16 KB, 下载次数: 66)

Screenshot_20210414-125342_Chrome.jpg

作者: 木示    时间: 2021-4-14 21:20
jfmdam 发表于 2021-4-13 22:23
while语句就是让单片机一直保持运行,想要单片机一直工作,就需要给它一个无限循环(C语言中叫死循环,一般 ...


作者: 木示    时间: 2021-4-14 21:21
muzhi 发表于 2021-4-14 12:55
无操作系统时主程序里多是一个while(1)死循环在跑

感谢指导
作者: 木示    时间: 2021-4-14 21:22
teared 发表于 2021-4-14 11:45
#include
        
void delay(unsigned int i);

这个程序是可以 的
作者: 木示    时间: 2021-4-14 21:33
感谢打大家的帮助,经过这两天学习,我发的程序里面有3出错误,虽然编译无误,但实际无法操作:1.sbit 的值域只有,0或1.所以LED=0XFF,是错误的,虽然语法没有错误。2.少了while语句。3.unsigned char led1,led2,led3;  事实上前面已经定义了LED的对应的管脚,就没有必要再定义了。经过修改上面3处错误后,可以点亮LED灯了,算是自己学习的总结吧。
     接下来,想把这三种效果,做成一个软件:开机----LED亮------断电5S内,再上电------LED闪烁-----断电5S内,再上电----LED流水效果,如此循环。如果断电>5S,则运行当前的程序。
  希望各位,大神不吝指导!谢谢




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1