daxiaolijun 发表于 2012-11-12 08:45:33

请教51大侠们,看看问题出在哪?

目的:两个按键控制两个直流电机调速,长按键(>=2s)时对应电机加速,相反减速。(补充:该程序在一个按键一个电机时达到要求,当程序中补充到两个电机两个按键时未达到要求,出现的问题是按键时间长短好像都是出现的减速,而且有时按好几下才减,在该程序下连接一个电机也是上述问题),求高手指点。
                                                                                              ————自学51小菜鸟


#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int

sbit U1=P1^1;
sbit U2=P1^2;
sbit KEY1=P3^4;
sbit KEY2=P3^3;

uchar num,num1,num2,keytime,keynum,numt,numspeed1,numspeed2;

void delayms(uint xms)
{
        uint i,j;
        for(i=xms;i>0;i--)
                         for(j=110;j>0;j--);
}

void keyscan()
{
        if(KEY1==0||KEY2==0)
        {
                delayms(10);
                if(KEY1==0||KEY2==0)
                {
                        if(KEY1==0) keynum=1;
                        if(KEY2==0) keynum=2;
                        while((!KEY1)||(!KEY2))
                        {
                                TR1=1;
                        }
                        TR1=0;
                        keytime=numt;
                        numt=0;
                }

                if(keytime>=40)
                {
                        switch(keynum)
                        {
                                case 1:
                                {       
                                        {
                                                numspeed1=numspeed1+2;               
                                                if(numspeed1>16)
                                                        numspeed1=8;
                                        }
                                        keynum=0;
                                        break;
                                }
                               
                                case 2:
                                {       
                                        {
                                                numspeed2=numspeed2+2;               
                                                if(numspeed2>16)
                                                        numspeed2=8;
                                        }
                                        keynum=0;
                                        break;
                                }
                        }
                }

                if(keytime<40)
                {
                        switch(keynum)
                        {
                                case 1:
                                {       
                                        {
                                                numspeed1=numspeed1-2;
                                                if(numspeed1<8)
                                                        numspeed1=8;
                                        }
                                        keynum=0;
                                        break;
                                }
                       
                                case 2:
                                {       
                                        {
                                                numspeed2=numspeed2-2;
                                                if(numspeed2<8)
                                                        numspeed2=8;
                                        }
                                        keynum=0;
                                        break;
                                }
                        }
                }
       
        keytime=0;
        }
}

void init()
{
        TMOD|=0x11;
        TH0=(65536-20)/256;                //20us
        TL0=(65536-20)%256;
        TH1=(65536-45872)/256;
        TL1=(65536-45872)%256;
        EA=1;
        ET0=1;                                //开定时器0中断
        ET1=1;                                //开定时器1中断
        TR0=1;                                //启动定时器0
}

void main()
{       
        init();
        U1=1;
        U2=1;
        numspeed1=12;
        numspeed2=12;
        while(1)
        {
                keyscan();
        }
}

void Time0_Init() interrupt 1    //定时器0作用是控制PWM
{
        TH0=(65536-20)/256; //20us      
        TL0=(65536-20)%256;
        num1++;       
        num2++;

        if(num1<numspeed1)       
                U1=1;
                else U1=0;
                if(num1>20)
                        num1=0;

        if(num2<numspeed2)
                U2=1;
                else U2=0;
                if(num2>20)
                        num2=0;
}

void Time1_Init() interrupt 3       
{
        TH1=(65536-45872)/256;
        TL1=(65536-45872)%256;
        numt++;                               
}

devcang 发表于 2012-11-12 09:40:37

想单独控制? 那按键的断送就是、时间长度变量等却只有一个。


daxiaolijun 发表于 2012-11-12 10:36:05

devcang 发表于 2012-11-12 09:40 static/image/common/back.gif
想单独控制? 那按键的断送就是、时间长度变量等却只有一个。

程序中只写一个电机一个按键的时候完全符合,再加一个电机的程序时就出问题了。你说的问题在哪?能说具体点吗?没太理解,3Q!!!

daxiaolijun 发表于 2012-11-12 10:43:14

人好少哟{:sad:}

daxiaolijun 发表于 2012-11-12 10:43:52

坐等大侠

daxiaolijun 发表于 2012-11-12 10:44:09

坐等大侠

daxiaolijun 发表于 2012-11-12 10:44:23

坐等大侠

duanll 发表于 2012-11-12 11:56:23


按键扫描程序有问题。

daxiaolijun 发表于 2012-11-12 19:34:32

duanll 发表于 2012-11-12 11:56 static/image/common/back.gif
按键扫描程序有问题。

能说的具体点吗?我觉得没问题呀。3Q!而且一个电机程序是正常的,再加个电机程序就出问题了。

juwen163 发表于 2012-11-12 20:50:27

建议 初始化时KEY1和KEY2=1;在得到按键值的时候也复位KEY1和KEY2的初始值(我也是菜鸟)

daxiaolijun 发表于 2012-11-12 21:16:26

juwen163 发表于 2012-11-12 20:50 static/image/common/back.gif
建议 初始化时KEY1和KEY2=1;在得到按键值的时候也复位KEY1和KEY2的初始值(我也是菜鸟) ...

上电后和按键连接的引脚默认就是1吧?能说说你的不同理由吗?谢谢。

daxiaolijun 发表于 2012-11-12 21:17:20

欢迎大家踊跃提意见和观点,本人不胜感激!!!

daxiaolijun 发表于 2012-11-13 08:20:58

木有人{:sweat:}

daxiaolijun 发表于 2012-11-13 19:41:58

欢迎大家踊跃提意见和观点,本人不胜感激!!!
页: [1]
查看完整版本: 请教51大侠们,看看问题出在哪?