那位大神帮我看看三位半的数字电压表

2019-07-15 17:04发布

请各位大神帮我看看!程序调试不成功!小弟初学者!调试了好久!找了许多资料还是没发现问题!麻烦那位大神帮我看看!
  #include<reg52.h>
  #include <intrins.h>
  sbit ST=P3^0; //ADC0809启动转换
  sbit OE=P3^1; //允许ADC0809输出数据
  sbit EOC=P3^2; //ADC0809转换结束信号   
  sbit BEEP=P3^3;   
  sbit V1=P3^4;    //200V档位测试标志位
  sbit V2=P3^5;     //20V档位测试标志位
  sbit V3=P3^6;    //2V档位测试标志位
  sbit V4=P3^7;    //200mV档位测试标志位
  sbit led=P0^7;
  unsigned int h;  
  unsigned char digit[4];
  unsigned char table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,
  0x80,0x90,0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10};
  void delay(unsigned int tc)//带小数点编码 /*延时*/
  {
          while(tc!=0)
          {
                unsigned int i;
                for(i=0;i<100;i++)
                {
                        tc--;
                }
        }
  }  /*ADC0809转换子程序*/  
  unsigned char adc0809() //读AD0809子程序
  {  
          unsigned char adda;
        ST=0;   
        OE=0; //读AD0809准备   
        P1=0xff; //先把ADC0809的输出清0
        ST=1;
        ST=0; //启动转换
        while(EOC==1);// 如果有输出中断,使能读功能,并读数据
        {
                OE=1;  
                adda=P1;  
                OE=0;
        }
        return(adda);//返回最后读出数据
  }
  /*ADC0809转换数据处理*/
   unsigned int dacl() //AD0809读出数据处理
   {
            unsigned char x;
         unsigned int dady=0;
         for(x=0;x<10;x++)  
         {dady=adc0809()+dady;}  
         dady=dady/10; //求平均值,提高精度
         return(dady);//返回处理结果
   }
   void loop(void)
   {
     while(h==1)
        {
                 BEEP=!BEEP;
                delay(100);
                BEEP=!BEEP;
                break;
         }
   }
   void led_display(float val)//显示函数
   {
         if(V1==0) //200V档
         {
                 val=val*5000/255;
                if(val>2000||val<200)
                {
                  led=0;
                  h=1;
                  loop();
                 }
                 else  if(val>200)
                {
                        digit[3]=val/1000;
                        val=val-1000*digit[3];
                        digit[2]= val/100;
                        val=val-100*digit[2];
                        digit[1]=val/10;
                        val=val-10*digit[1]; //此后选择带小数点编码
                         digit[0]=val*10/10;  
                        /*将十进制数转换成字符*/
                        digit[3]=table[digit[3]];
                        digit[2]=table[digit[2]];
                        digit[1]=table[digit[1]+10];
                        digit[0]=table[digit[0]];
                 }
          }
         else if(V2==0) //20V档
         {
                   val= 5000*val/255;
                if(val>2000||val<200)
            {
                        h=1;
                        loop();         
                }
                else
            {
                         digit[3]=val/1000;
                        val=val-1000*digit[3];
                        digit[2]=val/100;
                        val=val-100*digit[2]; //此后选择带小数点编码
                        digit[1]=val/10;
                        val=val-10*digit[1];
                        digit[0]=val*10/10;
                        /*将十进制数转换成字符*/
                        digit[3]=table[digit[3]];
                        digit[2]=table[digit[2]+10];
                        digit[1]=table[digit[1]];
                        digit[0]=table[digit[0]];
                }
          }
         else if(V3==0) //2V档
          {
                   val=5000*val/255;
                 if(val>2000||val<200)
                {
                          h=1;
                        loop();
                 }
                 else
                {
                        digit[3]=val/1000;
                        val=val-1000*digit[3]; //此后选择带小数点编码
                        digit[2]=val/100;
                        val=val-100*digit[2];
                        digit[1]=val/10;
                        val=val-10*digit[1];
                        digit[0]=val*10/10;
                        /*将十进制数转换成字符*/
                        digit[3]=table[digit[3]];
                        digit[2]=table[digit[2]+10];
                        digit[1]=table[digit[1]];
                        digit[0]=table[digit[0]];
                 }
          }
         else if(V4==0) //200mV档
          {
                 val= 5000* val/255;//将伏转化为毫伏
                 if(val>2000)
                {
                        h=1;
                        loop();
                 }
                 else
                {
                        digit[3]=val/1000;
                        val=val-1000*digit[3];
                        digit[2]=val/100;
                        val=val-100*digit[2];
                        digit[1]=val/10;
                        val=val-10*digit[1];//此后选择带小数点编码
                        digit[0]=val*10/10;
                        /*将十进制数转换成字符*/
                        digit[3]=table[digit[3]];
                        digit[2]=table[digit[2]];
                        digit[1]=table[digit[1]];
                        digit[0]=table[digit[0]];
                 }
          }
        }
        void main()
   {
                 int i;
                int j=3;
                int k;
                unsigned char fuhao[4];
                BEEP=0;// 蜂鸣器初始化'
                led_display(dacl());//读值显示
                for(i=3;i>=0;i--)
           {
                         if(digit[i]!=0xc0)
                   {
                                   fuhao[j]=digit[i];
                                j=j--;
                        }
                        for(k=0;k<4;k++)
                   {
                          
                                   P0=0X01<<k;
                                P2=fuhao[k];
                                delay(10);
                        }
                }
        }         


三位半数字电压表.rar 下载积分: 积分 -1 分
57.12 KB, 下载次数: 27, 下载积分: 积分 -1 分
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。