找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1931|回复: 20
收起左侧

51单片机功能实现 启动条件,不自锁开关1按下 灯1,2,3,4闪烁, 传感器1,2,3,4触发...

[复制链接]
ID:1050923 发表于 2022-11-9 21:04 | 显示全部楼层 |阅读模式
50黑币
启动条件,不自锁开关1按下
灯1,2,3,4闪烁,
传感器1,2,3,4触发,对应灯1,2,3,4长亮,未感应到的继续闪烁,
若4盏灯同时亮则结束程序等待下一次启动信号
在程序运行过程中只要自锁开关2按下程序全部停止,
自锁松开,开关1按下程序从头运行。
求大神给我一个大概的思路用什么方法去实现。下面是我的一部分其他的不知道怎么写了

#include<reg51.h>
sbit S1=P3^6;
sbit LED0=P1^0;
sbit LED1=P1^1;
sbit LED2=P1^2;
sbit LED3=P1^3;
void Delay(unsigned int t);
void main (void)
{



while (1)        
  {
    if(S1==1)
     {
      LED0=0;
          LED1=0;
          LED2=0;
          LED2=0;

      Delay(10000);     

      LED0=1;  
          LED1=1;
          LED2=1;
          LED3=1;         
      Delay(10000);
     }                 
  }
}

void Delay(unsigned int t)
{
while(--t);
}



最佳答案

查看完整内容

基于我的代码加几个中大括号就行了 自己想一下
回复

使用道具 举报

ID:161164 发表于 2022-11-9 21:04 | 显示全部楼层
小菜苗 发表于 2022-11-10 10:17
如果我是开关1按下,灯1闪烁,传感器1触发灯1常亮,灯1常亮以后灯2闪烁,传感器2触发灯2常亮,灯2常亮以 ...

基于我的代码加几个中大括号就行了
自己想一下
回复

使用道具 举报

ID:1050923 发表于 2022-11-9 22:22 | 显示全部楼层
大佬们可不可以用if ... else if ...else if...来实现呀
回复

使用道具 举报

ID:161164 发表于 2022-11-9 22:40 | 显示全部楼层
2022-11-09_223929.png

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

ID:195496 发表于 2022-11-10 09:59 | 显示全部楼层
这个方案应该采用一个定时器产生闪烁信号,按键由于只检测触发,所以不用采用按键延时方法处理。检测到按键后,产生一个标志,再判断标志去检测传感器,传感器信号置位一个标志,该标志与闪烁信号进行位运算产生最终位标志,驱动LED,当四路传感器标志全为1时,清除LED指示灯及传感器标志位,返回停止状态
回复

使用道具 举报

ID:1050923 发表于 2022-11-10 10:17 来自手机 | 显示全部楼层
lkc8210 发表于 2022-11-9 22:40

如果我是开关1按下,灯1闪烁,传感器1触发灯1常亮,灯1常亮以后灯2闪烁,传感器2触发灯2常亮,灯2常亮以后灯3闪烁,传感器3触发灯3常亮,灯3常亮以后灯4闪烁,传感器4触发灯4常亮。所有灯都常亮后停止运行等待下一次启动,开关2还是急停作用。这个应该用什么方法去实现呢
回复

使用道具 举报

ID:195496 发表于 2022-11-10 12:20 | 显示全部楼层
这个一样的,按照顺序控制进行,开关1触发后,写灯1标志位,允许灯1进入工作态,用闪烁信号与传感器触发信号来控制灯1,灯1常亮标志允许灯2进入工作态,依次类推,不是很难
回复

使用道具 举报

ID:77589 发表于 2022-11-10 13:48 | 显示全部楼层
说实话,你的需求都没有表述清楚!
还有,你程序初始化部分都没有。
回复

使用道具 举报

ID:1050923 发表于 2022-11-10 14:32 来自手机 | 显示全部楼层
大漠落日 发表于 2022-11-10 12:20
这个一样的,按照顺序控制进行,开关1触发后,写灯1标志位,允许灯1进入工作态,用闪烁信号与传感器触发信 ...

对于你们大佬来说简单,我们小白就难了呀,大佬能指导一下程序怎么改么
回复

使用道具 举报

ID:1051345 发表于 2022-11-10 14:53 | 显示全部楼层
这个方案可以使用一个定时器根据指置时间间隔来翻转四根引脚,产生四路闪烁信号,使用四个外部中断接入四个传感器触发信号,在外部中断程序里置对应引脚停止翻转标志,定时中断里根据停止翻转标志来停止翻转引脚,并置相应引脚高电平。当四个停止翻转标志都置位时,定时器停止运行,再次检测到启动信号,再开启定时器的运行。
回复

使用道具 举报

ID:1051345 发表于 2022-11-10 15:01 | 显示全部楼层
这个方案可以使用定时器,在定时中断程序里翻转四根IO引脚产生四路闪烁信号,使用外部中断接收四个传感器输入信号,在外部中断程序里对相应IO引脚是否翻转置失能标志,定时中断程序里检测到该标志则停止翻转相应IO引脚,并置高电平。当四个标志都置位时,停止定时器。当再检测到输入信号时,开启定时器。
回复

使用道具 举报

ID:1050923 发表于 2022-11-10 16:48 来自手机 | 显示全部楼层
Longan.Wang 发表于 2022-11-10 13:48
说实话,你的需求都没有表述清楚!
还有,你程序初始化部分都没有。

就是不晓得怎么去搞
回复

使用道具 举报

ID:1050923 发表于 2022-11-10 16:56 来自手机 | 显示全部楼层
Longan.Wang 发表于 2022-11-10 13:48
说实话,你的需求都没有表述清楚!
还有,你程序初始化部分都没有。

