微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 程序运行中有误动作,错在哪?

程序运行中有误动作,错在哪?

时间:10-02 整理:3721RD 点击:
先说一下情况,我用单片机控制四个继电器,四个继电器控制四个电磁阀,四个电磁阀控制四个气缸。单片机和电磁阀(5V,四个在一块PCB板上)是分开的2块PCB板。各用5V电源单独供电。单片机板和继电器板用引线把连个地线连在一起。
程序是控制四个气缸按照一系列动作运行,这一系列动作完成后会停下来。我用一个脚踏开关连接在单片机的复位按钮上。踩一下脚踏开关,相当于单片机复位,然会程序在运行一边后停下来。需要动作运行时,只要踩一下脚踏开关,单片机复位就行了。所以程序中没有使用while循环。但是程序在运行中出现误动作,就是程序运行一边后,在没有给单片机复位的情况下,又自动开始运行了。自动运行几遍后又恢复正常,正常运行一段时间后又会出现自动运行现象,然后又恢复正常。程序如下:
请各位高手指点,错误在什么地方。搞了一周没搞好。
#include<reg52.h>  
#define uint unsigned int
#define uchar unsigned char
sbit P20=P2^0;
sbit P21=P2^1;
sbit P22=P2^2;
sbit P23=P2^3;
//1s延时程序(12MHZ)
void delay1s(void)
{
uchar h,i,j,k;
for(h=5;h>0;h--)
for(i=4;i>0;i--)
for(j=116;j>0;j--)
for(k=214;k>0;k--);
}
void main()
{
uchar y;
P20=0; //针型气缸压下
P21=0; //针型气缸压下
delay1s();
P22=0;  //微型气缸推出,
delay1s();
P23=0;  //长型气缸推出
delay1s();
P22=1;  //微型气缸收回,
delay1s();
//延时函数,延时30秒
for(y=30;y>0;y--)
{
  delay1s();
}
P22=0;  //微型气缸推出,
delay1s();
P23=1;  //长型气缸收回
delay1s();
P22=1;  //微型气缸收回,
delay1s();
P20=1;  //针型气缸收回
P21=1;  //针型气缸收回

}

程序很简单,但是你的逻辑关系我看的有点晕,很有可能是你的硬件问题

程序是很简单,就是控制四个气缸的推出和收回动作。

逻辑很重要。

程序看不懂    你自己乱了吧

继电器接成“启保停”的吧?
//延时函数,延时30秒
for(y=30;y>0;y--)
{
  delay1s();
}
P22=0;  //微型气缸推出,
P22 这个气缸没回吧?

小编是想每按一下开关一次程序运行一遍,然后停止是吧!要是这样的话这程序是实现不了的,因为main()函数就相当于while(1),里面的程序是一直不断的循环执行的,执行到最后一句后又从第一句开始执行,并不是执行到最后一句就停止。你可以在最后一句加一个while(1),(不过不太建议这样做);或者在最后加一句"  PCON=0x02;  ”把单片机设置成掉电模式,把单片机关掉,到复位时又重新唤醒它,这是89s51的方法,其它的单片机我不太清楚,你百度一下。方法还有很多,这两种只是对你这个程序作最少修改的方法。

加个主循环,只有复位才运行也要个循环,不然程序就跑飞了

气缸收回了,气缸一系列动作没有问题。就是会自动进行下一次动作,我的原意是踩一下脚踏开关后才进行下一次动作。

谢谢各位帮助,下周一我上班后,试试各位的建议,希望能解决掉。这么一个简单的程序,我搞了一周。

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top