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

📄 project.c

📁 简易数控直流电源
💻 C
字号:
#include "SPCE061V004.H"
#include "IO_bit.h"
#define dout  IOB3
 #define dclk IOB2
 #define din IOB1
 #define load   IOB0


unsigned int key; 
unsigned int c[10][10]={{0x0000,0x0280,0x0500,0x0780,0x0a00,0x0c80,0x0f00,0x1180,0x1400,0x1680},//*P_DAC1值,对应输出0V至0.9V
                     {0x1900,0x1b80,0x1e00,0x2080,0x2300,0x2580,0x2800,0x2a80,0x2d00,0x2f80},
                     {0x3200,0x3480,0x3700,0x3980,0x3c00,0x3e80,0x4100,0x4380,0x4600,0x4880},
                     {0x4b00,0x4d80,0x5000,0x5280,0x5500,0x5780,0x5a00,0x5c80,0x5f00,0x6180},
                     {0x6400,0x6680,0x6900,0x6b80,0x6e00,0x7080,0x7300,0x7580,0x7800,0x7a80},
                     {0x7d00,0x7f80,0x8200,0x8480,0x8700,0x8980,0x8c00,0x8e80,0x9100,0x9380},
                     {0x9600,0x9880,0x9b00,0x9d80,0xa000,0xa280,0xa500,0xa780,0xaa00,0xac80},
                     {0xaf00,0xb180,0xb400,0xb680,0xb900,0xbb80,0xbe00,0xc080,0xc300,0xc580},
                     {0xc800,0xca80,0xcd00,0xcf80,0xd200,0xd480,0xd700,0xd980,0xdc00,0xde80},
                     {0xe100,0xe380,0xe600,0xe880,0xeb00,0xed80,0xf000,0xf280,0xf500,0xf780}};//对应输出9.0V至9.9V
unsigned int a=0,b=0;
unsigned int uiData=0x00;
unsigned int data;
unsigned int x;
unsigned int m=0;
unsigned int n=0;
unsigned int q=0;

//////////////////////////////////按地址向CH452送数据.
void shjz_ch452(unsigned int ldata,unsigned int hdata)

 { unsigned int i;
  
   for(i=0;i<8;i++)
   {  dclk=0;
    if(ldata&0x0001) din=1;
      else  din=0;
      dclk=1;
      ldata=ldata>>1;
      }
    for(i=0;i<4;i++)
    {dclk=0;
    if(hdata&0x0001) din=1;
     else din=0;
     dclk=1;
     hdata=hdata>>1;
     } 
     load=0;
     load=1;
    }      
////////////////////////////////////////CH452初始化
 ch452_init()
{ shjz_ch452(0x0001,0x0002);
  shjz_ch452(0x0023,0x0004);
  shjz_ch452(0x0080,0x0005); 
} 
 
 
void ADInit(void)
{//IOA口前七位为悬浮输入
   *P_IOA_Dir&=0xff80;
   *P_IOA_Attrib|=0x007f;
   *P_IOA_Data|=0x007f;
   *P_ADC_Ctrl=0x0003;
  
}


/////////////////////////////////////////读键值并返回.
 unsigned int readkey(void)
 {unsigned int key=0,i,com=0x0700;
    for(i=0;i<6;i++)
    { if(com&0x01) din=1;
      else din=0;
      dclk=0;
      dclk=1;
      com>>=1;
     }
    load=0;
     load=1;
   key=key|dout;
   dclk=1;
   dclk=0;
  for(i=0;i<6;i++)
    { key<<=1;
     
     key=key|dout;
    dclk=1;
     dclk=0;
     }
     key=key&0x007f;
     return(key);
     }
//////////////////显示浮点型数
void disp2(unsigned int data)
{unsigned int i,data1;
 unsigned int a[8]={0x8,0x9,0xa,0xb,0xc,0xd,0xe,0xf};
               //b[8]={0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89};
               //显示0.,1.,2.,3.,4.      9.
  ch452_init();
 for(i=4;i<6;i++)
  {data1=data%10;
  shjz_ch452(data1,a[i]);
  data=data/10;
  }shjz_ch452((0x80|data),0xe);//在第2个数码管上显示0.
  }
////////////////////////////////////////////AD转换

void   AD(void)
 { float tem;
   unsigned int buff;
  
 
    ADInit();
    buff=*P_ADC_LINEIN_Data;//开始转换
    while(!(*P_ADC_MUX_Ctrl&0x8000));
    buff=*P_ADC_LINEIN_Data;
    //*P_ADC_Ctrl=	C_ADCN	;//关AD转换
    tem=buff*3.3/0xffc0;
    x=(unsigned int)(tem*300); 
   disp2(x);
   shjz_ch452((b|0x80),0x9);
    shjz_ch452(a,0x8);
  }