下面有要求更加全一些的,这是我自己想的,不是很全面,谢谢大哥提意见
回复

使用道具 举报

ID:1051382 发表于 2022-11-10 17:05 | 显示全部楼层
可以研究一下,谢谢楼主
回复

使用道具 举报

ID:1050923 发表于 2022-11-10 17:48 来自手机 | 显示全部楼层
小菜苗 发表于 2022-11-10 16:56
下面有要求更加全一些的,这是我自己想的,不是很全面,谢谢大哥提意见

就是这个逻辑
6E4A08DF-0972-45B5-B857-1F455A764746.jpeg
回复

使用道具 举报

ID:1050923 发表于 2022-11-10 20:31 | 显示全部楼层
lkc8210 发表于 2022-11-10 17:52
基于我的代码加几个中大括号就行了
自己想一下

之前的代码我感觉都不能实现功能
回复

使用道具 举报

ID:1050923 发表于 2022-11-10 21:07 | 显示全部楼层
小菜苗 发表于 2022-11-10 20:31
之前的代码我感觉都不能实现功能

大佬是我自己搞错了定义的端口啦,
回复

使用道具 举报

ID:1050923 发表于 2022-11-10 23:21 | 显示全部楼层
#include<reg51.h>
typedef   unsigned char  u8;
typedef   unsigned int  u16;
typedef   unsigned long  u32;
sbit S1=P3^6;
sbit S2=P3^7;


sbit Sensor1 = P2^0;
sbit Sensor2 = P2^1;
sbit Sensor3 = P2^2;
sbit Sensor4 = P2^3;


sbit LED1=P1^0;
sbit LED2=P1^1;
sbit LED3=P1^2;
sbit LED4=P1^3;



void Delay1ms()
   {
     unsigned char i,j;
         i=2;
         j=239;
         do
         {
            while(--j);
         }
         while(--i);
   }

void main(void)
{
      u16 DelayCnt = 0;
          bit Flash1 = 0,Flash2 = 0, Flash3 = 0,Flash4 = 0, Start = 0;

          while(1)
          {
            if(S1==0)
                  {
                    Start = 1;
                        Flash1 = 0;
                        Flash2 = 0;
                        Flash3 = 0;
                        Flash4 = 0;
                       
                  }
                if(S2==0)
                  {
                   Start = 0;
                   DelayCnt = 0;
                   Flash1 = 0;
                   Flash2 = 0;
                   Flash3 = 0;
                   Flash4 = 0;
                   LED1=1;
                   LED2=1;
                   LED3=1;
                   LED4=1;
                  
                  }
                 if(Sensor1==0)Flash1 = 1;
                 if(Sensor2==0)Flash2 = 1;
                 if(Sensor3==0)Flash3 = 1;
                 if(Sensor4==0)Flash4 = 1;       
                 

                 if(Start)
                 {
                     if(DelayCnt++>=1000)
                         {
                             DelayCnt = 0;
                                 if(Flash1==0)
                                    LED1=!LED1;
                                 else
                                    LED1=0;

                                 if(Flash1==1)
                                      {
                                          
                                      DelayCnt = 0;
                                          if(Flash2==0)
                                             LED2=!LED2;
                                          else
                                            LED2=0;
                                                                if(Flash2==1)
                                                    {
                                          
                                                   DelayCnt = 0;
                                                       if(Flash3==0)
                                                          LED3=!LED3;
                                                       else
                                                          LED3=0;
                                                                                      if(Flash3==1)
                                                                  {
                                          
                                                                DelayCnt = 0;
                                                                    if(Flash4==0)
                                                                       LED4=!LED4;
                                                                    else
                                                                       LED4=0;
                                                                                                   }
                                                                         }
                                          }
                                 
                               
                         }
                 
                 
                 }
                 
                Delay1ms();
          }






}感谢大佬们的不吝指导,虽有艰难但也完成,感谢
回复

使用道具 举报

ID:1050923 发表于 2022-11-11 12:06 来自手机 | 显示全部楼层
lkc8210 发表于 2022-11-9 22:40

哈喽,你可不可以帮我看一下,我的那个最后程序,现在传感器2.3.4触发,灯234也会亮,我的设计初衷是只有1亮了,2才能亮,12亮了3才能亮,123亮了4才能亮,指导一下呗
回复

使用道具 举报

ID:855733 发表于 2022-11-11 15:57 | 显示全部楼层
小菜苗 发表于 2022-11-11 12:06
哈喽,你可不可以帮我看一下,我的那个最后程序,现在传感器2.3.4触发,灯234也会亮,我的设计初衷是只有 ...

你把 if(Sensor2==0)Flash2 = 1; if(Sensor3==0)Flash3 = 1; if(Sensor4==0)Flash4 = 1;   一层一层套进去不就好了吗,只有1触发,灯1亮,1触发的前提下,2再触发灯2亮,
回复

使用道具 举报

ID:161164 发表于 2022-11-11 16:56 | 显示全部楼层
小菜苗 发表于 2022-11-11 12:06
哈喽,你可不可以帮我看一下,我的那个最后程序,现在传感器2.3.4触发,灯234也会亮,我的设计初衷是只有 ...
  1.                 if(Sensor1==0)Flash1 = 1;
  2.                 if(Flash1)if(Sensor2==0)Flash2 = 1;
  3.                 if(Flash2)if(Sensor3==0)Flash3 = 1;
  4.                 if(Flash3)if(Sensor4==0)Flash4 = 1;
复制代码
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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