⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 datacurrent.c

📁 控制常用的最小系统
💻 C
字号:
/*数控恒流源*/
 #include<reg51.h>
 #include<absacc.h>
 #include <intrins.h>
 #define uchar unsigned char
 #define JP373 XBYTE[0x87ff]
 #define DM373 XBYTE[0x97ff]
 #define WM373 XBYTE[0xa7ff]
 #define R62256 XBYTE[0X0000]
 #define DAC0832 XBYTE[0Xefff]
 sbit P1_6=P1^6;
 sbit P3_2=P3^2;
 sbit CS=P1^4;
 sbit SID=P1^5;
 sbit CLK=P1^7;

 void delay10ms(unsigned char time);
 uchar ksp(void);
 void int0_jp(void);
 uchar keyscan(void);
 void  increase(void);
 void  reduce(void);
 void  enter(void);
 void int1_jp(void);
 void  write_ad7705( unsigned char temp);
 unsigned int ADRAD(void);
 void  PROCESS(void);
 void  measure(void);
 void  clear(void);
 void compare(void);
 void SendByte(uchar ucSendData);
 void Write_Command(uchar ucCommand);
 void Write_Data(uchar ucData);
 void Lcd_Display(uchar data1);
 void Lcd_Initial();
 void  lcdmain(uchar qw, uchar bw, uchar sw, uchar gw);

 uchar ucBuffer;
 uchar data a,d;
 uchar  key,temp,THUN,HUN,TEN,ONE;
 uchar  qw,bw,sw,gw;
 uchar  I,J;
 uchar  l=0X10,m=0X10,n=0X10;
 unsigned int sum,k;
 unsigned int dout;
 double res;