////////////////////////////////////////////按键设定

 void key1(void)//预置
  {  a++;
     if(a>9)  {a=0;}
     shjz_ch452(a,0x8);
 
   }

 void key2(void)//个位预置
 {  b++;
    if(b>9)  {b=0;}
    shjz_ch452((b|0x80),0x9);
  
 }

 void key3(void)//输入
 { data=c[b][a];
  *P_DAC1=c[b][a];
  shjz_ch452(0x0d,0xa);
 }


 void key4(void)//清零
 { a=0,b=0;
  *P_DAC1=0;
  shjz_ch452(0x0c,0xa); 
  shjz_ch452(0x80,0x9);
  shjz_ch452(0x00,0x8);
 }


 void key5(void)//步增0。1V
 { 
   a++;
   if(a>9) 
   {a=0;
    b++;
    if(b>9) b=0;
   }
   shjz_ch452((b|0x80),0x9);
   shjz_ch452(a,0x8);
   *P_DAC1=c[b][a];
}

 void key6(void)//步减0。1V
 {
    a--;
    if(!((a>=0)&&(a<=9)))
    { a=9;
      b--;
    if(!((b>=0)&&(b<=9)))  
     b=9;
     }
    shjz_ch452((b|0x80),0x9);
    shjz_ch452(a,0x8);
    *P_DAC1=c[b][a];
 }

 void key7(void)//自动扫描开关
  {	m=1;
  }

 void key8(void)//扫描方向选择
  { n=n^1;
  }



 void key9(void)//三角波
  {m=2;
  }
 void key10(void)//扫描关,三角波停止
 {m=0;
 }
 void key11(void)//A/D转换
 {AD();
 }
////////////////////////////////////////////////////
 void IRQ3(void)__attribute__((ISR));
 void IRQ3(void)
 {
 if(*P_INT_Ctrl&C_IRQ3_EXT2)
  { 
     shjz_ch452(0x0,0x7);
     key = readkey();
     switch(key)
      {case 0x0040:key1();break;
      
       case 0x0041:key2();break;
       
       case 0x0042:key3();break;
       
       case 0x0043:key4();break;
       
       case 0x0044:key5();break;
       case 0x0045:key6();break;
       case 0x0046:key7();break;
       case 0x0047:key8();break;
       case 0x0048:key9();break;
       case 0x0049:key10();break;
      case 0x004a:key11();break;
      /* case 0x004b:key12();break;
       case 0x004c:key13();break;
       case 0x004d:key14();break;
       case 0x004e:key15();break;
       case 0x004f:key16();break; */
       default:break;
    }
 *P_INT_Clear=C_IRQ3_EXT2;
 }
 else if(*P_INT_Ctrl&C_IRQ3_EXT1)
    *P_INT_Clear=C_IRQ3_EXT1;
    
    else
    *P_INT_Clear=C_IRQ3_KEY;
    }
    
///////////////////////////////////////////////////
void IRQ1(void)__attribute__((ISR));
void IRQ1(void)
{ if(n==0)  
   {  a++;
       if(a>9) 
       { a=0;
         b++;
         if(b>9) b=0;
     }
     shjz_ch452((b|0x80),0x9);
     shjz_ch452(a,0x8);
     *P_DAC1=c[b][a];
   }
 else
   { a--;
      if(!((a>=0)&&(a<=9)))
       { a=9;
         b--;
         if(!((b>=0)&&(b<=9)))   b=9;
       }
       shjz_ch452((b|0x80),0x9);
       shjz_ch452(a,0x8);
       *P_DAC1=c[b][a];
    }  
      *P_INT_Clear=	C_IRQ1_TMA   ;
}

///////////////////////////////////////

main()
{  unsigned int i;
   float fVoltage=0.0;
   hardware();
  
  
  ch452_init();
  shjz_ch452(0x80,0x9);
  shjz_ch452(0x00,0x8);//在第7。8位上显示0.0
 
  *P_DAC_Ctrl=C_DA1_Direct; 
  *P_ADC_MUX_Ctrl=C_ADC_CH1; //LINE_IN-------IOA0  
  *P_ADC_Ctrl= C_ADCE; //
   
  while(1)
  {
  	if(m==1)
   		*P_INT_Ctrl=C_IRQ1_TMA+C_IRQ3_EXT2 ;
  	if(m==0)
  		*P_INT_Ctrl=C_IRQ3_EXT2 ;
  	if(m==2) 
  	{   
    	while(1)
      	{  
      		
       		while(uiData!=0xffc0)
        	{
        		*P_DAC1=uiData;
          		uiData+=0x0040;
       		}
         	while(uiData!=0)
         	{
         		*P_DAC1=uiData; 
          		uiData-=0x0040;
        	}
         	if(m==0) break; 
         	*P_Watchdog_Clear=1;
    	}  
    } 
    *P_Watchdog_Clear=1;
}
}

⌨️ 快捷键说明

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