?? 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 + -