打印

程序错误?

[复制链接]
1218|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
wwx024|  楼主 | 2012-11-3 15:05 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
先说一下情况,我用单片机控制四个继电器,四个继电器控制四个电磁阀,四个电磁阀控制四个气缸。单片机和电磁阀(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;  //针型气缸收回

}

相关帖子

沙发
阿南| | 2012-11-3 16:09 | 只看该作者
楼主不能这样设计,不能靠复位来重新下个动作。里面不有没有While,如果没有While,那么程序一直往下走会出现一个不确定的状态,不仅IO的状态不确定,什么事情都有可能发生,就像一辆车一直往前开一样,不知道会撞上什么。

使用特权

评论回复
板凳
gozzz| | 2012-11-3 16:12 | 只看该作者
楼上想一下,单片机运行完你那一堆代码后,单片机接下来该怎么办???
编译的警告注意看一下

使用特权

评论回复
地板
wwx024|  楼主 | 2012-11-3 17:19 | 只看该作者
原来在程序后面有while(1)空循环。程序运行也不稳定,后来就删掉了。是不是要加上?

使用特权

评论回复
5
dqyubsh| | 2012-11-3 18:06 | 只看该作者
加上是必须的,至少可以约束程序的运行行为,不至于一路狂奔,不顾死活。你把脚踏开关那做成一个输入条件,或者做个按钮替代,实现起来也不难。

程序不稳定,就查不稳定的原因,而不是委曲求全,退避三舍,这样退下去,一定没结果的。

使用特权

评论回复
6
hjs1618| | 2012-11-4 12:34 | 只看该作者
做一个按键(含消抖),在弹起时做一个标志,这个标志来做为运行的条件。如果没有这个标志,就一直查询。很少有用复位来做为动作条件,复位一般不是这个作用

使用特权

评论回复
7
原野之狼| | 2012-11-4 13:55 | 只看该作者
1  没有循环肯定是不对的
2  用复位来作触发也是不对的  外接一个开关作为触发信号
3  从其它思路再找找问题

使用特权

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

本版积分规则

1

主题

3

帖子

1

粉丝