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

📄 fc_v20.txt

📁 实现模糊控制算法(AD DA)和人机接口(4x4键盘 2x16LCD 串口1/2)
💻 TXT
📖 第 1 页 / 共 2 页
字号:
//-------------------------------------------------------------------
//
// Major Functions:	TOP File FUZZY CONTROL
//
// --------------------------------------------------------------------
//
// Revision History :
// --------------------------------------------------------------------
//   Ver  :| Author            :| Mod. Date :| Changes Made:
//   V1.0 :| SJITON            :| 06/12/06  :| Initial Revision
//   V1.5 :| SJITON            :| 06/12/28  :| Add GPIO_C & GPIO_D
// --------------------------------------------------------------------


#include<c8051f040.h>
#include<stdio.h>
#include<FLOAT.h>
#include<absacc.h>
#include<intrins.h>
#include<math.h>

#define ADC0START temppage=SFRPAGE;SFRPAGE=0x00;AD0BUSY=1;SFRPAGE=temppage
#define aalen 24
#define		TURE	0
#define		FALSE	1
#define		delay_key_VALUE	3
typedef unsigned int uint;
typedef unsigned char uchar;
typedef unsigned long ulong;
sfr16 RCAP2=0xca;
sfr16 RCAP3=0xca;
sfr16 RCAP4=0xca;
sfr16 TMR4=0xcc;
sfr16 TMR3=0xcc;
sfr16 TMR2=0xcc;
sfr16 PCA0CP0=0xfb;
sfr16 PCA0CP1=0xfd;
sfr16 PCA0CP2=0xe9;
sfr16 PCA0CP3=0xeb;
sfr16 PCA0CP4=0xed;
sfr16 PCA0CP5=0xe1;
sfr16 ADC0VAL=0xbe;
sfr16 ADC0GT=0xc4;
sfr16 ADC0LT=0xc6;
sfr16 DAC0VAL=0xD2;

sbit key1=P6^0	;
sbit key2=P6^1;
sbit key3=P6^2;
sbit key4=P6^3;
sbit scankey1=P6^4;
sbit scankey2=P6^5;
sbit scankey3=P6^6;
sbit scankey4=P6^7;
sbit RS=P7^0;
sbit RW=P7^1;
sbit EN=P7^2;
sbit BU=P5^7;
void delay( long m);
void delay_lcd(uchar time);
void EN_Puls();
void LCD_RDY();
void Wr_Com(uchar command);
void Wr_Dat(uchar dat);
void Wr_Pos(uchar colum,uchar row);
void Wr_Str(uchar *s);
void Wr_Ara(uchar s[]);
void Init_LCD();
void delay_key(short i);     //延时程序
uchar keyscan();     //键盘的扫描程序
void menu_1();
void menu_2();
void menu_3();
void menu_4();
void menu_5();
void menu_6();
void menu_m();
void ReadData(void) ;
xdata uchar aa[aalen]={0x20,0x20,0x53,0x54,0x55,0x56,
					   0x57,0x58,0x20,0x20,0x61,0x62,
					   0x63,0x64,0x65,0x66,0x20,0x20,
					   0x67,0x68,0x69,0x70,0x71,0x72};
xdata uchar res[6]={0x01,0x02,0x03,0x04,0x05,0x06};
xdata uchar sk;
xdata uchar start;
xdata uchar kk;
uchar ii,tt;
bit isfirstdata;

void config ();
void T2_config();
void T2_baud(uchar);
void T1_config();
void Uart1_config();
void T1_baud(uchar)	;

void proc_send_data_wd (float) ;//return in aa[]
void proc_send_data_yl (float) ;//return in aa[]
void proc_send_data_sw (float) ;//return in aa[]

uchar keyword,p;
uchar  code  display_code[]={0x00,0x01,0x02,0x03,0x04,0x05,
                                      0x06,0x07,0x08,0x09,0x0a,0x0b,
                                      0x0c,0x0d,0x0e,0x0f};
uchar code table[]={0x00,0x01,0x02,0x03,
                            0x04,0x05,0x06,0x07,
                            0x08,0x09,0x0a,0x0b,
                            0x0c,0x0d,0x0e,0x0f};

