打印
[STC单片机]

sct89c52用4个接近开关控制4路继电器发生了奇怪的问题。。。

[复制链接]
9143|40
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
  我新来的所以没分给大家望大家见谅,情况大致是这样的我想用接近开关来控制继电器   的我先给大家上图好理解我的意图!!

上面的是没有接线的图,下面为大家上传接好线路的图!


继电器模块是买的 是关电耦合的,我问卖家需不需要加uln2003卖家说不需 已经加三极管放大了的!所以继电器基本是没用问题的!

模块参数:
1.尺寸:75mm(长)*55mm(宽)*19.3mm(高)
2.体重:61g
3.PCB颜色:蓝色
4.板子四周带4个固定螺丝孔,孔直径3.1mm,方便安装及固定
5.继电器选用优质松乐继电器,单刀双掷。一个公共端、一个常开端、一个常闭端
6.光耦隔离,抗干扰性好

7.低电平吸合,高电平释放。吸合时状态指示灯亮,释放时状态指示灯灭
8.VCC为系统电源,JD_VCC为继电器电源。默认发5V继电器,插上跳线帽即可
9.继电器最大输出:直流30V/10A,交流250V/10A
接线说明:
VCC:系统电源正极
GND:系统电源负极
IN1--IN4:继电器控制端口
发货清单:
4路带光耦继电器模块一个(防静电包装)



接近开关型号是npn常开型 三根线的 兰的负极 棕色的正极 黑色的是信号线(是接io口的),买的时候都在店家一个一个的试过拉的!都是好的!所以也可以排除接近开关的故障!
【产品名称】:电感式接近开关
【型号】:LJ12A3-4-Z/BX
【工作电压】:直流6-36V 范围内通用
【输出形式】:三线 NPN 常开
【检测物体】:金属物体
【检测距离】:4毫米
【输出电流】:300毫安
【工作温度】:-20—50℃
【外形尺寸】:直径12毫米
【线长】:约110厘米
【品牌】:沪工


现在上程序
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit lj1=P3^0;    //接近开关1
sbit lj2=P3^1;    //接近开关2   
sbit lj3=P3^2;    //接近开关3
sbit lj4=P3^3;    //接近开关4     
sbit relay1=P2^1;   //继电器1
sbit relay2=P2^2;   //继电器2
sbit relay3=P2^3;   //继电器3      
sbit relay4=P2^4;   //继电器4
void delay ( uchar x)     //延时函数
{
uint y;
for (; x > 0 ; x--  )
  for( y=500 ;y>0;y--);
}   
   
void main()    //主函数
{
P3=0xff;  //让P1口全部为1 全部为真
relay1=1;  //继电器1和继电器4都得同时为1断开
relay4=1;
delay(100);  //延时函数
relay2=0;  //继电器2和3都为0闭合 默认 继电器2和3 闭合控制的灯也是亮的
relay3=0;  //
        
if(lj1==0)   //如果接近开关1触发了为0那么继电器2就断开
    {
  relay2 = 1;    //  当接近开关被触发 那么 reLay2 就断开,灯灭               
  
  if(lj4==0)   //如果接近开关4触发了为0那么继电器3就断开
   {
    relay3 = 1;     
               
    if(lj1==0 && lj4==0)   //如果接近开关1和接近开关4同时为0
     {
            
      relay4 = 0;     //当继电器2和3都断开时  继电器4吸合
     }                           
   }        
}

if(lj2==0)
{
  relay1=1;
  relay4=0;
  delay(100);
  relay2=0;
}
while(1)     //循环程序   循环直至按下复位或者断电
{           
  if(lj1==0)
   {
      relay2=1;
   }
     if(lj3==0)
   {
   relay4=1;
   relay1=0;
   delay(100);
   relay3=0;
   }  
  if(lj4==0)
   {
   relay3=1;
   }
       if(lj2==0)
   {   
   relay4=0;
   relay1=1;
   delay(100);
   relay2=0;
   }
  
    }      
}      
   
程序就是这样的现在的问题是这样语句执行了但是继电器4不吸合灯不亮。
    if(lj1==0 && lj4==0)   //如果接近开关1和接近开关4同时为0
     {      
      relay4 = 0;     //  继电器4吸合
     }
问题就在这里 当接近开关1和接近开关4同时为0时继电器relay4 = 0; 它怎么都不吸合!接近开关的指示灯都是亮信号还是给了单片机的看就是不吸合。当程序接着往下走时一直都很稳定继电器都吸合的很好!
整个程序就是   
if(lj1==0 && lj4==0)   //如果接近开关1和接近开关4同时为0
     {      
      relay4 = 0;     //  继电器4吸合
     }
