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

📄 main.c

📁 暑假做的直流电源的程序,能实现分级调控输出,并在数码管显示
💻 C
字号:
//=========================================================================================================
//名称:数控直流电源
//系统:基于凌阳61板SPCE061A
//日期:2006年7月
//功能:ioa8-15作为键盘输入,iob0-7作为LED数码管的段码控制,iob8-10作为数码管的位码控制,
//      ADC通道LINE_IN为IOA2
//其他模块:4*4标准键盘,8位数码管
//=========================================================================================================
#include "hardware.h"
#define KS1   1 
#define KS2   2 
#define KS3   3 
#define KS4   4 
#define KS5   5 
#define KS6   6 
#define KS7   7 
#define KS8   8 
#define KS9   9 
#define KS10  10 
#define KS11  11 
#define KS12  12 
#define KS13  13 
#define KS14  14 
#define KS15  15 
#define KS16  16 
#define LEDLENTH 2
#define  HaveKey  1
#define  NoKey    0
#define  REF_VOLTAGE    10       //AD7524的参考电压
#define  ENLAGE_TIMES   1       //DAC转化之后放大的倍数
extern AD_DATA;	//保存转换的十位adc数据
unsigned F_Get_Key();
void DAC_Output(unsigned int);
void LOAD_AD(void);
void System_Initial();
void SP_INT_128Hz();
void F_Show_Extra();
void LED_Display();
void DA_Control();
void delay(void);
void TriAngle(unsigned int);
void JuXing(unsigned int );
void Auto_Scan();
void F_ClearWatchdog(void);
void Key_Treat(void);
unsigned int KeyFlag;
unsigned int key_value;
unsigned int  led[8];
unsigned int i,j,k,SYS_MODE,Auto_Scan_ENA;
unsigned int DA_Data,DA_Data_Buffer,Step_Data;
float V_RET,V_CTL,V_Dif,V_CTL_Buffer;
int main(void)
{	
	System_Initial();      //系统赋值初始化
	SP_INT_128Hz();        //中断初始化
    for(j=0;j<LEDLENTH;j++)//显示初始化
	 led[j]=0;
	i=0;				   //变量初始化
	j=0;
	k=0;
	AD_DATA=0;
	DA_Data=0;
	Step_Data=0;
	DA_Data_Buffer=0;
	SYS_MODE=0;
	Auto_Scan_ENA=0;
	V_RET=0;
	V_CTL=0;
	V_Dif=0;
	V_CTL_Buffer=0;
//	led[0]=9;    			//仿真用
//	led[1]=9;				//仿真用
//  SYS_MODE=1;				//仿真用
//	Auto_Scan_ENA=1;		//仿真用
//	Step_Data=0x0001;		//仿真用

	while (1)              //主循环开始
	  {		
	   	        Key_Treat();					   //按键处理
		 /*       LOAD_AD();						   //AD转换
		    									   //计算
			     V_RET=AD_DATA*1024/3.3;           //输出端采样电压
			     V_RET*=3;					       //扩大3倍
			     V_CTL=led[0]*10+led[1];		   //控制拟定输出电压
			     V_Dif=V_RET-V_CTL;                //实际输出值与控制值之差
		    //////////////////////控制DA转换输出,使输出电压和控制电压相匹配
		         if(V_Dif>0.1) {if(DA_Data>0) DA_Data--;}
		         if(V_Dif<-0.1){DA_Data++;}
		         DAC_Output(DA_Data);   */
		       if(SYS_MODE==0)  
		          {  
		             if(Auto_Scan_ENA==1)	{ LED_Display(); Auto_Scan();}
		                 DA_Control();
		          }
		       else if(SYS_MODE==1)
		           {Auto_Scan_ENA=0;
		           led[0]=1;
		           led[1]=0x000e;
		           TriAngle(Step_Data);}  
		       else 
		           {
		           Auto_Scan_ENA=0;
		           led[0]=2;
		           led[1]=0x000e;
		           JuXing(Step_Data );}
		   /*  //////////////////////显示扫描    
		 
			
		       if(i>=LEDLENTH)  i=0;
		       F_Show(i,led[i]);
		       if(i==0)            //在第一位后加小数点
		       F_Show_Extra();
		       i++;*/
		   	LED_Display();	
		   	if(Auto_Scan_ENA==1)
		   	   {
		   	    delay();
		   	   }	    
		  F_ClearWatchdog();    //清看门狗
	   }
}

