這個是用89C52單片機做的一個驅動步進電機和LED發光管的程序 在用電位器調節AD取值電壓的時候 LED獲取的信號是正常的 步進電機為什么一直轉啊轉的 我用P1口的值在做比較 if語句不滿足條件 應該沒有脈沖信號給步進電機呀 為什么還是循環在轉,請高手幫我解答下吧。
#include<reg51.h>
#include <intrins.h>
#define uint unsigned int
#define uchar unsigned char
sbit adrd=P3^7; //IO口定義
sbit adwr=P3^6;
sbit diola=P2^5;
sbit dula=P2^6;
sbit wela=P2^7;
uchar j,k,adval;
uint num,num1,i;
uchar code F_Rotation[4]={0x20,0x10,0x08,0x04};
void delay(unsigned char i) //延時程序
{
for(j=i;j>0;j--)
for(k=125;k>0;k--);
}
void main() // 主程序
{
while(1)
{
P1=0xff; //首先給P1口一個值
num=P1; //把這個P1口的值賦給num變量作為比較
delay(10);
wela=1;
P0=0; //選通ADCS
adwr=0; //AD寫入(隨便寫個什么都行,主要是為了啟動AD轉換)
_nop_();
adwr=1;
P0=0xff; //關閉ADCS
delay(10);
wela=0; //關閉有AD片選信號鎖存器的鎖存端以防止在操作數碼管時使AD的片選發生變化
delay(20);
wela=1; //重新打開有AD片選信號鎖存器的鎖存端
// P1=0xff; //讀取P1口之前先給其寫全1
P0=0; //選通ADCS
adrd=0; //AD讀使能
num1=P1; //AD數據讀取
adrd=1;
P0=0xff; //關閉ADCS
adwr=0;
P1=num1; //同時把AD的值送八個發光二極顯示
if(num!=num1) //如果P1口的值發生了變化
{ dula=1; //數碼管關閉
P0=0;
dula=0;
delay(20);
num=num1; //把num1賦值給num
for(i=0;i<4;i++) //4相
{
P0=F_Rotation[i]; //輸出對應的相 可以自行換成反轉表格
delay(20); //改變這個參數可以調整電機轉速 ,數字越小,轉速越大
}
}
}
}
|