这个继电器4,relay4 = 0;不吸合!
程序一开始继电器2和继电器3都正常吸合,触发接近开关lj1继电器2 relay2= 1;断开
                    触发接近开关lj4继电器2 relay3= 1;断开
然后程序执行到
if(lj1==0 && lj4==0)   //如果接近开关1和接近开关4同时为0
     {      
      relay4 = 0;     //  继电器4吸合
     }
这里同时触发接近开关1和接近开关4,继电器4就是不吸合。

接着程序往下一直到while循环都是好的都是正常触发正常吸合!

现在面临这样的问题我已经是无解了办法也试了很多很多能想的办法都想了都试了可都还是不行!现在就是希望大家帮我分析分析感激不尽到底是怎么了。


搜狗截图13年08月06日1032_1.png (952.5 KB )

搜狗截图13年08月06日1032_1.png

Camera_20130801_103256.jpg (452.75 KB )

Camera_20130801_103256.jpg

Camera_20130806_101202.jpg (553.39 KB )

Camera_20130806_101202.jpg

Camera_20130806_101038.jpg (567.25 KB )

Camera_20130806_101038.jpg

相关帖子

沙发
6825681|  楼主 | 2013-8-6 11:58 | 只看该作者
在线等待!!!急急急

使用特权

评论回复
板凳
ningling_21| | 2013-8-6 12:52 | 只看该作者
先确定硬件后软件,继电器能不能被驱动,继电器不吸和说明驱动电路有问题.

使用特权

评论回复
地板
6825681|  楼主 | 2013-8-6 12:57 | 只看该作者
ningling_21 发表于 2013-8-6 12:52
先确定硬件后软件,继电器能不能被驱动,继电器不吸和说明驱动电路有问题. ...

单独运行
if(lj1==0 && lj4==0)   //如果接近开关1和接近开关4同时为0
     {      
      relay4 = 0;     //  继电器4吸合
     }
这个if又是可以吸合的!!!

使用特权

评论回复
5
rambler| | 2013-8-6 13:01 | 只看该作者
会不会和运算逻辑有关系? 加多几个括号  if((lj1==0) &&( lj4==0) )

另外还可以关闭编译器的优化试一下

使用特权

评论回复
6
6825681|  楼主 | 2013-8-6 13:45 | 只看该作者
rambler 发表于 2013-8-6 13:01
会不会和运算逻辑有关系? 加多几个括号  if((lj1==0) &&( lj4==0) )

另外还可以关闭编译器的优化试一下 ...

安装你的方法试了下,
        if(lj1==0)                        //如果接近开关1触发了为0那么继电器2就断开
           {
                relay2 = 1;                  //  当接近开关被触发 那么 reLay2 就断开,灯灭                                                 
               
                if(lj4==0)                        //如果接近开关4触发了为0那么继电器3就断开
                        {
                                relay3 = 1;                          
                                                                                           
                                if((lj1==0) &&( lj4==0) )                          //如果接近开关1和接近开关4同时为0
               
                                        {       
                                                                                  
                                                relay4 = 0;                   //当继电器2和3都断开时  继电器4吸合
                                        }
                                                                                                                                          
                        }                                                 
        }
       
        if(lj2==0)
        {
                relay1=1;
                relay4=0;
                delay(100);
                relay2=0;
        }

我先触发接近开关lj1程序执行到lj1==0时继电器2断开后!当我一触碰接近开关lj4的时候直接跳到了lj2==0,结果是没用执行lj4==0和if((lj1==0) &&( lj4==0) ),

使用特权

