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

📄 main.c

📁 本系统是以凌阳SPCE061A单片机为核心控制器
💻 C
字号:
//=========================================================================================
//作    者:华侨大学 张维纬  叶媲舟 刘灿
//题    目:数控直流恒流源
//备    注:
//         2005年全国大学生电子竞赛
//=========================================================================================
#include "SPCE061V004.H"
#include "lab_parameter.h"
char b0="0",b1="1",b2="2",b3="3",b4="4",b5="5",b6="6",b7="7",b8="8",b9="9",b=".";
char bb ,*p=0;
unsigned  int k0=0,u=0,a11=0,a22=0,a33=0,b11=0,b22=0,b33=0;
extern shu;      //数
extern kong;     //控
extern heng;     //恒
extern liu;      //流
extern yuan;     //源
extern shi;      //实
extern ji;       //际
extern ce;       //测
extern liang;    //量
extern yu;       //预
extern xian;     //先
extern she;      //设
extern ding;     //定
unsigned int key_value=0,ooo=0,tm0=0,tm1=0,tm2=0,tm3=0,tm[4]={0};
int key=0,i=0,value_h=0,j=0,k=0;
unsigned long int key_in_value=2000,j0=0,binary=0,xx=0;
unsigned int key_in[10]={0},key_i=0;
unsigned int Da_data1=0x7ee0,Da_data2=0x7ee0,Da_data_flag=0,Ad_data=0;
float Ad_data_f=0,Data_f=0,Data_i_f=0;
float n=3.47,Ns=2.7285,Nb=30,R=0.334;//R=0.3157;

//=========================================================================================
//
//=========================================================================================
unsigned int get_key_value(void)
{ 
   SP_Init_IOB(0x0f00,0x0f00,0x0f00); //设置IOA8—IOA11为高电平输出,设置IOA12—IOA15为低电平输入
   for(i=0;i<3;i++)                   //在时钟频率为49M时,延时1us使IO口能反应过来
      *P_Watchdog_Clear = 1;     
   if(*P_IOB_Data & 0xf000 )          //如果有键值
   { 
       for(i=0;i<0x3c00;i++)          //在时钟频率为49M时,延时15ms去抖
          *P_Watchdog_Clear = 1;
       if(*P_IOB_Data & 0xf000)       //如果真有键值 
        {
           value_h = *P_IOB_Data & 0xf000 ; 
           SP_Init_IOB(0xf000,0xf000,0xf000); //设置IOA8—IOA11为低电平输入,设置置IOA12—IOA15为高电平输出
           for(i=0;i<3;i++)               //在时钟频率为49M时,延时1us使IO口能反应过来
              *P_Watchdog_Clear = 1;         
           key = *P_IOB_Data & 0x0f00 ; 
           key = value_h | key;
           while( *P_IOB_Data & 0x0f00) 
              *P_Watchdog_Clear = 1;           //等待弹起
           return key;
        }
        return 0x0000;
     }    
     return 0x0000;
     *P_Watchdog_Clear = 1;
}