uchar temppage;
bit isnewdata;
xdata uint k,j,i;
unsigned char keyscan(void);//函数的声明


void config ()
{
    WDTCN = 0x07;
    WDTCN = 0xde;
    WDTCN = 0xad;
    
    SFRPAGE = 0x0F;
    XBR0 = 0x04;	//
    XBR1 = 0x00;
    XBR2 = 0x44;	// 交叉开关使能使用UART1和交叉开关使能
    XBR3 = 0x00; 
	   
    SFRPAGE = 0x0F;
    P0MDOUT = 0x00; 	//P0为开漏模式
    P1MDIN = 0xFF;
    P1MDOUT = 0x00; 	//P1为开漏模式
    P2MDOUT = 0x00; 	//P2为开漏模式

    SFRPAGE = 0x0F;
    CLKSEL = 0x00;  
    OSCXCN = 0x00;	
    OSCICN = 0x84;		//采用内部晶振,为24.5MHZ8分频

}


void T2_config()
{
    SFRPAGE = 0x00;
    TMR2CF = 0x08; 	//自动重载,自增
    TMR2CN = 0x04;  //启动T2
}


void Uart0_config()
{
    SFRPAGE = 0x00;
    SADDR0 = 0x00;     
    SADEN0 = 0x00;	//从机广播地址屏蔽    
    SSTA0 = 0x05; //UART0收发都以T2为时钟源
    SCON0 = 0x50; //模式1
    SCON0 &= 0xFC;
    IE|=0x10;	//开中断
    T2_config();	//T2溢出率
}


void T2_baud(uchar val)
{
	SFRPAGE = 0x00;
	RCAP2 = ~val+1;     
	TMR2 = RCAP2;     
}

void T1_config()
{
    SFRPAGE = 0x00;
    CKCON = 0x01;   
    TMOD = 0x20;   		// T1为8位自动重载模式
    TCON = 0x40;    	// TR1置1,启动定时器
}	


void Uart1_config()
{
    SFRPAGE = 0x01;    
    SCON1 = 0x10;       // 工作在8bit模式,接收使能
    SCON1 &= 0xFC; 	//清中断标志
    EIE2 |= 0x40;       //开启UART1中断
    T1_config();		
}			


void T1_baud(uchar val)	//T1溢出率设置,溢出率为(T1时钟频率)/(val)
{
	SFRPAGE = 0x00;
	TH1 = ~val+1;
	TL1 = TH1;
}

void delay1(void)                 /*延迟1ms*/
{
	uint i;
	uint j;
	for (i=0;i<100;i++)
	{
		for(j=0;j<300;j++);
     }
}		          
/*主程序*/
void main(void)      
{
    config();
	Uart0_config();
	Uart1_config();
	T2_baud(10);		//波特率为19200bps UART0
	T1_baud(77);		//波特率为4800bps UART1
	EA=1;
    tt=0;
	kk=0;
    ii=0;
	SFRPAGE=0x00;
	TI0 = 0;
	SBUF0=0x30;
	while(!TI0);
	TI0 = 0;

        while(ii<24)
	 {
	  SFRPAGE=0x00;
	  TI0 = 0;
	  SBUF0=0x20;
	  while(!TI0);
	  TI0 = 0;

	  while(!RI0);
	  aa[ii]=SBUF0;
	  RI0=0;
	  ii++;
        }
   	sk=0;
   	SFRPAGE=0x00;
   	start=0;
	SFRPAGE=0x0f;
	Init_LCD();
	Wr_Pos(1,1);
	Wr_Str("    QQ  SJITON   ");
	Wr_Pos(1,2);
	Wr_Str("     WELCOM     ");
	delay(65535);
	menu_m();
}

/*ADC0中断*/
void ADC0_ISR() interrupt 15
{
	SFRPAGE=0x00;
	AD0INT=0;
	isnewdata=1;
	i--;
}

