找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1905|回复: 8
打印 上一主题 下一主题
收起左侧

单片机循环控制多个继电器 求助

[复制链接]
跳转到指定楼层
楼主
问题描述:key_a ,key_b, key_c 三个开关分别对应 A1 A2      B1 B2     C1 C2    6个继电器      


情景1  key_a打开,key_b&&key_c关断,A1通;  key_a先开  key_b或key_c开一个,A1通且 B2或C2通,此时若key_a关断,B1或C1通。                       情景2  key_b打开,key_a&&key_c关断,B1通;  key_b先开  key_a或key_c开一个,B1通且 A2或C2通,此时若key_b关断,A1或C1通。                       情景3  key_c打开, key_a&&key_b关断,C1通;  key_c先开  key_a或key_b开一个,C1通且 A2或B2通,此时若key_c关断,A1或B1通。  
情景4   key_a&&key_b&&key_c关断,   A1 && B1 && C1 通。  


在线等大神回复。  目前 A>B>C   顺序 开 没问题,但是 BA BC CA 开  就会和前面的  AB AC BC冲突  不按计划开启。                     
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:880534 发表于 2022-10-21 04:57 | 只看该作者
#include<reg51.h>



sbit key0=P3^2;
sbit key1=P3^3;
sbit key2=P3^4;

sbit ATIAN=P0^0;
sbit BTIAN=P0^1;
sbit CTIAN=P0^2;
sbit AJIA=P0^3;
sbit BJIA=P0^4;
sbit CJIA=P0^5;











void main()
{
        P0=0xff;
        P10=0;
        while(1)
        {
                if(P14==1)
                {
                 P0=0xff;
                }
                else P0=0xf8;
               
               
                                       

               
       
                       
                                if((key0==0)&&(key1==1)&&(key2==1))             //A主
                                        {          
                                                   ATIAN=0;BTIAN=1;CTIAN=1;
                                                        AJIA=1;BJIA=1;CJIA=1;
                                        }                       
                                       
                                       
                                        if((key0==0)&&(key1==0)&&(key2==1))                                //A机主 B机备
                                        {          
                                                   ATIAN=0;BTIAN=1;CTIAN=1;
                                                        AJIA=1;BJIA=0;CJIA=1;
                                        }                       
                                       
                                        if((key0==0)&&(key1==1)&&(key2==0))                                //A机主 C机备
                                        {          
                                                   ATIAN=0;BTIAN=1;CTIAN=1;
                                                        AJIA=1;BJIA=1;CJIA=0;
                                        }                       
                                       
                                        if((key0==1)&&(key1==0)&&(key2==1))                                //A机关机,B机主
                                        {          
                                                   ATIAN=1;BTIAN=0;CTIAN=1;
                                                        AJIA=1;BJIA=1;CJIA=1;
                                        }                       
                                       
                                        if((key0==1)&&(key1==1)&&(key2==0))                                //A机关机,C机主
                                        {          
                                                   ATIAN=1;BTIAN=1;CTIAN=0;
                                                        AJIA=1;BJIA=1;CJIA=1;
                                        }                       
                                       
                                        if((key0==1)&&(key1==0)&&(key2==1))                                //B机主
                                        {          
                                                   ATIAN=1;BTIAN=0;CTIAN=1;
                                                        AJIA=1;BJIA=1;CJIA=1;
                                        }                       
                                       
                                        if((key0==1)&&(key1==0)&&(key2==0))                                //B机主,C机备
                                        {          
                                                   ATIAN=1;BTIAN=0;CTIAN=1;
                                                        AJIA=1;BJIA=1;CJIA=0;
                                        }                       
                                       
                                        if((key0==1)&&(key1==1)&&(key2==0))                                //B机关机,C机主
                                        {          
                                                   ATIAN=1;BTIAN=1;CTIAN=0;
                                                        AJIA=1;BJIA=1;CJIA=1;
                                        }       

                                        if((key0==1)&&(key1==1)&&(key2==0))                                //C机主
                                        {          
                                                   ATIAN=1;BTIAN=1;CTIAN=0;
                                                        AJIA=1;BJIA=1;CJIA=1;
                                        }       
                                       
        }
}                                               
                                       
//        现确少         B先开 A开;
//                           B先关 A开;
//                           C先开 A开;
//                           C先关 A开;
//                           C先开 B开;
//                           C先关 B开;
                          
回复

使用道具 举报

板凳
ID:880534 发表于 2022-10-21 04:58 | 只看该作者
#include<reg51.h>

sbit key0=P3^2;
sbit key1=P3^3;
sbit key2=P3^4;

sbit ATIAN=P0^0;
sbit BTIAN=P0^1;
sbit CTIAN=P0^2;
sbit AJIA=P0^3;
sbit BJIA=P0^4;
sbit CJIA=P0^5;