code  unsigned char  tab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};/*代码段数组*/


             void   main (void)   //主程序
                  {
                    d=1;
                   while(1)
                   {
                      IE=0X81;
                      IP=0X01;
                      TCON=0X00;
                      P1=0Xf0;
                     while(d);
                     compare();
                   while(1)
                   {  P0=JP373;
                      P0&=0x0f;
                      delay10ms(10);
                      if(P0==0x0f) break;
                    }
                     EA=1;
                     d=1;
                    }
                   }
             void Delay()   //40ms
            {
                uchar i,j;
               for(i=0x0ff;i>0;i--)
               for(j=0x0ff;j>0;j--);
            }

             void delay10ms(unsigned  char time)//延时10ms
                 {unsigned  char i;
                  while(time--)
                  {for(i=0;i<120;i++);}
                  }
             uchar ksp(void) //去抖动
                   {uchar temp;
                    P1=0XF0;
                   P0=JP373;
                   temp=P0;
                   temp&=0x0f;
                   return temp;
                   }


             void int0_jp(void)interrupt 0    //处理中断0
               {   I=ksp();
                   if(I==0x0f)
                   { while(1);}
                   I=ksp();
                   if(I==0x0f) {while(1);}
                   d=0;
                   EA=0;
                 }




             uchar keyscan(void) //按键扫描子程序
              {    P1=0XFE;
                   P0=JP373;
                   temp=P0;
                   temp&=0x0F;
                 switch(temp)
                 {case  0x0E: {key=0; return key;} break;
                  case  0x0D: {key=4; return key;} break;
                  case  0X0B: {key=8; return key;} break;
                  case  0X07: {key=12;return key;} break;
                  default:break;
                   }

                  P1=0XFD;
                  P0=JP373;
                  temp=P0;
                  temp&=0x0F;
                 switch(temp)
                 {case  0x0E: {key=1; return key;} break;
                  case  0x0D: {key=5; return key;} break;
                  case  0X0B: {key=9; return key;} break;
                  case  0X07: {key=13;return key;} break;
                  default:break;
                  }

                   P1=0XFB;
                   P0=JP373;
                   temp=P0;
                   temp&=0x0F;
                 switch(temp)
                 {case  0x0E: {key=2; return key;} break;
                  case  0x0D: {key=6; return key;} break;
                  case  0X0B: {key=10;return key;} break;
                  case  0X07: {key=14;return key;} break;
                  default:break;
                  }

                   P1=0XF7;
                   P0=JP373;
                   temp=P0;
                   temp&=0x0F;
                 switch(temp)
                 {case  0x0E: {key=3; return key;} break;
                  case  0x0D: {key=7; return key;} break;
                  case  0X0B: {key=11;return key;} break;
                  case  0X07: {key=15;return key;} break;
                  default:break;
                  }

               }

          void  increase(void)
           {if((l!=0X10)||(m!=0x10)||(n!=0x10))
             if(sum<200)
             {sum+=1;}
             R62256=sum;
             DAC0832=sum;
             measure();

             }

          void  reduce(void)
           {if((l!=0X10)||(m!=0x10)||(n!=0x10))
             if(sum>=1)
            {sum-=1;}
            R62256=sum;
            DAC0832=sum;
            measure();

           }


         void enter(void)
        {if((l!=0x10)||(m!=0x10)||(n!=0x10))
          {if((l!=0x10) && (m!=0x10 )&& (n!=0x10) ) //三位数
              {sum=l*100+m*10;
               sum+=n;
              }
             else  if((l!=0x10) && (m!=0x10 ) && (n==0x10 )) //两位数
              {sum=l*10+m;}
             else if((l==0x10) && (m!=0x10) && ( n!=0x10))   //两位数
              {sum=m*10+n;}
             else if((l!=0x10) &&( m==0x10) &&( n==0x10))    //一位数
              {sum=l;}
             else if ((l==0x10) &&(m!=0x10) &&(n==0x10))   //一位数
              {sum=m;}
             R62256=sum;
             DAC0832=sum;
             measure();
          }
         }

        void SendByte(uchar ucSendData)
        {
         uchar i;
         for(i=8;i>0;i--)
         {
                CLK=0;//上升沿发送数据
                if(ucSendData&0x80)//如果是1
                 SID=1;
                else
                        SID=0;
                CLK=1;
                ucSendData=_crol_(ucSendData,1);//左移一位
         }
        }

       void Write_Command(uchar ucCommand) //按时序操作
         {
           uchar temp=0xf8;//write command
           delay10ms(1);
           CS=1;//使能
           SendByte(temp);//send command,the first byte
           temp=ucCommand&0xf0;
           SendByte(temp);//send the second byte
           temp=_crol_(ucCommand,4)&0xf0;
           SendByte(temp);//send the third byte
           CS=0;
         }

      void Write_Data(uchar ucData)
        {delay10ms(1);
         CS=1;
         ucBuffer=0xfa;//数据从MCU到LCD,所写数据为显示数据
         SendByte(ucBuffer);//the first byte
         ucBuffer=ucData&0xf0;//高四位
         SendByte(ucBuffer);//the second byte
         ucBuffer=_crol_(ucData,4)&0xf0;//低四位
         SendByte(ucBuffer);//the third byte
         CS=0;
        }

       void Lcd_Display(uchar data1)
        //  data1--字符编码
       {   Write_Data(data1);

        }

       void Lcd_Initial()
       {
         Delay();//延时40MS
         Write_Command(0x30);//功能设定:8位数据,基本指令30
         Write_Command(0x04);//点设定:画面右移
         Write_Command(0x0f);//lcd开,光标开
         Write_Command(0x01);//清屏
         Write_Command(0x02);//地址归位

       }

      void  lcdmain(uchar qw, uchar bw, uchar sw, uchar gw)
       {
        Lcd_Initial();
        Write_Command(0x90);//设定DDRAM起始地址
        Lcd_Display(0xca);  //输
        Lcd_Display(0xe4);
        Lcd_Display(0xb3);  //出
        Lcd_Display(0xf6);
        Lcd_Display(0xb5);  //电
        Lcd_Display(0xe7);
        Lcd_Display(0xc1);  //流
        Lcd_Display(0xf7);

        Write_Command(0X94);
        Lcd_Display(0x3a);// :
        Lcd_Display(qw);
        Lcd_Display(bw);
        Lcd_Display(sw);
        Lcd_Display(gw);

       }




     void int1_jp(void) interrupt 2 //处理外中断1
                  {EA=0X00;
                   a=0;
                   }
     void  write_ad7705( unsigned char temp)
            {
             ACC=temp;
             TI=0;
             SBUF=ACC;
             while(!TI);
             }

     unsigned int ADRAD(void)
            {
               while(RI==0);
               RI=0;
               ACC=SBUF;
               I=ACC;
               while(RI==0);
               RI=0;
               ACC=SBUF;
               J=ACC;

               temp=I>>7;
               temp+=(I&0X40)>>5;
               temp+=(I&0X20)>>3;
               temp+=(I&0X10)>>1;
               temp+=(I&0X08)<<1;
               temp+=(I&0X04)<<3;
               temp+=(I&0X02)<<5;
               temp+=I<<7;
               I=temp;
               k=I;
               temp=J>>7;
               temp+=(J&0X40)>>5;
               temp+=(J&0X20)>>3;
               temp+=(J&0X10)>>1;
               temp+=(J&0X08)<<1;
               temp+=(J&0X04)<<3;
               temp+=(J&0X02)<<5;
               temp+=J<<7;
               J=temp;
               k=k<<8;
               k+=J;
                return k;

             }
     void  PROCESS(void)
        {
         dout=ADRAD();
         res=1000*2.06*dout/(65535.0*0.5*2*1.17);   //增益为1时的放大倍数为1.17*2
         THUN=(int)res/1000;
         HUN=(int)res%1000/100;
         TEN=(int)res%100/10;
         ONE=(int)res%10;
         qw=0X30+THUN;
         bw=0X30+HUN;
         sw=0X30+TEN;
         gw=0X30+ONE;
         lcdmain(qw,bw,sw,gw);
         d=1;
         while(1)
         {
           DM373=tab[THUN];
           WM373=0X01;
           WM373=0X00;
           DM373=tab[HUN];
           WM373=0X02;
           WM373=0X00;
           DM373=tab[TEN];
           WM373=0X04;
           WM373=0X00;
           DM373=tab[ONE];
           WM373=0X08;
           WM373=0X00;
           IE=0X81;
           IP=0X01;
           TCON=0X00;
           P1=0Xf0;
           if(d==0)
           { break;}
          }
        }


     void  measure (void)
            { IP=0X04;
              TCON=0X00;
              a=1;
              SCON=0X00;
              P1_6=0;
              delay10ms(1);
              P1_6=1;
              write_ad7705(0x04);     //选择时钟寄存器
              write_ad7705(0x30);     //送时钟控制命令,晶振选2.4567MHZ,时钟分频
              write_ad7705(0x08);     //选择SET UP寄存器
              write_ad7705(0x22);     //自校准,增益为1,单极性输入,无缓冲模式
              IE=0X84;
              while(a);
              write_ad7705(0x1c);      //选择数据寄存器,并读数据
              SCON=0X10;               //允许接收数据
              PROCESS();
             }

       void clear(void)
       { l=0X10;m=0X10;n=0X10;
         sum=0;
         DAC0832=sum;
         measure();

        }

        void compare(void)
          { I=keyscan();
             switch(I)
             { case 0:
                 {if((l==0x10)&&(m==0x10)) {l=I;}
                  else if(m==0X10) {m=I;}
                  else if(n==0X10) {n=I;}
                 } break;

                case 1:
                 {if((l==0X10)&&(m==0x10) ) l=I;
                  else if(m==0X10) m=I;
                  else if(n==0X10) n=I;
                  } break;

                 case 2:
                 {
                  if((l==0X10)&&(m==0x10)) l=I;
                  else if(m==0X10)  m=I;
                  else if((n==0X10) && (l!=2) )   n=I;
                  } break;

                 case  3:
                 {
                  if(m==0X10  )  m=I;
                  else if(n==0X10)  n=I;
                  } break;


                case  4:
                 {
                  if(m==0X10)
                    { m=I;}
                  else if(n==0X10)  {n=I;}
                  } break;


                case  5:
                 {
                  if(m==0X10 )  m=I;
                  else if(n==0X10)  n=I;
                  }break;


                case  6:
                 {
                  if(m==0X10 )  m=I;
                  else if(n==0X10 )  n=I;
                  }break;

                case  7:
                  {
                   if(m==0X10 )  m=I;
                   else if(n==0X10 )  n=I;
                  }break;

                case  8:
                 {
                  if(m==0X10)  m=I;
                  else if(n==0X10)  n=I;
                  }break;


                case  9:
                 {
                  if(m==0X10 )  m=I;
                  else if(n==0X10)  n=I;
                  }break;

                case  10:
                 {increase();}break;
                case  11:
                 {reduce();}  break;
                case  12:
                 {enter();}   break;
                case  13:
                 {measure();} break;
                case  14:
                 {clear();}   break;
                default:break;
              }

            }

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -