这个是用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); //改变这个参数可以调整电机转速 ,数字越小,转速越大
}
}
}
}
|