📄 main.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 + -