求助!请大神指导~~~~

2019-07-15 15:56发布

* 利用单片机计算出1!+2!+3!+……+9!的结果。
程序:
#include <reg51.h>
#define INT8U        unsigned char
#define INT16U        unsigned int

code INT8U SEG_CODE[] = {0x3f,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};//段码
code INT8U SEG_WEI[] = {0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//位码

void delay_ms(INT16U x)
{
        INT8U t; while(x--) for(t = 0; t < 120; t++);
}//延时子程序

sbit d=P1^0;//位定义(控制段码信号的"门")
sbit w=P1^1; //位定义(控制位码信号的"门")

/*unsigned int*/long sum()
{
unsigned int i , j=1 ;
long s=0 ;
for(i=1;i<=9;i++)
{
  j*=i;
  s+=j;
}
  return s ;
}//求和子函数

void main()
{
unsigned int he;
he=sum();//在主函数中调用求和子函数
        while(1)
        {
                P0=0xff;
                w=1;
                P0=SEG_WEI[7];
                w=0;
                d=1;
                P0=SEG_CODE[he%10];
                d=0;
                delay_ms(5);//显示完个位

                P0=0xff;
                w=1;
                P0=SEG_WEI[6];
                w=0;
                d=1;
                P0=SEG_CODE[(he/10)%10];
                d=0;
                delay_ms(5);//显示完十位

                P0=0xff;
                w=1;
                P0=SEG_WEI[5];
                w=0;
                d=1;
                P0=SEG_CODE[(he/100)%10];
                d=0;
                delay_ms(5);//显示完百位

                P0=0xff;
                w=1;
                P0=SEG_WEI[4];
                w=0;
                d=1;
                P0=SEG_CODE[(he/1000)%10];
                d=0;
                delay_ms(5);//显示完千位

                P0=0xff;
                w=1;
                P0=SEG_WEI[3];
                w=0;
                d=1;
                P0=SEG_CODE[(he/10000)%10];
                d=0;
                delay_ms(5);//显示完万位
               
                P0=0xff;
                w=1;
                P0=SEG_WEI[2];
                w=0;
                d=1;
                P0=SEG_CODE[(he/100000)%10];
                d=0;
                delay_ms(5);//显示完十万位

                P0=0xff;
                w=1;
                P0=SEG_WEI[1];
                w=0;
                d=1;
                P0=SEG_CODE[(he/1000000)%10];
                d=0;
                delay_ms(5);//显示完百万位

                P0=0xff;
                w=1;
                P0=SEG_WEI[0];
                w=0;
                d=1;
                P0=SEG_CODE[he/10000000];
                d=0;
                delay_ms(5);//显示完千万位


                }
}


但是在proteus仿真却出现这样的结果:

QQ图片20151015203714.png    

有两个问题:
1.为什么我在调试1!+2!+...+8!时结果都是正确的,而多一个9!时却发生这样的结果?
2.百万位和十万位一直都是8,怎样修改主函数才能得到没有问题的程序?
因为积分只有一分,所以希望大神不要见怪~~~~
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。