|
|
程序流程如下
開(kāi)機(jī)后延時(shí)2秒——然后步進(jìn)電機(jī)一直轉(zhuǎn)————按下按鍵1————步進(jìn)電機(jī)一直停止運(yùn)行 我現(xiàn)在是測(cè)試的時(shí)候 電機(jī)就一直運(yùn)行。按下的時(shí)候 雖然停止了 但是松開(kāi)按鍵 又開(kāi)始了 我設(shè)置了按下按鍵 讓一個(gè)變量++但是還是失敗了。 請(qǐng)大家?guī)兔纯催@個(gè)程序 指導(dǎo)下哪里出錯(cuò)了。提個(gè)建議謝謝
#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正時(shí)鐘旋轉(zhuǎn)相序表單雙八拍工作方式:A-AB-B-BC-C-CD-D-DA 停止運(yùn)行
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();
/*****************************************************************
延時(shí)函數(shù)
*****************************************************************/
void delay(uint z) //ms延時(shí)函數(shù)
{
uint i,j;
for(i=z;i>0;i--)
for(j=110;j>0;j--);
}
/*****************************************************************
28BYJ-48步進(jìn)電機(jī)加ULN2003驅(qū)動(dòng)步進(jìn)電機(jī)正轉(zhuǎn)
*****************************************************************/
void motor_ffw(unsigned int n) //步進(jìn)電機(jī)一周函數(shù)
{
unsigned char tmp; //定義2個(gè)臨時(shí)變量
unsigned int j;
for (j=0; j<8*64*n; j++) //運(yùn)行一周期
{
tmp=P0; //用 tmp 把 P0 口當(dāng)前值暫存
tmp = tmp & 0xF0; //用&操作清零低 4 位 高四位不影響
tmp = tmp | FFW[i];//用|操作把節(jié)拍代碼寫到低 4 位
P0 =tmp;
i++;
i=i&0x07;
delay(2);
beep=0;
}
}
void moto_off() //關(guān)步進(jìn)電機(jī)函數(shù)
{
unsigned char i,tmp; //定義2個(gè)臨時(shí)變量
tmp=P0; //用 tmp 把 P0 口當(dāng)前值暫存
tmp = tmp & 0xF0; //用&操作清零低 4 位 高四位不影響
tmp = tmp | FFW[9];//用|操作把節(jié)拍代碼寫到低 4 位
P0 =tmp;
// i=9;
beep=1;
}
/*****************************************************************
按鍵函數(shù)
*****************************************************************/
void keyscan() //按鍵函數(shù)
{
motor_ffw(1);
if(K1==0) //檢測(cè)K1=P1.0按鍵是否被按下,確定按下后步進(jìn)電機(jī)停止 延長(zhǎng)2秒P0.4一直持續(xù)低電平
{
delay(10);
if(K1==0)
{
LED6=1;
//delay(2000); //等待2秒
out1=0; //P0.4程序低電平
while(!K1); //等待按鍵釋放
}
}
if(K2==0) //檢測(cè)K2=P1.1按鍵是否被按下,確定按下P0.5保持0.5秒
{
delay(10);
if(K2==0)
{
// LED6=0; //P0.5變低電平
// beep=0;
delay(500); //保持0.5秒低電平
//LED6=1; // 然后變?yōu)楦唠娖?br />
//beep=1;
while(!K1); //等待按鍵釋放
}
}
if(K3==0) //檢測(cè)K3=P1.2按鍵是否被按下,確定按下P0.4變?yōu)楦唠娖?br />
{
delay(10);
if(K3==0)
{
// LED2=1;
// beep=1;
while(!K3); //等待按鍵釋放
}
}
if(K4==0) //檢測(cè)K4=P1.3按鍵是否被按下,確定按下步進(jìn)電機(jī)運(yùn)行10周后停止。
{
delay(10);
if(K4==0)
{
// LED6=0;
while(!K4); //等待按鍵釋放
}
}
if(K5==0) //檢測(cè)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();
}
}
}
}
/*****************************************************************
定時(shí)器
*****************************************************************/
void init() //定時(shí)器初始化
{
TMOD=0X01;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
EA=1;
ET0=1;
TR0=1;
}
void T0_time()interrupt 1 //中斷函數(shù)
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
num++;
if(num==20) //一秒時(shí)間到
{
num3++;
num1++;
num=0;
}
}
/*****************************************************************
延時(shí)2秒
*****************************************************************/
void delay2s()
{
if(num1>2)
num1=0;
}
/*****************************************************************
主函數(shù)
*****************************************************************/
void main()
{
init();
moto_off();
LED6=0;
while(1)
{
if(num1>=2) //開(kāi)機(jī)后等待2秒 定時(shí)器不清0;
{
motor_ffw(1);
keyscan();
}
}
}
|
|