单片机C51 C语言编程问题!!!!

求助!!!!!!!!
是这样一个程序,用定时器1的方式1实现数码管前两位循环计时。
小弟将数码管的位线和P0相连 段线和P2相连 程序如下

#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
uchar num,count,num2,shi,ge;
uchar code table[] ={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //段选数据表
uchar code wei[2] = {0xfe,0xfd}; //位选数据表
void display(uchar,uchar);
void delay(uint);
void main()

{
TMOD=0x10; //设定定时器1工作在方式1
TH1=(65536-50000)/256; //装载初值
TL1=(65536-50000)%256; //开总中断
EA=1; //开定时器1中断
ET1=1; //启动定时器1
TR1=1; //程序在此不停对于数码管动态扫描 等待中断
while(1)
{
display(shi,ge); //显示函数
}

}

void display(uchar shi,uchar ge)
{
uint ledout[1],i;

ledout[0]= table[shi]; //段选数据 十位
ledout[1]= table[ge]; // 段选数据 各个

for (i=0;i<2;i++)
{ //用P0输出位选数据
P0=wei;
这里用查表的方式来赋值
P2=ledout; //用P2输出段选数据
delay(1); //扫描间隔

}

}
//1S中断函数
void T1_time() interrupt 3

{
TH0=(65536-50000)/256; //重新装载初值
TL0=(65536-50000)%256;
count++;
if(count==20) //如果到了20次,说明1秒到
{ //把COUNT清零 重新计数20次
count=0;
num2++; // 用NUM2向来数码管显示 到60后归零
if(num2==60)
num2=0;
shi=(num2)/10; //把NUM2分成2个数 十位和个位
ge=(num2)%10;
}

}

void delay(uint xms)
{
uint i,j;
for(i=xms; i > 0; i--) //延时程序
for(j = 110 ;j > 0; j--);
}

开发板上的结果是,十那个数码管正常工作 但是个位那个数码管就一直亮着a段 最上面一段
弄了一个下午还是找不到问题所在 希望师兄们可以开导下小弟哈 不盛感谢!
补充下 HC573 LE一直接VCC
上面有个地方打错了
应该是
P0=wei[i];
P2=ledout[i];

还有1楼的方法试过了 没有用
数据定义成ledout[1]里面就包括了0和1 不是就1.

电路不好贴 我是用开发板的 连接不会有问题 P0~位线 P2~段线

void display(uchar shi,uchar ge)

{

uint ledout[1],i;  //这里应该是ledout[2]

我在proteus上进行了仿真,但是不知道什么原因,只对共阳极LED数码管好使。我就把程序稍微做了改动,仿真结果可以正确计时。

我把程序贴在下面供参考

#include<reg52.h>

#define uchar unsigned char

#define    uint unsigned int

uchar num=0,count=0,num2=0,shi=0,ge=0;

uchar code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};

      //共阳//段选数据表

//uchar code table[]={0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f};

uchar code wei[2] = {0xfe,0xfd};                                               //位选数据表

void display(uchar,uchar);

void delay(uint);

void main()

{

    TMOD=0x10;                                        //设定定时器1工作在方式1

    TH1=(65536-50000)/256;                            //装载初值

    TL1=(65536-50000)%256;                             //开总中断

                                                   //开定时器1中断

    ET1=1;                                             //启动定时器1

    TR1=1;                                              //程序在此不停对于数码管动态扫描 等待中断

     EA=1;

 while(1)

        {

            display(shi,ge);                         //显示函数

        }   

}

void display(uchar shi,uchar ge)

{

uint ledout[2],i;

     ledout[0]= table[shi];                              //段选数据 十位

     ledout[1]= table[ge];                               // 段选数据  各个

   

     

     for (i=0;i<2;i++)

       {                                                //用P0输出位选数据

               P0=wei[i];                                                

                                                                         //这里用查表的方式来赋值

            P2=ledout[i];                                  //用P2输出段选数据

            delay(1);                                      //扫描间隔

         

       }

      

}

                                                            //1S中断函数

void T1_time() interrupt 3

{

    TH0=(65536-50000)/256;                                   //重新装载初值

    TL0=(65536-50000)%256;

     count++;

     if(count==20)                                            //如果到了20次,说明1秒到

         {                                                          //把COUNT清零 重新计数20次

            count=0;

            num2++;                                        // 用NUM2向来数码管显示        到60后归零

          if(num2==60)

              num2=0;

            shi=num2/10;                                  //把NUM2分成2个数  十位和个位

            ge=num2%10;

        }

}

void delay(uint xms)

{

    uint i,j;

    for(i=xms; i > 0; i--)                                  //延时程序

        for(j = 110 ;j > 0; j--);

}

温馨提示:答案为网友推荐,仅供参考
第1个回答  2010-08-04
uint ledout[1],i;
在这个地方数组定义,这里只定义了一个数,在接下的地方你出现了
ledout[0]= table[shi]; //段选数据 十位
ledout[1]= table[ge]; // 段选数据 各个
这是其一,还有就是你的uchar code table[] 是无符号字符型,而uint ledout[1],i;是无符号整形。把uint ledout[1],改成uchar ledout[2],i;试试!

希望那个可以给你建议,言辞可能有点直接,希望你能接受!
第2个回答  2010-08-04
一楼看的仔细!
相似回答