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

2019-07-16 04:02发布

先说一下情况,我用单片机控制四个继电器,四个继电器控制四个电磁阀,四个电磁阀控制四个气缸。单片机和电磁阀(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;  //针型气缸收回

}


友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
10条回答
h414984185
2019-07-16 14:00
楼主是想每按一下开关一次程序运行一遍,然后停止是吧!要是这样的话这程序是实现不了的,因为main()函数就相当于while(1),里面的程序是一直不断的循环执行的,执行到最后一句后又从第一句开始执行,并不是执行到最后一句就停止。你可以在最后一句加一个while(1),(不过不太建议这样做);或者在最后加一句"  PCON=0x02;  ”把单片机设置成掉电模式,把单片机关掉,到复位时又重新唤醒它,这是89s51的方法,其它的单片机我不太清楚,你百度一下。方法还有很多,这两种只是对你这个程序作最少修改的方法。

一周热门 更多>