跪求大侠帮忙,关于制作单片机计数器程序乱码的问题

2019-07-16 01:41发布

这是个用51做的计数器的程序,已加了注释。请哪位好心人帮帮忙。。问题是,计数会不定时出现乱码。。主要是个位上。
具体电路图在附件。。


#include<reg51.h>
#include"24c02.h"          //24c02存储器
#define uc unsigned char
#define ui unsigned int
uc code table[]=
{
   0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e//共阳极数码管段
  };
int num_qian,time_qian,num_bai,time_bai,num_shi,time_shi,num_ge,time_ge,sum_qian,sum_bai,sum_shi,sum_ge,tiao,mode,time,num;
long sum;
ui  i,j ;
sbit move=P1^7;//移位&清零
sbit add=P1^6;        //加
sbit set=P1^5;        //设置
sbit jiejin=P1^4; //接近开关
sbit yuan=P1^3;          //输出控制1
sbit ping=P1^2;          //输出控制2
sbit led=P1^1;          //报警灯
sbit guangqian=P3^2; //计数光纤
sbit alARM=P1^1;        //蜂鸣器

void delay(ui z)         //延时1us函数
{
        ui x,y;
        for(x=z;x--;x>0)
                for(y=12;y--;y>0);
}

void  system_ini ( void) //函数初始化

{
          ping=1;         //        初始化控制1
        yuan=1;        // 初始化控制2
        led =1;        //报警灯
        EA=1;
        EX0=1;
        IT0=1;
        x24c02_init();          
        num_qian=x24c02_read(1);  //读取存储器        保存的设定的个数
        num_bai=x24c02_read(2);
        num_shi=x24c02_read(3);
        num_ge=x24c02_read(4);
        sum_qian=x24c02_read(5);   //读取存储器        保存的已计的个数
        sum_bai=x24c02_read(6);
        sum_shi=x24c02_read(7);
        sum_ge=x24c02_read(8);
        time_qian=x24c02_read(9);  //读取存储器        保存的设定的计数到位延时时间
        time_bai=x24c02_read(10);
        time_shi=x24c02_read(11);
        time_ge=x24c02_read(12);
        num=num_ge+num_shi*10+num_bai*100+num_qian*1000;
        sum=sum_ge+sum_shi*10+sum_bai*100+sum_qian*1000;
        time=time_ge+time_shi*10+time_bai*100+time_qian*1000;                  

}


void  system_led  (led)                //数码管 动态显示函数

{
                          //P2=0xff        ;
                                P2=0xf7;        //位选
                                //P0=0X00
                                P0=table[sum_ge]; //段选
                                ;
                                delay(10);
                                //P2=0xf0;
                               
                                P2=0xff        ;

                                P2=0xfb;
                                //P0=0x00;
                                P0=table[sum_shi];
                                delay(10);
                                //P2=0xf0;
                               
                                P2=0xff        ;

                                P2=0xfd;
                                //P0=0x00;
                                P0=table[sum_bai];
                                delay(10);
                                //P2=0xf0;
                               
                                P2=0xff        ;

                                P2=0xfe;
                                //P0=0x00;
                                P0=table[sum_qian];
                                delay(10);
                                //P2=0xf0;
                               
                                P2=0xff        ;

}
///////////设置,1、按一下“设置”按钮,数码管最右边有数字显示,这是控制1停止后,控制2继续振得时间。按下“加”按钮,可以是数字增加,按一下“移位”按钮,显示十位,以此类推。
///////////        /////2、上面的时间设置完成后,按一下“设置”按钮,数码管显示的是要设置的个数,下面步骤同上。
///////////        /////3、最后按下“设置”按钮,数码管显示的是当前走料的个数,“设置“按钮只能在托盘不在设备上或“电源”按钮关闭的情况下才能起作用。
void  system_set  ( void ) //设置