void main()
{
        P0=0xff;
        P10=0;
        while(1)
        {
                if(P14==1)
                {
                 P0=0xff;
                }
                else P0=0xf8;
               
               
                                       

               
       
                       
                                if((key0==0)&&(key1==1)&&(key2==1))             //A主
                                        {          
                                                   ATIAN=0;BTIAN=1;CTIAN=1;
                                                        AJIA=1;BJIA=1;CJIA=1;
                                        }                       
                                       
                                       
                                        if((key0==0)&&(key1==0)&&(key2==1))                                //A机主 B机备
                                        {          
                                                   ATIAN=0;BTIAN=1;CTIAN=1;
                                                        AJIA=1;BJIA=0;CJIA=1;
                                        }                       
                                       
                                        if((key0==0)&&(key1==1)&&(key2==0))                                //A机主 C机备
                                        {          
                                                   ATIAN=0;BTIAN=1;CTIAN=1;
                                                        AJIA=1;BJIA=1;CJIA=0;
                                        }                       
                                       
                                        if((key0==1)&&(key1==0)&&(key2==1))                                //A机关机,B机主
                                        {          
                                                   ATIAN=1;BTIAN=0;CTIAN=1;
                                                        AJIA=1;BJIA=1;CJIA=1;
                                        }                       
                                       
                                        if((key0==1)&&(key1==1)&&(key2==0))                                //A机关机,C机主
                                        {          
                                                   ATIAN=1;BTIAN=1;CTIAN=0;
                                                        AJIA=1;BJIA=1;CJIA=1;
                                        }                       
                                       
                                        if((key0==1)&&(key1==0)&&(key2==1))                                //B机主
                                        {          
                                                   ATIAN=1;BTIAN=0;CTIAN=1;
                                                        AJIA=1;BJIA=1;CJIA=1;
                                        }                       
                                       
                                        if((key0==1)&&(key1==0)&&(key2==0))                                //B机主,C机备
                                        {          
                                                   ATIAN=1;BTIAN=0;CTIAN=1;
                                                        AJIA=1;BJIA=1;CJIA=0;
                                        }                       
                                       
                                        if((key0==1)&&(key1==1)&&(key2==0))                                //B机关机,C机主
                                        {          
                                                   ATIAN=1;BTIAN=1;CTIAN=0;
                                                        AJIA=1;BJIA=1;CJIA=1;
                                        }       

                                        if((key0==1)&&(key1==1)&&(key2==0))                                //C机主
                                        {          
                                                   ATIAN=1;BTIAN=1;CTIAN=0;
                                                        AJIA=1;BJIA=1;CJIA=1;
                                        }       
                                       
        }
}                                               
                                       
//        现确少     B先开 A开;
//                           B先关 A开;
//                           C先开 A开;
//                           C先关 A开;
//                           C先开 B开;
//                           C先关 B开;
                          
回复

使用道具 举报

地板
ID:880534 发表于 2022-10-21 07:30 | 只看该作者
#include<reg51.h>



sbit key0=P3^2;
sbit key1=P3^3;
sbit key2=P3^4;

sbit ATIAN=P0^0;
sbit BTIAN=P0^1;
sbit CTIAN=P0^2;
sbit AJIA=P0^3;
sbit BJIA=P0^4;
sbit CJIA=P0^5;


void main()
{
//        P0=0xff;    //开机继电器全关
//        P10=0;
        while(1)
        {
//                if(P14==1)
//                {
//                 P0=0xff;
//                }
//                else P0=0xf8;
               
                                        if((key0==0)&&(key1==1)&&(key2==1))             //A主                                        1111 1110
                                        {          
                                                   ATIAN=0;BTIAN=1;CTIAN=1;
                                                        AJIA=1;BJIA=1;CJIA=1;
                                        }                       
                                       
                                       
                                        if((key0==0)&&(key1==0)&&(key2==1))                                //A机主 B机备                        1111 1100
                                        {          
                                                   ATIAN=0;BTIAN=1;CTIAN=1;
                                                        AJIA=1;BJIA=0;CJIA=1;
                                        }                       
                                       
                                        if((key0==0)&&(key1==1)&&(key2==0))                                //A机主 C机备                        1111 1010
                                        {          
                                                   ATIAN=0;BTIAN=1;CTIAN=1;
                                                        AJIA=1;BJIA=1;CJIA=0;
                                        }                       
                                       
                                        if((key0==1)&&(key1==0)&&(key2==1))                                //A机关机,B机主        1111 1101
                                        {          
                                                   ATIAN=1;BTIAN=0;CTIAN=1;
                                                        AJIA=1;BJIA=1;CJIA=1;
                                        }                       
                                       
                                                if((key0==1)&&(key1==0)&&(key2==0))                    //B机主,C机备          1111 1001
                                        {          
                                                   ATIAN=1;BTIAN=0;CTIAN=1;
                                                        AJIA=1;BJIA=1;CJIA=0;
                                        }                       
                                       
                                        if((key0==1)&&(key1==1)&&(key2==0))                                //B机关机,C机主         1111 1011
                                        {          
                                                   ATIAN=1;BTIAN=1;CTIAN=0;
                                                        AJIA=1;BJIA=1;CJIA=1;
                                        }       
                                       
        }
}                                               
回复

使用道具 举报

5#
ID:415064 发表于 2022-10-21 08:32 | 只看该作者
把谁先通的要记录下来
回复

使用道具 举报

6#
ID:123289 发表于 2022-10-21 08:39 | 只看该作者
建议改行。
回复

使用道具 举报

7#
ID:161164 发表于 2022-10-21 09:26 | 只看该作者

回复

使用道具 举报

8#
ID:880534 发表于 2022-10-24 16:17 | 只看该作者
wojiaoguogai 发表于 2022-10-21 08:32
把谁先通的要记录下来

你给的这个逻辑合适,我进入误区  应该 把判断主备线路占用做判断,就好办多了。
回复

使用道具 举报

9#
ID:1007932 发表于 2022-10-24 23:18 | 只看该作者
可以用万能的状态机,把上一个/几个状态记录下来(取决于前几个状态能影响到下一个状态),再确定下一个状态,要不把所有状态和情况列出来,就很好写了。
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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