数控直流电流源仿真不出来,急的不行,可以有偿服务

2019-07-18 12:14发布

按设计要求用ADC0809,但proteus里没有这个模型,用的ADC0808,仿真不出来,截了三个图,弟弟我弄的头都蒙了,真心求解救
软件程序
#include <reg52.h>#include <intrins.h>#include <absacc.h> #define uchar unsigned char#define uint unsigned int sbit rs=P3^5;sbit wr=P3^6;sbit lcden=P3^4;sbit WR12=P2^1;sbit CS=P2^0;sbit CLK=P3^1;sbit DIO=P3^2;sbit CS1=P3^3; uchar table1[]="input";uchartable2[]="0000MA";//uchartable3[]="output";//uchar table4[]="MA";//uchartable3[]="0000";uchar keyflag;//进入中断标志uchar c;//数组位置bit set,jia,jian,right;//四个按键uchar m;//K1按下次数的标志uchar keyvalue;sbit k1=P2^2;sbit k2=P2^3;sbit k3=P2^4;sbit k4=P2^5;//uchar s;//总数 void delay(uint x){       uinta,b;       for(a=x;a>0;a--)              for(b=10;b>0;b--);}void delay20ms(void)   //误差0us{    unsigned char a,b;    for(b=215;b>0;b--)        for(a=45;a>0;a--);  // _nop_;  //if Keil,require useintrins.h //  _nop_;  //if Keil,require use intrins.h} void delay1(uint x){                                                             uinta,b;       for(a=x;a>0;a--)              for(b=100;b>0;b--);} void write_com(uchar com){       P0=com;       rs=0;       lcden=0;       delay(10);       lcden=1;       delay(10);       lcden=0;       } void write_date(uchar date){       P0=date;       rs=1;       lcden=0;       delay(10);       lcden=1;       delay(10);       lcden=0;       } void init(){        wr=0;       write_com(0x38);       delay(20);       write_com(0x0c);       delay(20);//     write_com(0x06);//     delay(20);       write_com(0x01);       delay(20);      }void keyscan(){       if(k1==0)       {              delay20ms();              if(k1==0)              {     while(!k1);                     keyvalue=1;                     set=1;                     m++;              }       }       if(k2==0)       {              delay20ms();              if(k2==0)              {     while(!k2);                     keyvalue=2;                     right=1;              }       }       if(k3==0)       {              delay20ms();              if(k3==0)              {     while(!k3);                     keyvalue=3;                     jia=1;              }       }       if(k4==0)       {              delay20ms();              if(k4==0)              {     while(!k4);                     keyvalue=4;                     jian=1;              }       }}//ad采集并返回 unsigned char  A_D(){ unsigned char i,dat;  CS1=1;   //一个转换周期开始  CLK=0;  //为第一个脉冲作准备  CS1=0;  //CS0,片选有效   DIO=1;    //DIO1,规定的起始信号    CLK=1;   //第一个脉冲  CLK=0;   //第一个脉冲的下降沿,此前DIO必须是高电平  DIO=1;   //DIO1通道选择信号    CLK=1;   //第二个脉冲,第23个脉冲下沉之前,DI必须跟别输入两位数据用于选择通道,这里选通道CH0  CLK=0;   //第二个脉冲下降沿  DIO=0;   //DI0,选择通道0  CLK=1;    //第三个脉冲  CLK=0;    //第三个脉冲下降沿  DIO=1;    //第三个脉冲下沉之后,输入端DIO失去作用,应置1  CLK=1;    //第四个脉冲  for(i=0;i<8;i++)  //高位在前    {      CLK=1;         //第四个脉冲     CLK=0;       dat<<=1;       //将下面储存的低位数据向右移              dat|=(unsignedchar)DIO;        //将输出数据DIO通过或运算储存在dat最低位    }                            CS1=1;          //片选无效        return dat;  //将读书的数据返回      } void main(){       uchara,s,q=0,w=0,e=0,r=0,aa,bb;       uintcc;//cc=(1000*table2[0]+100*table2[1]+10*table2[2]+table2[3])*3/255;                     CS=0;        WR12=0;       init();            write_com(0x80+0x00);          delay(20);       for(a=0;a<5;a++)       {       write_date(table1[a]);       delay(20);                   }       write_com(0xc0+0x00);       delay(50);       for(a=0;a<6;a++)       {       write_date(table2[a]);       delay(40);                   }       /*    write_com(0x80+0x08);       delay(50);       for(a=0;a<6;a++)       {       write_date(table3[a]);       delay(40);                   }                     write_com(0xc0+0x08);       delay(50);       for(a=0;a<6;a++)       {       write_date(table4[bb]);       delay(40);                   }*/                                                                                      while(1)       {                            keyscan();              if((keyvalue==1)&&(m%2==1))              {                    write_com(0xc0+0x00);                    write_com(0x0f);              }              elseif((keyvalue==1)&&(m%2==0))              {                    write_com(0x0c);              }               if(set==1)              {                     switch(keyvalue)                     {                            case2:c++;                                                    if(c==4)                                                 {                                                        c=0;                                                 }                                          write_com(0xc0+0x00+c);                                          write_com(0x0f);                                          break;                            case3:table2[c]++;                                          if(table2[c]>'9')                                          {                                                 table2[c]='0';                                          }                                          //table3[c]++;                                                                                    if(c==0)                                          {                                            q++;                                          }                                                 if(c==1)                                          {                                            w++;                                          }                                                 if(c==2)                                          {                                            e++;                                          }                                                 if(c==3)                                          {                                            r++;                                          }                                            write_com(0xc0+0x00+c);                                          write_date(table2[c]);                                          write_com(0xc0+0x00+c);                                          write_com(0x0f);                                   break;                            case4:   table2[c]--;                                          if(table2[c]<'0')                                          {                                                 table2[c]='9';                                          }                                           //table3[c]--;                                          if(c==0)                                          {                                            q--;                                          }                                                 if(c==1)                                          {                                            w--;                                          }                                                 if(c==2)                                          {                                            e--;                                          }                                                 if(c==3)                                          {                                            r--;                                          }                                               write_com(0xc0+0x00+c);                                          write_date(table2[c]);                                          write_com(0xc0+0x00+c);                                          write_com(0x0f);                                   break;                     }                     keyvalue=0;              }                      cc=(1000*q+100*w+10*e+r);         //mm=cc*33.5;         //s=(uchar)(mm>>8);         s=(uchar)(cc*0.180);        // CS=1;         P1=s;         aa=A_D();         bb=aa;         if(bb>cc)           s--;         else if(bb<cc )                                           s++;                                                                             } }
用的ADC0809 用的ADC0809
用的ADC0808 用的ADC0808
图
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。