這個(gè)是用89C52單片機(jī)做的一個(gè)驅(qū)動(dòng)步進(jìn)電機(jī)和LED發(fā)光管的程序 在用電位器調(diào)節(jié)AD取值電壓的時(shí)候 LED獲取的信號(hào)是正常的 步進(jìn)電機(jī)為什么一直轉(zhuǎn)啊轉(zhuǎn)的 我用P1口的值在做比較 if語(yǔ)句不滿足條件 應(yīng)該沒(méi)有脈沖信號(hào)給步進(jìn)電機(jī)呀 為什么還是循環(huán)在轉(zhuǎn),請(qǐng)高手幫我解答下吧。
#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) //延時(shí)程序
{
for(j=i;j>0;j--)
for(k=125;k>0;k--);
}
void main() // 主程序
{
while(1)
{
P1=0xff; //首先給P1口一個(gè)值
num=P1; //把這個(gè)P1口的值賦給num變量作為比較
delay(10);
wela=1;
P0=0; //選通ADCS
adwr=0; //AD寫入(隨便寫個(gè)什么都行,主要是為了啟動(dòng)AD轉(zhuǎn)換)
_nop_();
adwr=1;
P0=0xff; //關(guān)閉ADCS
delay(10);
wela=0; //關(guān)閉有AD片選信號(hào)鎖存器的鎖存端以防止在操作數(shù)碼管時(shí)使AD的片選發(fā)生變化
delay(20);
wela=1; //重新打開(kāi)有AD片選信號(hào)鎖存器的鎖存端
// P1=0xff; //讀取P1口之前先給其寫全1
P0=0; //選通ADCS
adrd=0; //AD讀使能
num1=P1; //AD數(shù)據(jù)讀取
adrd=1;
P0=0xff; //關(guān)閉ADCS
adwr=0;
P1=num1; //同時(shí)把AD的值送八個(gè)發(fā)光二極顯示
if(num!=num1) //如果P1口的值發(fā)生了變化
{ dula=1; //數(shù)碼管關(guān)閉
P0=0;
dula=0;
delay(20);
num=num1; //把num1賦值給num
for(i=0;i<4;i++) //4相
{
P0=F_Rotation[i]; //輸出對(duì)應(yīng)的相 可以自行換成反轉(zhuǎn)表格
delay(20); //改變這個(gè)參數(shù)可以調(diào)整電機(jī)轉(zhuǎn)速 ,數(shù)字越小,轉(zhuǎn)速越大
}
}
}
}
|