找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4363|回复: 11
收起左侧

51单片机两个开关控制多颗led,一个开关打开led灯逐个亮 另一开关打开后全灭

[复制链接]
ID:695357 发表于 2020-2-19 22:29 | 显示全部楼层 |阅读模式
1黑币
新人,黑币有限,见谅!

最近不能出门闲的发慌学习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();
        }
}

回复

使用道具 举报

ID:158375 发表于 2020-2-20 11:34 | 显示全部楼层
整个程序结构有问题.
回复

使用道具 举报

ID:445280 发表于 2020-2-20 12:03 | 显示全部楼层
你消抖后的if没有大括号吧
回复

使用道具 举报

ID:695047 发表于 2020-2-20 14:21 | 显示全部楼层
程序结构需要优化一下,例如:if(x1==0)最好写上{ led1=~led1;}
回复

使用道具 举报

ID:679425 发表于 2020-2-20 16:03 | 显示全部楼层
程序结构需优化
回复

使用道具 举报

ID:275826 发表于 2020-2-20 17:05 | 显示全部楼层
自锁型开关不需要去抖;while(!x)死循环了
回复

使用道具 举报

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

使用道具 举报

ID:695357 发表于 2020-2-20 21:55 | 显示全部楼层
。。jj 发表于 2020-2-20 19:17
楼主的延时函数的时间注释有问题,delay(1000)并不是一秒啊。关于程序的话,楼主的程序的思路并不正确, ...

先处于小白级,中断啥的还没整会呢 刚玩一段时间    N年前学的基本都还给师傅
回复

使用道具 举报

ID:462827 发表于 2020-2-20 22:02 | 显示全部楼层
最好是弄状态机,按键更改状态,led按状态来动作。
回复

使用道具 举报

ID:695357 发表于 2020-2-20 22:05 | 显示全部楼层
估计是在哪个循环没整对   各位建议下是把检测两个开关状态放在第一步还是最后一步一好  最好能建议一个结构思路  我想用循环执行来完成  用中断啥的一是能力不足  二是个人觉得这么简单的东西没必要搞那么复杂的程序
回复

使用道具 举报

ID:695357 发表于 2020-2-20 22:29 | 显示全部楼层
我的目的很简单   卧室灯晚上突然开灯眼睛一时难以接受  延时+1启动达到渐亮效果  用两个开关防止主开关故障备用的强制关   别说买现成灯   设定学习目的以达到学习、实用二合一
软件是我的软肋  硬件基本能搞
回复

使用道具 举报

ID:686985 发表于 2020-2-22 11:52 | 显示全部楼层
程序逻辑有问题,当你按键按下的时候(且一直保持按下),程序只会在 led1=~led1; while(!x1);这里一直循环,并不会执行后面的语句了。
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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