数控电压源程序调试遇到问题,求高手解答下!!!

2019-03-24 18:45发布

        #include<reg52.h>        #define uchar unsigned char        #define uint unsigned int        sbit key1=P1^0;        sbit key2=P1^1;        void delay(uint z);                        uchar keyscan()                      // 键盘扫描程序        {                  uchar temp,num;                  num=17;              P1=0xfe;                     //   p1.0口置0                  temp=P1;                  temp=temp&0xf0;                 while(temp!=0xf0)                  {                      delay(20);                      temp=P1;                                  temp=temp&0xf0;                               if(temp!=0xf0)                      {                      //        delay(10);                      //延迟去抖                            P1=P1&0xf0;                                     while(P1!=0xf0);                              switch(temp)                                  {                                          case 0xe0:num=7;break;         //0xf0和0xe0的交处,即p1.0与p1.4的交处                                          case 0xd0:num=8;break;         // p1.0与p1.5的交处,                                                  case 0xb0:num=9;break;                                          case 0x70:num=15;break;                                            default:break;                                  }                          }               else break;              }                          P1=0xfd;                  temp=P1;                  temp=temp&0xf0;                  while(temp!=0xf0)                  {                      delay(20);                      temp=P1;                          temp=temp&0xf0;                          if(temp!=0xf0)                      {                              //delay(10);                                        P1=P1&0xf0;                                while(P1!=0xf0);                                  switch(temp)                                  {                                          case 0xe0:num=4;break;                                          case 0xd0:num=5;break;                                          case 0xb0:num=6;break;                                          case 0x70:num=14;break;                                          default:break;                                  }                      }               else break;                  }                      P1=0xfb;                  temp=P1;                  temp=temp&0xf0;                  while(temp!=0xf0)                  {              delay(20);              temp=P1;                  temp=temp&0xf0;                  if(temp!=0xf0)              {              //delay(10);                          P1=P1&0xf0;                                while(P1!=0xf0);                  switch(temp)                  {                  case 0xe0:num=1;break;                  case 0xd0:num=2;break;                  case 0xb0:num=3;break;                  case 0x70:num=13;break;                  default:break;                  }              }              else break;                  }                      P1=0xf7;                  temp=P1;                  temp=temp&0xf0;                  while(temp!=0xf0)                  {              delay(20);              temp=P1;                  temp=temp&0xf0;                  if(temp!=0xf0)              {              //delay(10);                          P1=P1&0xf0;                        while(P1!=0xf0);                  switch(temp)                  {                  case 0xe0:num=10;break;                  case 0xd0:num=0;break;                  case 0xb0:num=11;break;                  case 0x70:num=12;break;                  default:break;                  }              }              else break;                  }                  return num;        }                //主程序         #include<reg52.h>        #include<absacc.h>        #include<intrins.h>        #include<math.h>        #include"keyscan.h"        #define uchar unsigned char        #define uint unsigned int        #define  dac0832  XBYTE[0X7FFF]    //P2.7作片选,启动DA转换        #define  int0     XBYTE[0X7FF8]     //结束AD转换,锁存通道0,读出AD值        uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,                            0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef};  //数组table[]存放代码        uchar temp1,weishu,flag,dot;        uchar volt[4]={0,0,0,0};        void delay(uint z)        {         uint x,y;         for(x=z;x>0;x--)          for(y=110;y>0;y--);        }                void display(uchar z)              //LED显示函数        {         uchar j;         P2=0xFE;                      //P2.0口置0 ,选择第一个数码管         for(j=0;j<z;j++)                 // 循环控制         {           P0=table[volt[j]];             // 将P0口数据送 LED显示           delay(6);           if(j<z-1) P2=_crol_(P2,1);       //判断,依次选择P2.1,P2.2口          }        }        void main()        {          uchar keynum,i;         float voltage,xiaoshu,sum;         i=0;         voltage=0;         temp1=0;         flag=0;         weishu=1;      //定义数字量值temp1,进位标志flag,数码管位数weishu等变量         while(1)         {            dac0832=temp1;                   // 初始值设定为0          keynum=keyscan();                 //调用键盘扫描函数          if(keynum==15)                    //如果键值15,代表复位,将p0置0          {          P0=0;                             //p0口置0,复位          while(1)                       {           keynum=keyscan();                  //调用键盘扫描函数           if(keynum>=0&&keynum<=9)          //判断键值           {            i++;            for(weishu=0;weishu<i;weishu++)         volt[i-weishu-1]=volt[i-weishu-2];          volt[0]=keynum;                   // 将数值在第一个数码管中显示              if(flag==0)         voltage=voltage*10+keynum;                   else {xiaoshu=pow(10,flag);        xiaoshu=keynum/xiaoshu;        sum=sum+xiaoshu;        flag++;}                   }                              //  数字处理显示程序                    else if(keynum==10)                  //判断按键,如果是点键,10代表点键           {             flag++;                 dot=i;                 volt[0]=volt[0]+10;                //在第二个数码管 输出显示小数点                   }           else if(keynum==11)               //判断按键,如果是确认键           {           weishu=i;           if(flag==0)           temp1=23*voltage;           else           {            i=(int)(sum/0.05);                temp1=23*voltage+i;           }           i=0;           voltage=0;           sum=0;           flag=0;           break;           }               if(int0>dac0832)         {temp1=temp1-1; }         if(int0<dac0832)          { temp1=temp1+1;}                 // ADC转换后于输入数字量比较运算程序                     display(i);                       //调用显示函数                     }           else if(keynum==12)                //判断按键,如果是加键         {                  temp1=temp1+2;                   // 电压数字量加02H                 if(weishu==1){volt[1]=volt[0]+10;        volt[0]=0;        weishu=2;}                           // 如果是一位数的话,将这个数放到第二个数码管,同时将小数点输出,第一位变为0,位数加一                 if(weishu==2){volt[0]++;}                 //将第一位LED加1                    if(volt[0]==10){volt[1]=volt[1]+1;volt[0]=0;}   //如果第一个数码管是点的话,将第一个数码管加一,小数点去掉                 if(volt[1]==20){volt[2]=1;volt[1]=10;volt[0]=-1;weishu=3;}                 if(weishu==3)                          {                 if(dot==1)                 {                 volt[1]++;                 if(volt[1]==10)                    {                 volt[2]++;volt[1]=0;temp1=temp1+2;                 }                 }                 else                  {                 volt[0]++;                 if(volt[0]==10){volt[1]++;volt[0]=0;}                 }                 }         }                              //三位时的处理程序         else if(keynum==13)              //判断按键,如果减键         {              temp1=temp1-2;            // 电压数字量减02H         if(weishu==1)         {volt[1]=volt[0]+9;volt[0]=10;weishu=2;}                 if(weishu==2){volt[0]--;}                 if(volt[0]<0||volt[0]>9){volt[1]=volt[1]-1;volt[0]=9;}                 if(weishu==3)                 {             if(dot==1)                 {                 volt[1]--;                 if(volt[1]<0||volt[1]>9)                 {                 volt[2]--;volt[1]=9;                 }                 }                 else                  {                 volt[0]--;                 if(volt[0]<0||volt[0]>9)                 {                 volt[1]--;volt[0]=9;                 if(volt[1]<10||volt[1]>19) {volt[1]=19;volt[0]=9;weishu=2;}                 }                 }                 }         }           if(int0>dac0832)         {temp1=temp1-1;         }         if(int0<dac0832)         { temp1=temp1+1;        }                       // ADC转换后于输入数字量比较运算程序         display(weishu);        // 调用显示程序,显示位数的值         }        }调试出了问题,高手指导下!!! G_22$~9ZRE1A~JE4P`17R2O.jpg 此帖出自小平头技术问答
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。