{
   if(set==0)
                    {
                          delay(1000);
                          if(set==0)
                          {
                                EA=0;
                                tiao=1;
                                mode++;
                                if(mode==3)
                                {
                                        mode=0;
                                        EA=1;
                                }               
                           }
                     }

                   
                   if(mode==0)                //正常计数模式
                     {
                           if(move==0)
                           {
                                  delay(100);
                                  if(move==0)
                                 {
                                        sum_ge=0;
                                        sum_shi=0;
                                        sum_bai=0;
                                        sum_qian=0;
                                        x24c02_write(5,sum_qian);
                                        delay(10);       
                                        x24c02_write(6,sum_bai);
                                        delay(10);       
                                        x24c02_write(7,sum_shi);
                                        delay(10);       
                                        x24c02_write(8,sum_ge);
                                        delay(10);       
                                  }
                            }

                        system_led  (led);
                       

                           if(sum_ge==10)
                        {
                                sum_ge=0;
                                sum_shi++;
                                if(sum_shi==10)
                                {
                                        sum_shi=0;
                                        sum_bai++;
                                        if(sum_bai==10)
                                        {
                                                sum_bai=0;
                                                sum_qian++;
                                                if(sum_qian==10)
                                                        sum_qian=0;
                                        }
                                }
                        }
                        x24c02_write(5,sum_qian);
                        delay(10);       
                        x24c02_write(6,sum_bai);
                        delay(10);       
                        x24c02_write(7,sum_shi);
                        delay(10);       
                        x24c02_write(8,sum_ge);
                        delay(10);
                        sum=sum_ge+sum_shi*10+sum_bai*100+sum_qian*1000;
                        if((sum>=num)&(num>1))
                        {       
                                if(sum_ge==10)
                                {
                                        sum_ge=0;
                                        sum_shi++;
                                        if(sum_shi==10)
                                        {
                                                sum_shi=0;
                                                sum_bai++;
                                                if(sum_bai==10)
                                                {
                                                        sum_bai=0;
                                                        sum_qian++;
                                                        if(sum_qian==10)
                                                                sum_qian=0;
                                                }
                                        }
                                }
                               
                                yuan=1;
                                P2=0xf0;       
                                for(i=1;i<=time;i++)
                                {
                                        for(j=1;j<200;j++)
                                        {

                                                 system_led  (led);
                                               
                                        }
                                }
                                ping=1;
                                while(jiejin==1)
                                {
                                        led=1;
                                        for(j=1;j<100;j++)
                                        {
                                                system_led  (led) ;
                                               
                                        }
                                        led=0;
                                        for(j=1;j<100;j++)
                                        {
                                                system_led  (led);
                                               
                                               
                                        }
                                }
                                led=1;
                               
                                sum_ge=0;
                                sum_shi=0;
                                sum_bai=0;
                                sum_qian=0;       
                        }
                }
                if(mode==1)                  //设置延时时间模式
                {
                        if(move==0)
                        {
                                delay(1000);
                                if(move==0)
                                {
                                        tiao++;
                                        if(tiao==5)
                                                tiao=1;
                                }
                        }
                        if(tiao==1)
                        {               
                                delay(10);
                                P2=0xf7;
                                P0=table[time_ge];
                                if(add==0)
                                {
                                        delay(1000);
                                        if(add==0)
                                        {
                                                time_ge++;
                                                if(time_ge==10)
                                                        time_ge=0;
                                        }
                                }
                       
                        }
                        if(tiao==2)
                        {       
                                delay(10);
                                P2=0xfb;
                                P0=table[time_shi];               
                                if(add==0)
                                {
                                        delay(1000);
                                        if(add==0)
                                        {
                                                time_shi++;
                                                if(time_shi==10)
                                                        time_shi=0;
                                        }
                                }
                        }
                        if(tiao==3)
                        {
                                delay(10);
                                P2=0xfd;
                                P0=table[time_bai];
                                if(add==0)
                                {
                                        delay(1000);
                                        if(add==0)
                                        {
                                                time_bai++;
                                                if(time_bai==10)
                                                        time_bai=0;
                                        }
                                }
                        }
                        if(tiao==4)
                        {       
                                delay(10);
                                P2=0xfe;
                                P0=table[time_qian];                       
                                if(add==0)
                                {
                                        delay(1000);
                                        if(add==0)
                                        {
                                                time_qian++;
                                                if(time_qian==10)
                                                        time_qian=0;
                                        }
                                }
                        }
                        x24c02_write(9,time_qian);
                        delay(10);       
                        x24c02_write(10,time_bai);
                        delay(10);
                        x24c02_write(11,time_shi);
                        delay(10);
                        x24c02_write(12,time_ge);
                        delay(10);
                        time=time_ge+time_shi*10+time_bai*100+time_qian*1000;
                }
                if(mode==2)                   //设置计数总数模式
                {
                        if(move==0)
                        {
                                delay(1000);
                                if(move==0)
                                {
                                        tiao++;
                                        if(tiao==5)       
                                                tiao=1;
                                }
                        }
                        if(tiao==1)
                        {
                                delay(10);
                                P2=0xf7;
                                P0=table[num_ge];
                                if(add==0)
                                {
                                        delay(1000);
                                        if(add==0)
                                        {
                                                num_ge++;
                                                if(num_ge==10)
                                                        num_ge=0;
                                        }
                                }
                        }
                        if(tiao==2)
                        {
                                delay(10);
                                P2=0xfb;
                                P0=table[num_shi];
                                if(add==0)
                                {
                                        delay(1000);
                                        if(add==0)
                                        {
                                                num_shi++;
                                                if(num_shi==10)
                                                        num_shi=0;
                                        }
                                }
                        }
                        if(tiao==3)
                        {       
                                delay(10);
                                P2=0xfd;
                                P0=table[num_bai];                       
                                if(add==0)
                                {
                                        delay(1000);
                                        if(add==0)
                                        {
                                                num_bai++;
                                                if(num_bai==10)
                                                        num_bai=0;
                                        }
                                }
                        }
                        if(tiao==4)
                        {
                                delay(10);
                                P2=0xfe;
                                P0=table[num_qian];
                                if(add==0)
                                {
                                        delay(1000);
                                        if(add==0)
                                        {
                                                num_qian++;
                                                if(num_qian==10)
                                                        num_qian=0;
                                        }
                                }
                        }
                        x24c02_write(1,num_qian);
                        delay(10);       
                        x24c02_write(2,num_bai);
                        delay(10);       
                        x24c02_write(3,num_shi);
                        delay(10);       
                        x24c02_write(4,num_ge);
                        delay(10);
                        num=num_ge+num_shi*10+num_bai*100+num_qian*1000;       
                }


}




main()
{

       
        system_ini (  ) ;
       
        if (jiejin==0)         //接近开关拿走

        {
           ping=1;        //
           yuan=1;        //
           led =1;        //

        }
       
       
       
        while(1)
        {
               
                  if(jiejin==1)        //接近开关在位
                    {
                          
                          ping=0;
                          yuan=0;
                          led =1;

                    }
                        system_set  (  ) ;
        }               
}

void int0(void) interrupt 0        using 0
{          
           
                   sum_ge++;
                  



}       



















原理图新.zip 下载积分: 积分 -1 分
7.99 KB, 下载次数: 13, 下载积分: 积分 -1 分
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
2条回答
文敏
1楼-- · 2019-07-16 05:57
在显示时,对P2口进行初始化,应放在个位置数前.
qjp1988113
2楼-- · 2019-07-16 11:08
文敏 发表于 2013-4-2 16:31
在显示时,对P2口进行初始化,应放在个位置数前.

也试过了。可是。还是效果不明显。哎,头大。

一周热门 更多>