标题: 51单片机两个开关控制多颗led,一个开关打开led灯逐个亮 另一开关打开后全灭 [打印本页]

作者: xcled    时间: 2020-2-19 22:29
标题: 51单片机两个开关控制多颗led,一个开关打开led灯逐个亮 另一开关打开后全灭
新人,黑币有限,见谅!

最近不能出门闲的发慌学习51单片机折腾些小玩意,望高手们多海涵

实现目标:两个开关(自锁型,类似电灯开关性质)控制多颗led灯,当开关1打开led每间隔2秒多亮一颗 ,亮起后不熄灭  直到 开关1关闭或打开2后熄灭   然后一直检测两个开关状态   检测到开关2关闭后从头开始执行


整好代码后仿真乱跑  有时不亮 有时像流水灯一样跑  多指教
暂时搞三颗led  顺畅后再加
代码如下
#include"reg52.h"
typedef unsigned char u8;
typedef unsigned int u16;
sbit x1=P1^2;
sbit x3=P1^4;
sbit led1=P2^0;
sbit led2=P2^1;
sbit led3=P2^2;

void delay(u16 i)
{
        while(i--);
}
void anjian1()
{
        if(x1==0)//判断按键是否被按下
        {
                delay(1000);//消抖,延时1秒
                if(x1==0)//消抖之后再次判断是否被按下

                led1=~led1;//led1开启,led灯默认高电'平
                 while(!x1);//判断是否断开

                delay(3000);//消抖,延时3秒
                if(x1|==0)//消抖之后再次判断是否被按下

                led2=~led2;//led2开启,led灯默认高电'平
                 while(!x1);//判断是否断开

                delay(5000);//消抖,延时5秒
                if(x1==0)//消抖之后再次判断是否被按下

                led3=~led3;//led3开启,led灯默认高电'平
                 while(!x1);//判断是否断开               
        }
}
void anjian2()
{
        if(x3==0)//判断消防开关是否被触发
        {
                delay(100);//消抖,延时10毫秒
                if(x3==0)//消抖之后再次判断消防开关是否被触发

                x1==1;//x1拉高,关闭所有led
                 while(!x3);//判断是否断开
        }
}
void main()
{
        while(1)
        {
                anjian1();
                anjian2();
        }
}


作者: 笨笨兔    时间: 2020-2-20 11:34
整个程序结构有问题.
作者: 17727219780    时间: 2020-2-20 12:03
你消抖后的if没有大括号吧
作者: taizi1988    时间: 2020-2-20 14:21
程序结构需要优化一下,例如:if(x1==0)最好写上{ led1=~led1;}
作者: haierzaifei11    时间: 2020-2-20 16:03
程序结构需优化
作者: tyrl800    时间: 2020-2-20 17:05
自锁型开关不需要去抖;while(!x)死循环了

作者: 。。jj    时间: 2020-2-20 19:17
楼主的延时函数的时间注释有问题,delay(1000)并不是一秒啊。关于程序的话,楼主的程序的思路并不正确,如果是想让开关1打开或者开关2闭合时全灭,可以在开关1程序后面修改,而不是在开关2的程序中让x1=1,开关2闭合全灭的话可以通过中断来实现。
作者: xcled    时间: 2020-2-20 21:55
。。jj 发表于 2020-2-20 19:17
楼主的延时函数的时间注释有问题,delay(1000)并不是一秒啊。关于程序的话,楼主的程序的思路并不正确, ...

先处于小白级,中断啥的还没整会呢 刚玩一段时间    N年前学的基本都还给师傅
作者: hantu    时间: 2020-2-20 22:02
最好是弄状态机,按键更改状态,led按状态来动作。
作者: xcled    时间: 2020-2-20 22:05
估计是在哪个循环没整对   各位建议下是把检测两个开关状态放在第一步还是最后一步一好  最好能建议一个结构思路  我想用循环执行来完成  用中断啥的一是能力不足  二是个人觉得这么简单的东西没必要搞那么复杂的程序
作者: xcled    时间: 2020-2-20 22:29
我的目的很简单   卧室灯晚上突然开灯眼睛一时难以接受  延时+1启动达到渐亮效果  用两个开关防止主开关故障备用的强制关   别说买现成灯   设定学习目的以达到学习、实用二合一
软件是我的软肋  硬件基本能搞
作者: LXZ1114    时间: 2020-2-22 11:52
程序逻辑有问题,当你按键按下的时候(且一直保持按下),程序只会在 led1=~led1; while(!x1);这里一直循环,并不会执行后面的语句了。




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