这个小程序哪里有问题吗
时间:10-02
整理:3721RD
点击:
程序如下,不大,但是就是调试不好,帮忙看下,谢谢
//控制程序,控制时序说明:按下电源键,系统供电,按下供膜,夹持电磁铁得电,延时500ms后电机启动,膜送至指定位置
//后传感器1发出信号,固定电磁铁吸合,电机自锁,夹持松开,500ms延时后电机反转,反转回指定位置时传感器2发出信号,
//电机停转,蜂鸣器提示待装入微孔板;微孔板装入后按下热封键,热封机启动热封,定时6s后固定电磁铁失电松开,热封结束
//后取出微孔板,此为一个工作循环。
#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
sbit supply= P3^7;
sbit sealer= P3^6;
sbit power= P3^5;
sbit in1= P0^0;
sbit in2= P0^1;
sbit in3= P0^2;
sbit in4= P0^3;
sbit jiachi= P1^4;
sbit guding= P2^7;
sbit refeng= P2^6;
sbit chuangan1= P3^3;
sbit chuangan2= P3^2;
sbit buzzer= P1^5;
uchar code zz[]={0x03,0x06,0x0C,0x09}; //步进电机正转
uchar code fz[]={0x09,0x0A,0x06,0x03}; //步进电机反转
void delay(uint ms) //毫秒延时函数
{
uint t;
while(ms--)
for(t=0;t<120;t++);
}
void motor_zz() //步进电机正转
{
while(1)
{
uint i;
for(i=0;i<4;i++)
{
P0=zz[i];
delay(5);
}
}
}
void motor_fz() //步进电机反转
{
while(1)
{
uint j;
for(j=0;j<4;j++)
{
P0=fz[j];
delay(5);
}
}
}
void main()
{
while(1) //工作循环
{
supply=1; //清零操作
sealer=1;
power= 1;
jiachi= 1;
buzzer= 1;
guding=1;
chuangan1= 1;
chuangan2=1;
refeng= 1;
if(supply==0) //供膜检查
delay(10); //按键防抖
if(supply==0)
{
jiachi=0;
delay(20);
while(chuangan1==1)
{
motor_zz();
if(chuangan1==0)
break;
}
guding=0;
delay(20);
jiachi=1;
while(chuangan2==1)
{
motor_fz();
if(chuangan2==0)
break;
}
buzzer=0;
delay(20);
buzzer=1;
}
if(sealer==0) //热封检查
delay(20);
if(sealer==0)
{
refeng=0;
}
}
}
//控制程序,控制时序说明:按下电源键,系统供电,按下供膜,夹持电磁铁得电,延时500ms后电机启动,膜送至指定位置
//后传感器1发出信号,固定电磁铁吸合,电机自锁,夹持松开,500ms延时后电机反转,反转回指定位置时传感器2发出信号,
//电机停转,蜂鸣器提示待装入微孔板;微孔板装入后按下热封键,热封机启动热封,定时6s后固定电磁铁失电松开,热封结束
//后取出微孔板,此为一个工作循环。
#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
sbit supply= P3^7;
sbit sealer= P3^6;
sbit power= P3^5;
sbit in1= P0^0;
sbit in2= P0^1;
sbit in3= P0^2;
sbit in4= P0^3;
sbit jiachi= P1^4;
sbit guding= P2^7;
sbit refeng= P2^6;
sbit chuangan1= P3^3;
sbit chuangan2= P3^2;
sbit buzzer= P1^5;
uchar code zz[]={0x03,0x06,0x0C,0x09}; //步进电机正转
uchar code fz[]={0x09,0x0A,0x06,0x03}; //步进电机反转
void delay(uint ms) //毫秒延时函数
{
uint t;
while(ms--)
for(t=0;t<120;t++);
}
void motor_zz() //步进电机正转
{
while(1)
{
uint i;
for(i=0;i<4;i++)
{
P0=zz[i];
delay(5);
}
}
}
void motor_fz() //步进电机反转
{
while(1)
{
uint j;
for(j=0;j<4;j++)
{
P0=fz[j];
delay(5);
}
}
}
void main()
{
while(1) //工作循环
{
supply=1; //清零操作
sealer=1;
power= 1;
jiachi= 1;
buzzer= 1;
guding=1;
chuangan1= 1;
chuangan2=1;
refeng= 1;
if(supply==0) //供膜检查
delay(10); //按键防抖
if(supply==0)
{
jiachi=0;
delay(20);
while(chuangan1==1)
{
motor_zz();
if(chuangan1==0)
break;
}
guding=0;
delay(20);
jiachi=1;
while(chuangan2==1)
{
motor_fz();
if(chuangan2==0)
break;
}
buzzer=0;
delay(20);
buzzer=1;
}
if(sealer==0) //热封检查
delay(20);
if(sealer==0)
{
refeng=0;
}
}
}
加油
加油
你的程序缺少电机停转的控制,当传送到位后应该有停止电机转动的控制。
另外,电机的两个方向转动的程序,都是用的while(1)的无限死循环方式,循环中间也没有判断电机何时该停止的判断,最终应该是电机只会朝一个方向不停的转动。
在程序里,非必要情况下,应该尽量少用while(1)这类无限循环的方式,即使要用,循环体内也应该有如何退出循环的判断,来退出循环。
正如楼上所说,你在电机转动的过程中,使用的是while(1)这种方式写的,不过最好在里面加一个超时机制,这样增加程序的稳定性,另外,你的流程里每一步对电机都有控制,而你程序里,?类似?if(chuangan1==0)之后,并没有对电机进行操作,这边首先就不对了,先把这部分改了,后续再调
统一回复了,哈哈,已调试成功,谢谢