//=========================================================================================
//
//=========================================================================================
void key_scan(void)
{
    ooo = get_key_value();
    switch( ooo )
    {
       case 0x8100:  key_value = 0;//0
               key_in[key_i] = key_value; 
               key_i += 1;
               break;  
       case 0x4100:  key_value = 1;//1
               key_in[key_i] = key_value;
               key_i += 1;  
               break;  
       case 0x2100:  key_value = 2;//2
               key_in[key_i] = key_value; 
               key_i += 1; 
               break; 
       case 0x1100:  key_value = 3;//3
               key_in[key_i] = key_value;
               key_i += 1;   
               break;  
       case 0x8200:  key_value = 4;//4 
               key_in[key_i] = key_value;
               key_i += 1;
               break;  
       case 0x4200:  key_value = 5;//5
               key_in[key_i] = key_value;
               key_i += 1;  
               break;  
       case 0x2200:  key_value = 6;//6
               key_in[key_i] = key_value;
               key_i += 1; 
               break;  
       case 0x1200:  key_value = 7;//7 
               key_in[key_i] = key_value;
               key_i += 1;
               break;  
       case 0x8400:  key_value = 8;//8
               key_in[key_i] = key_value; 
               key_i += 1; 
               break;  
       case 0x4400:  key_value = 9;//9 
               key_in[key_i] = key_value;
               key_i += 1;  
               break;  
       case 0x2400:  key_value = 10;//10 输入数值确认功能键
               key_in_value=0;
               for(j=0,j0=1;j<key_i;j++,j0*=10)
                  key_in_value += key_in[key_i-j-1]*j0;
                   
               Da_data1 = 32.283*key_in_value;  //0xffc0/2160=30.283
               Da_data2 = 32.283*key_in_value;  
               key_i = 0;
               break;  
       case 0x1400:  key_value = 11;//11 
               
               break;  
       case 0x8800:  key_value = 12;//12 步进 "+"
               if(Da_data_flag)
               {  
                  if(Da_data1<0xffc0)  //0xfd40=0xffc0-64*10
                  {
                     Da_data1 += 64;
                     key_in_value +=1;
                  }   
                  Da_data_flag = 0;
               }
               else
               {   
                  if(Da_data2<0xffc0)  //0xfd40=0xffc0-64*10
                  {
                     Da_data2 += 64; //第七位加1步进1mv;临时乘10方便调试步进10mv
                      key_in_value +=1;
                  }   
                  Da_data_flag = 1;
               }   
               break;  
       case 0x4800:  key_value = 13;//13 步进 "-"
               if(Da_data_flag)
               {
                  if(Da_data1>0x0280)
                  {
                     Da_data1 -= 64;
                     key_in_value -=1;
                  }   
                  Da_data_flag = 0;
               }
               else
               {  
                  if(Da_data2>0x0280)
                  { 
                     Da_data2 -= 64; //第七位加1步进1mv;临时乘10方便调试步进10mv
                      key_in_value -=1;
                  }   
                  Da_data_flag = 1;
               }   
               break;  
       case 0x2800:  key_value = 14;//14
               if(Da_data_flag)
               {  
                  if(Da_data1<0xffc0)  //0xfd40=0xffc0-64*10
                  {
                     Da_data1 += 64*10;
                     key_in_value +=10;
                  }   
                  Da_data_flag = 0;
               }
               else
               {   
                  if(Da_data2<0xffc0)  //0xfd40=0xffc0-64*10
                  {
                     Da_data2 += 64*10; //第七位加1步进1mv;临时乘10方便调试步进10mv
                      key_in_value +=10;
                  }   
                  Da_data_flag = 1;
               }   
 
               break;  
       case 0x1800:  key_value = 15;//15
               if(Da_data_flag)
               {
                  if(Da_data1>0x0280)
                  {
                     Da_data1 -= 64*10;
                     key_in_value -=10;
                  }   
                  Da_data_flag = 0;
               }
               else
               {  
                  if(Da_data2>0x0280)
                  { 
                     Da_data2 -= 64*10; //第七位加1步进1mv;临时乘10方便调试步进10mv
                      key_in_value -=10;
                  }   
                  Da_data_flag = 1;
               }    
           
               break;  
       default:          
               break;  
    }
}

//=========================================================================================
//
//=========================================================================================
void LCD_ini(void)
{
   	Init_sys();	
	FG_InitGraphic();
	FG_ClearScreen(0);
	FG_SetBMPMode(DG_BMP_COVER);		//设置位图模式    函数定义在Splc501sys.asm

	FG_PutBitmap(&shu,127-24,48);   	//显示汉字  函数定义在Splc501sys.asm
    FG_PutBitmap(&kong,127-24-16,48); 	//显示汉字  函数定义在Splc501sys.asm
    FG_PutBitmap(&heng,127-24-16*2,48);
    Clear_Watch_Dog();
    FG_PutBitmap(&liu,127-24-16*3,48);
    FG_PutBitmap(&yuan,127-24-16*4,48);
    
    FG_PutStr("--HuaQiao university",0,105,20);
    for(j=0;j<=30;j++)           	//延时 
          for(i=0;i<0xffff;i++)
      	     Clear_Watch_Dog();
    
    //FG_ClearScreen(0);  	      
    //FG_PutStr(".",0,128-x,y);
}

