51单片机关于PWM控制电机速度的问题

######小白因为暂时没有马达便先想着用lLED亮度代替。
但是按下按钮亮的并不是定义的LED而是数码管的一个位置(定义不同LED数码管亮的位置)

  开发板原理图(没有独立按键所以用矩阵键盘第一列的前三个按键代替了)

img

img


代码

#include <reg52.h>  

sbit LED = P0^0; 
sbit LED2 = P0^7;
sbit ADDR0 = P1^0;
sbit ADDR1 = P1^1;
sbit ADDR2 = P1^2;
sbit ADDR3 = P1^3;
sbit ENLED = P1^4;
sbit ENSEG = P1^5;
sbit KEY_IN_1  = P4^3;
sbit KEY_IN_2  = P3^2;
sbit KEY_IN_3  = P4^1;
sbit KEY_IN_4  = P2^3;
sbit KEY_OUT_1 = P2^7;
sbit KEY_OUT_2 = P2^6;
sbit KEY_OUT_3 = P2^5;
sbit KEY_OUT_4 = P2^4;
sbit Motor = P1^0;

unsigned char NixieTable[] = {  
    0x03, 0x9f, 0x25, 0x0d, 0x99, 0x49, 0x41, 0x1f,
    0x01, 0x09, 0x11, 0xc1, 0x63, 0x85, 0x61, 0x71
};


void Nixie(unsigned char location,number)
{
    switch(location)
    {
        case 1:ADDR0=1,ADDR1=1,ADDR2=1;break;
        case 2:ADDR0=0,ADDR1=1,ADDR2=1;break;
        case 3:ADDR0=1,ADDR1=0,ADDR2=1;break;
        case 4:ADDR0=0,ADDR1=0,ADDR2=1;break;
        case 5:ADDR0=1,ADDR1=1,ADDR2=0;break;
        case 6:ADDR0=0,ADDR1=1,ADDR2=0;break;
        case 7:ADDR0=1,ADDR1=0,ADDR2=0;break;
        case 8:ADDR0=0,ADDR1=0,ADDR2=0;break;
    }
    P0=NixieTable[number];
}


void Timer0Init(void)        
{    
    TMOD &= 0xF0;        
    TMOD |= 0x01;
    TL0 = 0x9C;        
    TH0 = 0xFF;        
    TF0 = 0;        
    TR0 = 1;        
  ET0 = 1;
  EA = 1;
    PT0 = 0;
}//100um

unsigned char j,c;//jΪ¶¨Ê±Æ÷cΪPWM±È½ÏÊý
unsigned char speed;

void main ()
{
              ENLED = 0;   
               ADDR3 = 1;   
               ADDR2 = 1;  
              ADDR1 = 1;
              ADDR0 = 0;
    Timer0Init();
    while(1)
    {
              ENSEG = 0;
                    KEY_IN_1  = 1;
                    KEY_IN_2  = 1;
                    KEY_IN_3  = 1;
                    KEY_IN_4  = 1;
                    KEY_OUT_1 = 1;
                    KEY_OUT_2 = 1;
                    KEY_OUT_3 = 1;
                    KEY_OUT_4 = 1; 
                    KEY_IN_1  = 0;
                    if(KEY_OUT_1 == 0)
                    {
                       speed=1;
                         c=20;
                    }
                    if(KEY_OUT_2 == 0)
                    {
                       speed=2;
                         c=50;
                    }
                    if(KEY_OUT_3 == 0)
                    {
                       speed=3;
                         c=70;
                    }
                    Nixie(1,speed);
    }
}

    void Timer0_Routine() interrupt 1
    {
        TL0 = 0x9C;        
        TH0 = 0xFF;
        j++;
        j%=100;
        if(j<c)
        {
            LED=0;
        }
        else
        {
            LED=1;
        }
    }



现象(我的想法是第一个LED在123不同挡下亮度不同,但是它却是数码管的一个位置亮。QWQ)

img

img

其实我就是想知道怎么才能让我想的LED亮而不是第二位数码管的那个点亮。在这里谢谢帮助了。

数码管其实是由发光二极管组成,有共阴极和共阳极之分,对于共阳极来说,一位数码管由8个二极管组成,他们的阳极接在一起接+5v电源,而各个阴极与某个端口,如p1的8个引脚相连,当某个引脚输出低电平的时候数码管对应的二极管亮。
问题补充:
因为人的眼睛具有迟滞性,如果给一位数码管接通0.3秒地时间,然后再给另一个接通0.3秒,不断地给几个数码管轮流接通0.3秒,因为人眼的迟滞,就显示出您所要求显示的数,当然具体接通时间,要看数码管的位数等情况自己调节。

数码管分共阴极和共阳极,在实物上 其实只要控制端和输入端都为高电平或者低电平就不会亮了