|
程序流程如下
开机后延时2秒——然后步进电机一直转————按下按键1————步进电机一直停止运行 我现在是测试的时候 电机就一直运行。按下的时候 虽然停止了 但是松开按键 又开始了 我设置了按下按键 让一个变量++但是还是失败了。 请大家帮忙看看这个程序 指导下哪里出错了。提个建议谢谢
#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
unsigned char code FFW[9]={ 0xE, 0xC, 0xD, 0x9, 0xB, 0x3, 0x7, 0x6,0x00};//28BYJ-48正时钟旋转相序表单双八拍工作方式:A-AB-B-BC-C-CD-D-DA 停止运行
char num,num1,num2,num3,num4,i,abb;
sbit out1=P3^4;
sbit out2=P3^5;
sbit out3=P3^6;
sbit LED=P3^7;
sbit LED1=P1^0;
sbit K1=P1^0;
sbit K2=P1^1;
sbit K3=P1^2;
sbit K4=P1^3;
sbit K5=P1^4;
sbit LED6=P1^5;
sbit beep=P2^3;
void init();
/*****************************************************************
延时函数
*****************************************************************/
void delay(uint z) //ms延时函数
{
uint i,j;
for(i=z;i>0;i--)
for(j=110;j>0;j--);
}
/*****************************************************************
28BYJ-48步进电机加ULN2003驱动步进电机正转
*****************************************************************/
void motor_ffw(unsigned int n) //步进电机一周函数
{
unsigned char tmp; //定义2个临时变量
unsigned int j;
for (j=0; j<8*64*n; j++) //运行一周期
{
tmp=P0; //用 tmp 把 P0 口当前值暂存
tmp = tmp & 0xF0; //用&操作清零低 4 位 高四位不影响
tmp = tmp | FFW[i];//用|操作把节拍代码写到低 4 位
P0 =tmp;
i++;
i=i&0x07;
delay(2);
beep=0;
}
}
void moto_off() //关步进电机函数
{
unsigned char i,tmp; //定义2个临时变量
tmp=P0; //用 tmp 把 P0 口当前值暂存
tmp = tmp & 0xF0; //用&操作清零低 4 位 高四位不影响
tmp = tmp | FFW[9];//用|操作把节拍代码写到低 4 位
P0 =tmp;
// i=9;
beep=1;
}
/*****************************************************************
按键函数
*****************************************************************/
void keyscan() //按键函数
{
motor_ffw(1);
if(K1==0) //检测K1=P1.0按键是否被按下,确定按下后步进电机停止 延长2秒P0.4一直持续低电平
{
delay(10);
if(K1==0)
{
LED6=1;
//delay(2000); //等待2秒
out1=0; //P0.4程序低电平
while(!K1); //等待按键释放
}
}
if(K2==0) //检测K2=P1.1按键是否被按下,确定按下P0.5保持0.5秒
{
delay(10);
if(K2==0)
{
// LED6=0; //P0.5变低电平
// beep=0;
delay(500); //保持0.5秒低电平
//LED6=1; // 然后变为高电平
//beep=1;
while(!K1); //等待按键释放
}
}
if(K3==0) //检测K3=P1.2按键是否被按下,确定按下P0.4变为高电平
{
delay(10);
if(K3==0)
{
// LED2=1;
// beep=1;
while(!K3); //等待按键释放
}
}
if(K4==0) //检测K4=P1.3按键是否被按下,确定按下步进电机运行10周后停止。
{
delay(10);
if(K4==0)
{
// LED6=0;
while(!K4); //等待按键释放
}
}
if(K5==0) //检测K5=P1.4按键是否被按下,如果按下P0.6=L 保持1秒 P0.7一直保持低电平
{
delay(10);
if(K5==0)
{
// LED6=0; //如果按下P0.6=L 保持1秒
//LED7=0; //如果按下 P0.7一直保持低电平
delay(1000);
// LED6=1;
while(!K5) //等待按键释放
{
delay(2000);
zihanshu();
}
}
}
}
/*****************************************************************
定时器
*****************************************************************/
void init() //定时器初始化
{
TMOD=0X01;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
EA=1;
ET0=1;
TR0=1;
}
void T0_time()interrupt 1 //中断函数
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
num++;
if(num==20) //一秒时间到
{
num3++;
num1++;
num=0;
}
}
/*****************************************************************
延时2秒
*****************************************************************/
void delay2s()
{
if(num1>2)
num1=0;
}
/*****************************************************************
主函数
*****************************************************************/
void main()
{
init();
moto_off();
LED6=0;
while(1)
{
if(num1>=2) //开机后等待2秒 定时器不清0;
{
motor_ffw(1);
keyscan();
}
}
}
|
|