12
本科生课程设计(论文)
第3章 系统软件设计
3.1 程序流程
系统上电后首先应该对各个应用模块进行初始化,初始化完毕后对键盘输入模块进行扫描输入,使用者可以根据的实际需求进行定子电压、定子电流、工作温度、工作转速的报警值进行设置,在显示模块LCD12864ZW上显示对应的数据。键盘设定结束后系统开始工作,进行3路AD采样及1路脉冲累加计数处理,对应的处理结果和操作者设置的值做比较如果小于设置报警值,则系统不作出行为,继续采样;若大于设定报警值,则系统会跳到报警步骤,报警后若使用者不消除报警(即关闭电机或者手动降低电机相关工作参数)则系统会持续的报警直至使用者消除报警为止。设计的系统流程图如图3.0所示。
图3.0系统流程图
12
13
本科生课程设计(论文)
XS128对应的编程文件如下:
/*******************头文件**********************/ #include
/***********总线时钟倍频设置此次设置为48MHZ***********/ void SetBusCLK_48M(void) {
CLKSEL=0x00; PLLCTL_PLLON=1; SYNR=0XC0 | 0X05; REFDV=0X80 | 0X01; POSTDIV=0X00; _asm(nop); _asm(nop);
while(0==CRGFLG_LOCK);//锁相环锁定 CLKSEL_PLLSEL=1;//选定外部时钟 }
3.2 各模块程序设计
3.2.1 3路AD模拟采样程序
/************** AD模块初始化程序*******************/ void ADC_Init(void) { ATD0CTL0=0x07; ATD0CTL1=0xc0; ATD0CTL2=0x40; ATD0CTL3=0xB0;
ATD0CTL4=0xa8; ATD0CTL5=0x30; ATD0DIEN=0x00; }
/**************** AD模块采样程序*******************/ void lightAverage(void)
13
14
本科生课程设计(论文)
{ ulong V_Realsum=0,I_Realsum=0,Tem_Realsum =0;int i; for(i=1;i<=50;i++) //算数平均值滤波法 { while(!ATD0STAT0_SCF); //等待转换完成 //累加求和// V_Realsum += ATD0DR0; I_Realsum += ATD0DR1; Tem_Realsum += ATD0DR2; }
V_Real = V_Realsum/50; I_Real= I_Realsumsum/50; Tem_Real=Tem_Realsum/50; }
3.2.2 1路脉冲累加程序
/****************PIT模块初始化*******************/ void PIT_Init(void) { PITCFLMT_PITE=0; PITCE_PCE0=1; PITMTLD0=199; PITLD0=159; PITINTE_PINTE0=1; PITCFLMT_PITE=1; }
/****************中断脉冲计数*******************/ #pragma CODE_SEG __NEAR_SEG NON_BANKED void interrupt 8 Timer0_Onput(void) { s++;
TFLG1 |= 0x02; }
#pragma CODE_SEG DEFAULT
3.2.3 4个独立键盘程序
/******************独立键盘程序******************/
14
15
本科生课程设计(论文)
void KeyProcess()
{ if(K1==0) {Delay_ms(10); if(K1==0)
{ while(!K1); }
}
//延时去抖
if(K2==0) {Delay_ms(10); if(K2==0)
{ while(!K2); }
} {
Delay_ms(10); //延时去抖 {
while(!K3);
//等待K3键释放
if(K3==0)
//延时去抖
if(K3==0)
}
//K4键是确认键 //延时去抖 //等待K4键释放
}
if(K4==0) } } }
{
Delay_ms(10); if(K4==0) {while(!K4);
3.2.4 矩阵键盘程序
/******************矩阵键盘程序******************/ void keyscan()
15
16
本科生课程设计(论文)
{ //需提前定义XS123PB4~PB7口作为绝阵键盘的接受I/0口// // scan1为PB口定义变量//
if((scan1&0xf0)!=0xf0) //判键是否按下 { delayms(30); //延时30ms if((scan1&0xf0)!=0xf0) //二次判键是否按下 { POPTB=0x0f; scan2= POPTB;
keycode=scan1|scan2; //组合成键编 for(j=0;j<=15;j++) {
if(keycode== key_code[j]) { key=j; return(key); } } } }
else POPTB =0xff; return (16); }
Void keydown(void) {
POPTB =0xf0;
if((POPTB &0xf0)!=0xf0) {
keyscan(); } }
3.2.5 LCD12864显示程序
/******************显示程序******************/ //定义显示数组//
uchar const IC_DAT[]={\电机运行状态监测\
16