/*UART1中断	接收到0x20则往上位机依次传数据接收到0x30则停止*/
void uart1_ISR() interrupt 20
{
unsigned char Save_SFR=SFRPAGE;
 if(RI1)
 {
		res[0]=SBUF1;//将接收数据写入res[]数组
    if (res[0]==0x20)
	{
          start=1;
    }
   if (res[0]==0x30)
   {
         start=0;
         sk=0;
    }
   if (start==1)
   {
	     if(sk<aalen)
		 {
			SBUF1=aa[sk];//发送数据数组为aa[]
		  }
		sk++;
	   	TI1=0;
    }
	RI1=0;
 }
	if(TI1) {  }
}


//////////////////////////////
//            液晶显示程序
/////////////////////////////
void delay_lcd(uchar time)
{
	while(time>0)
	{
		time --;
	}
}
void EN_Puls()
{
	EN=1;
	delay_lcd(10);
	EN=0;
	delay_lcd(10);
}

void LCD_RDY()
{
	RW=1;
	RS=0;	
	P5=0xff;
	EN=1;
	delay_lcd(10);
	while(BU==1);
	EN=0;
}

void Wr_Com(uchar command)
{
	P5=0xff;
	RW=0;
	RS=0;
	P5= command;
	EN_Puls();
	LCD_RDY();
}

void Wr_Dat(uchar dat)
{
	P5=0xff;
	RW=0;
	RS=1;
	P5=dat;
	EN_Puls();
	LCD_RDY();		
}

void Wr_Pos(uchar colum,uchar row)
{
	
	uchar p;
	SFRPAGE = 0x0F;
	if(row==1)
	{
		p=0x80+colum-1;
		Wr_Com(p);
	}
	else
	{
		p=0xc0+colum-1;
		Wr_Com(p);
	}
}

void Wr_Str(uchar *s)
{
	for(;*s!='\0';s++)
		Wr_Dat(*s);
}

void Wr_Ara(uchar s[])
{
	uchar i;
	for(i=0;i<16;i++)
	//Wr_Dat(s[i]+0x30);
              Wr_Dat(s[i]);
}

void Init_LCD()
{
	Wr_Com(0x38);
	Wr_Com(0x06);
	Wr_Com(0x0c);
	Wr_Com(0x01);
}

/*            			键盘扫描程序
此程序是键盘的扫描程序,这里的键盘是十六进制键盘,第1行从做到右为数字1,2,3,4,第2行为5,6,7,8
第3行为9,0,A,B,第4行为C,D,E,F。竖着的线从左到右分别接P1.0~p1.3,作为键盘的驱动线
横者的线从上到下分别接P1.4~P1.7,是键盘的信号线
扫描的方法是先给P1.0 "1",然后依次检测P1.4~P1.7,如果为高,则返回键码值,然后向后扫描p1.1~p1.3.
*/
void delay_key(short i)      //延时程序
{
	int j=0;
	int k=0;
	k=i*delay_key_VALUE;
	while(j<k) j++;
}
unsigned char keyscan()          //键盘的扫描程序
{
	key1=TURE;
	SFRPAGE = 0x0F;
	if(scankey1==TURE)
		delay_key(delay_key_VALUE);
	if(scankey1==TURE)
	{
		delay_key(delay_key_VALUE);
		if(scankey1==TURE)
		{
			while(scankey1==TURE);
			return 12;
		}
	}
	if(scankey2==TURE)
		delay_key(delay_key_VALUE);
	if(scankey2==TURE)
	{
		delay_key(delay_key_VALUE);
		if(scankey2==TURE)
		{
			while(scankey2==TURE);
			return 8;
		}
	}
	if(scankey3==TURE)
		delay_key(delay_key_VALUE);
	if(scankey3==TURE)
	{
		delay_key(delay_key_VALUE);
		if(scankey3==TURE)
		{
			while(scankey3==TURE);
			return 4;
		}
	}
	if(scankey4==TURE)
		delay_key(delay_key_VALUE);
	if(scankey4==TURE)
	{
		delay_key(delay_key_VALUE);
		if(scankey4==TURE)
		{
			while(scankey4==TURE);
			return 0;
		}
	}	

⌨️ 快捷键说明

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