求单片机大神帮助 这是我写的步进电机控制程序 用脉冲控制的步进电机 为什么改变延时 速度不变呢

是不是delay()中不能放数组呢 跪求啊 在线等

#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
#define GPIO_KEY P1 //独立键盘用P1口

sbit clk=P2^0; // 脉冲信号
sbit cw=P2^1;
sbit en=P2^2;

uchar j,key,k;
uint i;
uint sudu[]={400,800,1200,1300,1500};
void delay(unsigned int t);
unsigned char Key_Scan();
void main()
{
unsigned char keyNum;

while(1)
{
// clk=1;
delay(sudu[i]);
clk=~clk;
// clk=0;
// delay(sudu[i]);

keyNum = Key_Scan(); //调用键盘扫描,
switch(keyNum)
{
case 0xfe:cw=1;break; //正转
case 0xfd:cw=0;break; //反转
case 0xfb:en=1;break; //停止
case 0xf7:en=0;break; //启动
case 0xEF:i++;i%=9;break; //减速
case 0xDF:i--;i%=9;break; //加速
}

}
}

unsigned char Key_Scan()
{
unsigned char keyValue; //保存键值
GPIO_KEY=0XFF;
//--检测按键1--//
if (GPIO_KEY != 0xFF) //检测按键K1是否按下
{

delay(1000); //消除抖动
if (GPIO_KEY != 0xFF) //再次检测按键是否按下
{
keyValue = GPIO_KEY; // keyValue = GPIO_KEY=P1
while(!GPIO_KEY );//按键弹起
}
delay(1000);
while(!GPIO_KEY ); //说明案件真的弹起 *///GPIO_KEY=0XFF;
}

return keyValue; //将读取到键值的值返回
}

void delay(unsigned int t)
{
while(t--);
}

粗略看了一下,有几点错误,首先一般PWM控制不这么用,应该用硬件PWM功能输出,再然后控制延时的变量“i”没有控制范围,i++到0xff,以后容易溢出错误。况且i对9取余是要干嘛?对5取余也比9对啊,再然后你这按键延迟delay(1000)太短,容易出错,你知道12M晶振的单片机t--1000次才用多长时间么?可以说是不到1ms,能去抖?追问

你好 手里实在没有能产生PWM发热硬件 采纳了您的意见 把9改成了5 延时改成了80000 效果好多了 可以调节了 但是还是有缺陷 就是按键觉好像不灵啊 开始时i是不是要给个值呢 要是给了 又要放在什么地方呢 麻烦您看下

追答

扫描按键本身就有这个毛病,建议给按键并联个0.1uf~1uf的电容,应该不是按键不灵,如果你每次按下去超过0.5s应该没问题,况且你这个是按键放开以后产生键值,如果没有特殊设计,按键没必要设计成弹起以后才有效果。你这个i的问题还好,毕竟你按255次才会有可能出错,严谨一点的话建议加一句 :
case 0xEF:
i++;
if(i==255)
i=0;
i%=5;
break; //减速
底下加速的依次类推

温馨提示:答案为网友推荐,仅供参考
相似回答