评论回复
7
rambler| | 2013-8-6 13:57 | 只看该作者
6825681 发表于 2013-8-6 13:45
安装你的方法试了下,
        if(lj1==0)                        //如果接近开关1触发了为0那么继电器2就断开
           {

你是单步跟踪看到的程序执行吧? 如果是的话就是程序优化的结果.   f((lj1==0) &&( lj4==0) )    这句话好像是纯粹多余了吧,前面都已经判断过了...

使用特权

评论回复
8
6825681|  楼主 | 2013-8-6 14:05 | 只看该作者
本帖最后由 6825681 于 2013-8-6 14:15 编辑
rambler 发表于 2013-8-6 13:57
你是单步跟踪看到的程序执行吧? 如果是的话就是程序优化的结果.   f((lj1==0) &&( lj4==0) )    这句话好 ...


我调试发现可能是你说的优化问题!!程序直接跳到lj2==0,根本没用执行f((lj1==0) &&( lj4==0) )  这个!!如何去掉优化啊???大师真的很谢谢你让我感觉有了点头绪

使用特权

评论回复
9
6825681|  楼主 | 2013-8-6 14:24 | 只看该作者
rambler 发表于 2013-8-6 13:57
你是单步跟踪看到的程序执行吧? 如果是的话就是程序优化的结果.   f((lj1==0) &&( lj4==0) )    这句话好 ...

我把有话都设置为0啦,,还是直接跳到lj2==0

使用特权

评论回复
10
qzc13457| | 2013-8-6 14:41 | 只看该作者
找两根线,和万用表,一部分的排除吧

使用特权

评论回复
11
6825681|  楼主 | 2013-8-6 14:58 | 只看该作者
把优化都设置为0啦可还是不执行f((lj1==0) &&( lj4==0) )    这句话好

使用特权

评论回复
12
rambler| | 2013-8-6 17:49 | 只看该作者
6825681 发表于 2013-8-6 14:58
把优化都设置为0啦可还是不执行f((lj1==0) &&( lj4==0) )    这句话好

你这句话本来就是多余的吧,前面都判断过了,这句话根本就不需要执行了

使用特权

评论回复
13
6825681|  楼主 | 2013-8-6 18:00 | 只看该作者
rambler 发表于 2013-8-6 17:49
你这句话本来就是多余的吧,前面都判断过了,这句话根本就不需要执行了

其实多也是不多于的,我设计的东西必须有这一句,我想问问还有什么语句可以替代这句的吗??  if((lj1==0) &&( lj4==0) )

使用特权

评论回复
14
jiayou0054| | 2013-8-6 18:31 | 只看该作者
电感式接近开关,中间用金属连接,可以吗?问问啊

使用特权

评论回复
15
6825681|  楼主 | 2013-8-6 19:11 | 只看该作者
jiayou0054 发表于 2013-8-6 18:31
电感式接近开关,中间用金属连接,可以吗?问问啊

好像没用影响哦!!!

使用特权

评论回复
16
qqcaiyin| | 2013-8-7 08:34 | 只看该作者
本帖最后由 qqcaiyin 于 2013-8-7 08:36 编辑
6825681 发表于 2013-8-6 12:57
单独运行
if(lj1==0 && lj4==0)   //如果接近开关1和接近开关4同时为0
     {      

你说的这个单独运行是什么意思?
假如去掉下面这句
if(lj1==0 && lj4==0)   //如果接近开关1和接近开关4同时为0

结果怎么样呢?

使用特权

评论回复
17
sdwys| | 2013-8-7 09:10 | 只看该作者
先确认硬件的正常,可靠。剩下的只是调程序的问题。看你这东西相当简单,先编点小程序测试硬件。

使用特权

评论回复
18
这个名字2| | 2013-8-7 09:16 | 只看该作者
   if(lj1==0)                        //如果接近开关1触发了为0那么继电器2就断开
           {
                relay2 = 1;                  //  当接近开关被触发 那么 reLay2 就断开,灯灭                                                  
                while(lj4 != 0);        //加这句看看触发lj4时能不能向下执行,要是执行不下去就是lj4没有真的被触发
                if(lj4==0)                        //如果接近开关4触发了为0那么继电器3就断开
                        {
                                relay3 = 1;                          
                                                                                            
                                if((lj1==0) &&( lj4==0) )                          //如果接近开关1和接近开关4同时为0
               
                                        {        
                                                                                 
                                                relay4 = 0;                   //当继电器2和3都断开时  继电器4吸合
                                        }
                                                                                                                                          
                        }                                                  
        }
        
        if(lj2==0)
        {
                relay1=1;
                relay4=0;
                delay(100);
                relay2=0;
        }

使用特权

评论回复
19
通宵敲代码| | 2013-8-7 09:57 | 只看该作者
提问要简明扼要,这么麻烦的问题,真心不想看。

先硬件后软件,一部分一部分的排查,电路很简单,估计是你有什么地方忽略了,好好查查,问题应该不大。

使用特权

评论回复
20
luodongming| | 2013-8-7 10:59 | 只看该作者
我觉得你的接近开关的程序不对····我原来用的接近开关输出的是模拟量,不知道你的是不是?如果是你还得转换信号··用增强型125a60s2就可以

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

43

帖子

0

粉丝