📄 fc_v20.txt
字号:
//-------------------------------------------------------------------
//
// 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 + -