📄 main.c
字号:
#include <hidef.h> /* common defines and macros */
#include <mc9s12c32.h> /* derivative information */
#include "main.h"
#define Baud9600 6000000/9600/16
#define Baud19200 6000000/19200/16
#define Baud38400 6000000/38400/16
#define Baud115200 6000000/115200/16
#pragma LINK_INFO DERIVATIVE "mc9s12c32"
#pragma DATA_SEG Fuzzy_Var
uchar CURRENT_INS[2];
uchar FUZ_INS[12];
uchar FUZ_OUTS[3];
uchar SGLTN_POS[3];
uchar COG_OUTS[2];
uchar SUM_OF_FUZ[2];
uchar SUM_OF_PROD[2];
uchar COGDEX;
uchar OLP_COUNT;
uchar SUMDEX;
#pragma CONST_SEG Fuzzy_Table
const uchar speed_degree[7]={0,0,20,45,65,80,90};
uchar car_speed_mf[20]; //car_speed_mf[5][4]
/*const uchar gear2[8]={0,10,15,20,23,26,30,35};
const uchar gear3[8]={0,10,15,20,23,26,30,35};
const uchar gear4[8]={0,10,15,20,23,26,30,35};
const uchar gear5[8]={0,10,15,20,23,26,30,35};*/
const uchar SPEED_MFS[5][20]={//SPEED_MFS[5][5][4]
0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,
};
const uchar GAS_MFS[7] = {
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF
};
const uchar OUTPUT_MFS[5][12]= {
0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,
};
const uchar RULE_START[5][35]= {
0xFF,0xFF,0xFF,0xFF,0xFE,
0xFF,0xFF,0xFF,0xFF,0xFE,
0xFF,0xFF,0xFF,0xFF,0xFE,
0xFF,0xFF,0xFF,0xFF,0xFE,
0xFF,0xFF,0xFF,0xFF,0xFE,
0xFF,0xFF,0xFF,0xFF,0xFE,
0xFF,0xFF,0xFF,0xFF,0xFE,
0xFF,0xFF,0xFF,0xFF,0xFE,
0xFF,0xFF,0xFF,0xFF,0xFE,
0xFF,0xFF,0xFF,0xFF,0xFE,
0xFF,0xFF,0xFF,0xFF,0xFE,
0xFF,0xFF,0xFF,0xFF,0xFE,
0xFF,0xFF,0xFF,0xFF,0xFE,
0xFF,0xFF,0xFF,0xFF,0xFE,
0xFF,0xFF,0xFF,0xFF,0xFE,
0xFF,0xFF,0xFF,0xFF,0xFE,
0xFF,0xFF,0xFF,0xFF,0xFE,
0xFF,0xFF,0xFF,0xFF,0xFE,
0xFF,0xFF,0xFF,0xFF,0xFE,
0xFF,0xFF,0xFF,0xFF,0xFE,
0xFF,0xFF,0xFF,0xFF,0xFE,
0xFF,0xFF,0xFF,0xFF,0xFE,
0xFF,0xFF,0xFF,0xFF,0xFE,
0xFF,0xFF,0xFF,0xFF,0xFE,
0xFF,0xFF,0xFF,0xFF,0xFE,
0xFF,0xFF,0xFF,0xFF,0xFE,
0xFF,0xFF,0xFF,0xFF,0xFE,
0xFF,0xFF,0xFF,0xFF,0xFE,
0xFF,0xFF,0xFF,0xFF,0xFE,
0xFF,0xFF,0xFF,0xFF,0xFE,
0xFF,0xFF,0xFF,0xFF,0xFE,
0xFF,0xFF,0xFF,0xFF,0xFE,
0xFF,0xFF,0xFF,0xFF,0xFE,
0xFF,0xFF,0xFF,0xFF,0xFE,
0xFF,0xFF,0xFF,0xFF,0xFE,
};
#pragma CONST_SEG default
//#pragma DATA_SEG DEFAULT_RAM
//-******************初始化时钟的定时中断**************************************-//
void Init_RTI(void)
{
CRGINT_RTIE=1; //允许定时中断
RTICTL=0x4E; //0.01s一次中断
}
//-******************初始化异步串口通讯****************************************-//
void Init_SCI(char c)
{
SCICR2=0x0C; //SCI发送,接收允许
SCICR2_RIE=1; //SCI接收中断允许
SCIBDH=0; //
SCIBDL=c;
}
//-*********************************-//
// 串口接收与发送
//-*********************************-//
void put_char(char c) //串口向外发送一个char字符
{
while((SCISR1&0x80)==0);
SCIDRL=c;
}
void put_word(int w)
{
put_char((char)w);
w>>=8;
put_char((char)w);
}
char get_char(void) //从串口收一个字符
{
while ((SCISR1&0x20)==0);
return SCIDRL;
}
void main(void) {
/* put your own code here */
Init_RTI();
Init_SCI(Baud19200);
DDRAD|=0x80;
EnableInterrupts;
for(;;) {} /* wait forever */
}
void fuzzy_inference(uchar gear)
{
uint i;
for(i=0;i<20;i++)
{
car_speed_mf[i]=SPEED_MFS[gear-1][i];
}
asm
{
//让X指向隶属函数,Y指向模糊输入参数中,A中放第1个输入变量值:
FUZZIFY: LDX #car_speed_mf ;Point at MF definitions
LDY #FUZ_INS ;Point at fuzzy input table
LDAA CURRENT_INS ;Get first input value
//第1个变量有7个隶属度函数,帮模糊化指令MEM应执行7次
LDAB #5 ;5 labels per input
GRAD_LOOP: MEM ;Evaluate ine MF
DBNE B,GRAD_LOOP ;For 7 labels of 1 input
//取第2个输入变量的值,第2个变量也有7个隶属度函数,故模糊化指令MEM也应该循环7次
LDX #GAS_MFS ;Point at MF definitions
LDAA CURRENT_INS[1] ;Get second input value
LDAB #7 ;7 labels per input
GRAD_LOOP1: MEM ;Evaluate ine MF
DBNE B,GRAD_LOOP1 ;For 7 labels of 1 input
//此时,Y指向最后一个输入变量的下一个字节,即模糊输出变量的第1个字节,在做逻辑推理前,将7个逻辑推理输出值清0
LDAB #3 ;loop count
RULE_EVAL: CLR 1,Y+ ;Clr a fuzzy out & inc ptr
DBNE B,RULE_EVAL ;loop to clr all fuzzy outs
LDX #RULE_START ;Point at first rule element
LDY #FUZ_INS ;Point at fuzzy ins and outs
LDAA 0xFF ;Init A (and clears V-bit)
REV ;Process rule list
DEFUZ: LDY #FUZ_OUTS ;Point at fuzzy outputs
LDX #SGLTN_POS ;Point at singleton positions
LDAB #3 ;7 fuzzy outs per COG output
WAV ;Calculate sums for wtd av
EDIV ;Final divide for wtd av *
TFR Y,D ;Move result to A:B
STAB COGDEX ;Stire system output
}/**/
}
/*
asm{
ORG $0400
CURRENT_INS RMB 4;
FUZ_INS RMB 32;
FUZ_OUTS RMB 16;
COG_OUTS RMB 2;
SUM_OF_FUZ RMB 2;
SUM_OF_PROD RMB 3;
COGDEX RMB 1;
OLP_COUNT RMB 1;
SUMDEX RMB 1;
ORG $0450
}
*/
uchar count;
#pragma CODE_SEG __NEAR_SEG NON_BANKED
//-*****************************************-//
// 时钟定时中断
//-*****************************************-//
void interrupt 7 Realtime(void) //定时中断
{
if(count<50) count++;
else
{
count=0;
PTAD_PTAD7=!PTAD_PTAD7;
}
CRGFLG_RTIF=1; //clear interrupt flag
}
//-*****************************************-//
// 串口的接收中断
//-*****************************************-//
void interrupt 20 SCI(void) //串口输入中断
{
SCISR1_RDRF=0; //清中断标志
put_char(SCIDRL);
}
//#pragma CODE_SEG default
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -