|
程序流程如下
開機后延時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();
}
}
}
|
|