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

📄 main.c

📁 文件包含使用motorola单机的专用模糊控制指令
💻 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 + -