单片机这个数码管为什么不亮啊

原理图:

img


代码如下:
#include "reg51.h"
#include "intrins.h"

unsigned char code table_DU[11]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40}; //0-9断码值+中间横线-
unsigned char code table_WE[8]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//共阴极位选1-8位
unsigned char array[8];//存放时间变量
unsigned char flag=1,secend=51,minter=58,hour=23;//时间初始值

sbit DU=P2^0;//段选
sbit WE=P2^1;//位选

void init()//内部中断(T0定时器)
{
TMOD=0x01;//定时器模式:T0定时器
TH0=(65535-5000)/256; //T0定时器高位
TL0=(65535-5000)%256;//T0定时器低位
TF0=0;//溢出位清零
EA=1; //开启总中断
ET0=1;//允许T0中断
TR0=1;//开启T0定时器
}

void delay()//延时函数:起到滞留效果
{
unsigned int i=100;
while(i--)
{
nop();
nop();
nop();
nop();
nop();
nop();
nop();
nop();
}
}

void display()//显示函数
{
unsigned char i;
array[0]=hour/10;//小时十位
array[1]=hour%10;//小时个位
array[2]=10;//中间-
array[3]=minter/10;//分钟十位
array[4]=minter%10;//分钟个位
array[5]=10;//中间-
array[6]=secend/10;//秒十位
array[7]=secend%10;//秒个位
for(i=0;i<8;i++)
{
WE=1;//位选开启
P0=table_WE[i];//第i位
WE=0;//位选关闭

    DU=1;//段选开启
    P0=table_DU[array[i]];//断码值
    DU=0;//段选关闭

    delay();//滞留
    //消影
    WE=1;
    P0=0xff;
    WE=0;
}
while(secend>=60)
{
    minter=minter+1;
    secend=0;
}
while(minter>=60)
{
    hour=hour+1;
    minter=0;
}
while(hour>=24)
{
    hour=0;
}

}

void main()
{
init();
while(1)
{
display();
}
}
void time_50ms()interrupt 1
{
TF0=0;//溢出位清零
TMOD=0x01;//定时器模式:T0定时器
TH0=(65535-5000)/256; //T0定时器高位
TL0=(65535-5000)%256;//T0定时器低位
EA=1; //开启总中断
ET0=1;//允许T0中断
TR0=1;//开启T0定时器
flag=flag+1;
while(flag>20)
{
secend=secend+1;
flag=0;
}
}

电路和代码不匹配
电路中用P1代码中确用P0
改下再试一下