找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1436|回复: 6
收起左侧

利用开发板上的开关及可受单片机IO脚控制的发光二极管 求分析

[复制链接]
ID:728433 发表于 2020-9-22 22:56 | 显示全部楼层 |阅读模式
//项目:利用开发板上的开关及可受单片机IO脚控制的发光二极管,上电的时候,L1接在P1.0管脚上的发光二极管在闪烁,当每一次按下开关SP1的时候,L2接在P1.1管脚上的发光二极管在闪烁,再按下开关SP1的时候,L3接在P1.2管脚上的发光二极管在闪烁,再按下开关SP1的时候,L4接在P1.3管脚上的发光二极管在闪烁,再按下开关SP1的时候,又轮到L1在闪烁了,如此轮流下去。
//问题:如果删去第2,3,4个灯的代码,第一个灯就可以按下亮,但是加上后就全不亮了,也没有语法错误,我想知道我的问题出在哪里。
//我是一个初学者,还没有掌握这门技术,希望论坛的大哥们看到这么弱智的问题不要动怒,谢谢您们!!!!

单片机源程序如下:
#include<reg52.h>

sbit sp1=P3^0;
sbit sp2=P3^1;
sbit sp3=P3^2;
sbit sp4=P3^3;

void delay(int z)
{
int x,y;
for(x=z;x>0;x-- )
   for(y=114;y>0;y--) ;
}

void main()
{
if(sp1==0)
{
delay(10);
if(sp1==0)
{P1=0xfe;
delay(5);}
while(1);
}
         if(sp2==0)
{
delay(10);
if(sp2==0)
{P1=0xfd;
delay(5);}
while(1);
}
if(sp3==0)
{
delay(10);
if(sp3==0)
{P1=0xfb;
delay(5);}
while(1);
}
if(sp4==0)
{
delay(10);
if(sp4==0)
{P1=0xf7;
delay(5);}
while(1);
}


}


回复

使用道具 举报

ID:149144 发表于 2020-9-23 00:07 | 显示全部楼层
{P1=0xfe;
delay(5);}
这个时候他不会闪 ,如果共电源的,LED只会亮,然后延时 ,还是亮着,0xFE = 1111 1110
{
  P1 = 0xFE;
  delay(5);
  P1 = 0xFF;
  delay(5);
}
这样 LED 先亮 延时 再灭 再延时 看着就是 闪了 ;后面的都一样
回复

使用道具 举报

ID:332444 发表于 2020-9-23 12:56 | 显示全部楼层
while(1);修改while(sp1==0);
回复

使用道具 举报

ID:213173 发表于 2020-9-23 15:12 | 显示全部楼层
每按一次开关SP1,LED1~LED4轮流闪烁,以此反复。
  1. #include<reg52.h>

  2. sbit sp1=P3^0;
  3. //sbit sp2=P3^1;
  4. //sbit sp3=P3^2;
  5. //sbit sp4=P3^3;

  6. char i=0;
  7. int  j=0;

  8. void delay(int z)
  9. {
  10.         int x,y;
  11.         for(x=z;x>0;x-- )
  12.            for(y=114;y>0;y--) ;
  13. }

  14. void main()
  15. {
  16.         while(1)
  17.         {
  18.                 if(sp1==0)
  19.                 {
  20.                         delay(10);
  21.                         if(sp1==0)
  22.                         {
  23.                                 i++;
  24.                                 if(i>=4)
  25.                                         i=0;
  26.                         }
  27.                         while(!sp1);
  28.                 }
  29.                 j++;
  30.                 if(j>=20000)
  31.                         j=0;
  32.                 if(j<10000)
  33.                         P1=~(0x01<<i);
  34.                 else P1=0xff;
  35.         }
  36. }
复制代码
回复

使用道具 举报

ID:337139 发表于 2020-9-23 17:21 | 显示全部楼层
问题在while(1);上。多调试两次的。
回复

使用道具 举报

ID:728433 发表于 2020-9-23 21:51 | 显示全部楼层
xianfajushi 发表于 2020-9-23 12:56
while(1);修改while(sp1==0);

谢谢哦,改了之后就可以了,您能解释一下为啥吗?
回复

使用道具 举报

ID:332444 发表于 2020-9-24 09:49 | 显示全部楼层
while(1);是无限循环while(sp1==0);是等待按键释放
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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