//=========================================================================================
//
//=========================================================================================
void fenli(void)
{
        tm3=(binary/1000)%10;
        tm2=(binary/100)%10;
        tm1=(binary/10)%10;
        tm0=binary%10;
        tm[0]=tm0;
        tm[1]=tm1;
        tm[2]=tm2;
        tm[3]=tm3;
}

//=========================================================================================
//
//=========================================================================================
void show(void)
{
   FG_ClearScreen(0);
   FG_PutBitmap(&yu,127,64);
   FG_PutBitmap(&xian,127-16,64);
   FG_PutBitmap(&she,127-16*2,64);
   FG_PutBitmap(&ding,127-16*3,64);
   FG_PutStr(":",3,127-16*4,60);
   for(i=0;i<4;i++)
   {
      bb=*(&b0 + tm[i]);		
		FG_PutStr(bb,3,(i+1)*10+27,45); 
   }
   FG_PutStr("mA",3,25,45); 
}

//=========================================================================================
//
//=========================================================================================
show1()
{
   FG_PutBitmap(&shi,127,32);
   FG_PutBitmap(&ji,127-16,32);
   FG_PutBitmap(&ce,127-16*2,32);
   FG_PutBitmap(&liang,127-16*3,32);
   FG_PutStr(":",3,127-16*4,28);
   for(i=0;i<4;i++)
   {
      bb=*(&b0 + tm[i]);		
		FG_PutStr(bb,3,(i+1)*10+27,13); 
   }
   FG_PutStr("mA",3,25,13); 
   //for(i=0;i<0xffff;i++)
      	 Clear_Watch_Dog(); 
}

//=========================================================================================
//主函数
//=========================================================================================
main()
{
   *P_SystemClock = C_Fosc + C_32K_Work + C_StrongMode + C_Fosc_49M;
   LCD_ini();
   *P_IOA_Dir =	0xfff0;			
   *P_IOA_Attrib = 0xfff0;	
   *P_IOA_Data	= 0x0000;
   *P_IOB_Dir =	0xffff;			
   *P_IOB_Attrib = 0xffff;	
   *P_IOB_Data	= 0x0000;
   *P_DAC_Ctrl = C_DA1_Direct;
   *P_ADC_Ctrl = 1;
   *P_ADC_MUX_Ctrl = 1;
   Ad_data = *P_ADC_LINEIN_Data;

   ///////////////////
   while(1)
   {
      key_scan();
      *P_IOA_Dir =	0xfff0;			
      *P_IOA_Attrib = 0xfff0;	
      *P_IOA_Data	= 0x0000;
      *P_IOB_Dir =	0xffff;			
      *P_IOB_Attrib = 0xffff;	
      *P_IOB_Data	= 0x0000;
      /////////////////////
      //Da_data1 = 32.283*key_in_value;  
      //Da_data2 = 32.283*key_in_value;
      //////////////////////////////////////////////
     if(Data_i_f*1000 < key_in_value-3)
      {
         Da_data1 += 64;
         Da_data2 += 64;
      }
      if(Data_i_f*1000 > key_in_value+3)
      {
         Da_data1 -= 64;
         Da_data2 -= 64;
      }
      *P_DAC1 = Da_data1;
      *P_DAC2 = Da_data2;
      ///////////////////////////////////////////////
      
      /////////////////////
      while(!(*P_ADC_MUX_Ctrl&0x8000))
         *P_Watchdog_Clear = 1;
      Ad_data = *P_ADC_LINEIN_Data;
      Ad_data_f = (float)Ad_data/0xffc0*3.472;
      ////////////////////////////////////////
      Data_f = Ad_data_f / n;
      Data_i_f = Data_f / R;
      if(Data_i_f < 1)
         Data_i_f = Data_f / R;
      /////////////////////////////////////////
      if(xx==2500)
      {
         binary = key_in_value;
         fenli();
         show();
         binary = Data_i_f*1000;
         fenli();
         show1();
         *P_IOA_Dir =	0xfff0;			
         *P_IOA_Attrib = 0xfff0;	
         *P_IOA_Data = 0x0000;
         *P_IOB_Dir =	0xffff;			
         *P_IOB_Attrib = 0xffff;	
         *P_IOB_Data	= 0x0000;
         xx = 0;
      }
      xx += 1;   
      /////////////////////
      *P_Watchdog_Clear = 1;
   }
}

⌨️ 快捷键说明

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