//==============================================================================================
//函数:Key_Treat();
//语法:void Key_Treat(void);
//功能:按键处理
//返回:无
//===============================================================================================
void Key_Treat()
{
        while(KeyFlag == HaveKey)              //始终判断有无按键
		        {
		              key_value= F_Get_Key();  //获取键值,0~15对应ks1~ks16
		              KeyFlag = NoKey;         //清除按键标志
	    
 	                      switch(key_value)    //对不同的按键的处理,0~15对应ks1~ks16
		                           {
		                             case KS1:{ if(led[0]>=9)  led[0]=0; else led[0]++;break;}
		                             case KS2:{ if(led[0]<=0)  led[0]=9; else led[0]--;break;}
		                             case KS3:{ if(led[1]>=9)  led[1]=0; else led[1]++;break;}
		                             case KS4:{ if(led[1]<=0)  led[1]=9; else led[1]--;break;}
		                             case KS5:{ if(SYS_MODE>=2) SYS_MODE=0;else SYS_MODE++;break;}
		                             case KS6:{ if(	Auto_Scan_ENA>=1) Auto_Scan_ENA=0;else Auto_Scan_ENA++;
		                                         break;}
		                           
		                             case KS7: { if(Step_Data>=0xffff) Step_Data=0;
		                                        else Step_Data=Step_Data+100;break;}
		                             case KS8: { if(Step_Data<=0x0000) Step_Data=0xffff;
		                                        else Step_Data=Step_Data-100;break;}
		                             case KS9: { if(Step_Data>=0xffff) Step_Data=0;
		                                        else Step_Data=Step_Data+10;break;}
		                             case KS10: { if(Step_Data<=0x0000) Step_Data=0xffff;
		                                        else Step_Data=Step_Data-10;break;}
		                             case KS11: { if(Step_Data>=0xffff) Step_Data=0;
		                                        else Step_Data=Step_Data+1;break;}
		                             case KS12: { if(Step_Data<=0x0000) Step_Data=0xffff;
		                                        else Step_Data=Step_Data-1;break;}
		                             case KS13:{ 
		                                        led[0]=0;
		                             			led[1]=0;
		                             			DA_Data=0;
		                             			Step_Data=0;
												DA_Data_Buffer=0;
												SYS_MODE=0;
												Auto_Scan_ENA=0;
												V_RET=0;
												V_CTL=0;
												V_CTL_Buffer=0;
												break;}
		                             default: break;
		                            }
		         }
}		      
//=====================================================================================================
//函数:DA_Control()
//语法:void DA_Control()
//功能:实现对外部AD7524输入数字信号的控制
//返回:无
//=====================================================================================================
void DA_Control()
{  unsigned int *P_IOA_Data,*P_IOB_Data;
   unsigned int temp=0;
   P_IOA_Data=Port_IOA_Data;
   P_IOB_Data=Port_IOB_Data;
   V_CTL=led[0]+led[1]*0.1;				//预制电压
   if((V_CTL!=V_CTL_Buffer) | (V_CTL_Buffer==0))
      { 
       /* if(V_CTL<1.8 && V_CTL>0.8)			//非线性调整
            V_CTL=V_CTL*1.12;
        else if(V_CTL>7.8)
        	V_CTL=V_CTL/1.015;*/                                                                                               
        	
        	
        V_CTL_Buffer=V_CTL;		
        temp=*P_IOB_Data & 0x3fff;			//设定iob14-15为低电平,AD7524处于写状态
        *P_IOB_Data=temp | 0x0000;			
        V_CTL=V_CTL/ENLAGE_TIMES;			//除以放大倍数
        DA_Data=V_CTL*256/REF_VOLTAGE;//计算出控制值
        DA_Data_Buffer=DA_Data;
        DA_Data=DA_Data & 0x00ff;			//取低8位
        temp=*P_IOA_Data ;					//保存ioa高8位数据
        temp=temp & 0xff00;				
        *P_IOA_Data=temp|DA_Data;			//将控制AD7524的8位数据传送到ioa
 	   }
    else
       {
        temp=*P_IOB_Data & 0xbfff;			//设定iob15为高电平,AD7524处于保持状态
        *P_IOB_Data=temp | 0x8000;	
        DA_Data_Buffer=DA_Data_Buffer & 0x00ff;		//取低8位
        temp=*P_IOA_Data ;					        //保存ioa高8位数据
        temp=temp & 0xff00;				
        *P_IOA_Data=temp|DA_Data_Buffer;			//将控制AD7524的8位数据传送到ioa		
       }  
}
//========================================================================================================
//void LED_Display();
//========================================================================================================

void LED_Display()
  {
               if(i>=LEDLENTH)  i=0;
		       F_Show(i,led[i]);
		       if(i==0)            //在第一位后加小数点
		       F_Show_Extra();
		       i++;
  }

⌨️ 快捷键说明

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