燈光控制
#include "STC15Fxxxx.H"
#include "string.h"
#define uchar unsigned char
#define uint unsigned int
sbit SYT1 = P0^2; //試驗臺1繼電器1控制I/O為P1.2
sbit SYT2 = P0^3; //試驗臺2繼電器2控制I/O為P1.3
sbit SYT3 = P0^4; //試驗臺3繼電器3控制I/O為P1.4
sbit SYT4 = P0^5; //試驗臺4繼電器4控制I/O為P1.5
sbit SYT5 = P0^6; //試驗臺5繼電器5控制I/O為P1.6
sbit SYT6 = P0^7; //試驗臺6繼電器6控制I/O為P1.7
//試驗臺按鍵控制關閉
sbit GBSYT1 = P1^2;
sbit GBSYT2 = P1^3;
sbit GBSYT3 = P1^4;
sbit GBSYT4 = P1^5;
sbit GBSYT5 = P1^6;
sbit GBSYT6 = P1^7;
char code str1[]="AT\r\n"; // 聯機指令,返回"OK"
char code str2[]="AT+CWMODE=3\r\n"; // 設置ESP8266的工作模式,返回"OK"或者"no change"
char code str3[]="AT+CWJAP=\"Smart01\",\"0123456789\"\r\n"; // 連接到WiFi熱點ESP8266為熱點名稱,1234567890為密碼;連接成功返回“OK”
char code str4[]="AT+CIFSR\r\n"; // 本機IP地址查詢指令
char code str5[]="AT+CIPSTART=\"TCP\",\"192.168.4.1\",8234\r\n"; // 連接到TCP服務器,返回“Linked”
char code str6[]="AT+CIPSEND\r\n"; // 發送數據指令
char code str7[]="hello!\r\n"; // 數據內容
char code str8[]="AT+CIPSERVER=1,8080\r\n"; // 建立TCP服務器,開放端口19780
char code str9[]="AT+CIPMUX=1\r\n"; // 打開多連接
char code str10[]="AT+RST\r\n"; // 軟件復位
char code str11[]="AT+CIPSEND=0,20\r\n"; // 發送數據指令,基于多路連接模式
char code str12[]="Command Executed!\r\n"; // 數據內容
char code str13[]="AT+CIPMODE=1\r\n"; //進入透傳
/************************************
通過刷卡控制試驗臺繼電器的開關,每次試驗臺得電
都會使步進電機正轉一圈,然后反正一圈,達到開關門的效果
**********************************/
//電機轉動控制數組
uchar num,flag=1,flag1=1,tmp;
uchar code table1[]={0x08,0x0c,0x04,0x06,0x02,0x03,0x01,0x09}; //正轉數組
uchar code table2[]={0x09,0x01,0x03,0x02,0x06,0x04,0x0c,0x08}; //反正數組
//打開
#define OpenSYT1 1
#define OpenSYT2 2
#define OpenSYT3 3
#define OpenSYT4 4
#define OpenSYT5 5
#define OpenSYT6 6
#define OpenAll 7
//關閉
#define CloseOFF 8
#define CloseSYT1 9
#define CloseSYT2 10
#define CloseSYT3 11
#define CloseSYT4 12
#define CloseSYT5 13
#define CloseSYT6 14
#define S2RI 0x01 //S2CON.0
#define S2TI 0x02 //S2CON.1
#define S2RB8 0x04 //S2CON.2
#define S2TB8 0x08 //S2CON.3
#define S2_S0 0x01 //P_SW2.0
uchar ReceiveCounter,ReceiveBuf[10],ReceiveCounter2,ReceiveBuf2[10];
//電機控制延時函數
void delay(uint i)
{
uint j,k;
for(j=i;j>0;j--)
for(k=110;k>0;k--);
}
/*******************************
電機動作控制
**************************/
void qudong1() //電機正轉驅動
{
uchar j,i;
for( i=0;i<200;i++ )
for(j=0;j<8;j++)
{ P2=table1[j];
delay(8);
}
}
void tingzhi() //中途停止時間
{
uchar j;
for(j=0;j<8;j++)
{
P2=0x00;
delay(8);
}
}
void qudong2() //電機反轉驅動
{
uchar j,i;
for( i=0;i<200;i++ )
for(j=0;j<8;j++)
{
P2=table2[j];
delay(8);
}
}
//真對 IAP15W4K61S4 STC15W4K56S4 系列 IO口初始化
//io口初始化 P0 P1 P2 P3 P4 為準雙向IO口
//注意: STC15W4K32S4系列的芯片,上電后所有與PWM相關的IO口均為
// 高阻態,需將這些口設置為準雙向口或強推挽模式方可正常使用
//相關IO: P0.6/P0.7/P1.6/P1.7/P2.1/P2.2
// P2.3/P2.7/P3.7/P4.2/P4.4/P4.5
void IO_init(void)
{
P0M0 = 0Xff; //P0口使用強推挽模式
P0M1 = 0X00;
P1M0 = 0X00;
P1M1 = 0X00;
P2M0 = 0X00;
P2M1 = 0X00;
P3M0 = 0X00;
P3M1 = 0X00;
P4M0 = 0X00;
P4M1 = 0X00;
}
uchar CompChar( uchar *getChar, uchar *KnownChar )
{ while( *KnownChar != 0 )
{ if( *getChar != *KnownChar )return 0;
else
{ getChar ++;
KnownChar ++;
}
}
return 1;
}
uchar CharCommand( uchar *getChar )
{ if( CompChar(getChar,"OpenALL") )return OpenAll;
if( CompChar(getChar,"OpenSYT1") )return OpenSYT1;
if( CompChar(getChar,"OpenSYT2") )return OpenSYT2;
if( CompChar(getChar,"OpenSYT3") )return OpenSYT3;
if( CompChar(getChar,"OpenSYT4") )return OpenSYT4;
if( CompChar(getChar,"OpenSYT5") )return OpenSYT5;
if( CompChar(getChar,"OpenSYT6") )return OpenSYT6;
if( CompChar(getChar,"CloseOFF") )return CloseOFF;
if( CompChar(getChar,"CloseSYT1") )return CloseSYT1;
if( CompChar(getChar,"CloseSYT2") )return CloseSYT2;
if( CompChar(getChar,"CloseSYT3") )return CloseSYT3;
if( CompChar(getChar,"CloseSYT4") )return CloseSYT4;
if( CompChar(getChar,"CloseSYT5") )return CloseSYT5;
if( CompChar(getChar,"CloseSYT6") )return CloseSYT6;
return 0;
}
void Com2_Init( void )
{
S2CON = 0x50; //8位數據,可變波特率
AUXR |= 0x04; //定時器2時鐘為Fosc,即1T
T2L = 0xE0; //設定定時初值
T2H = 0xFE; //設定定時初值
AUXR |= 0x10; //啟動定時器2
IE2 = 0x01;
}
void Com2_WriteOne(uchar ch)
{
//IE2 &= (~0x01);
S2CON &= ~S2TI;
S2BUF = ch;
while((S2CON & S2TI)==0);
//IE2 = 0x01;
}
void main()
{ uchar temp,FlagReceive,FlagWork,*RcvBufPoint;
IO_init(); //真對 IAP15W4K61S4 IO口初始化
SCON = 0x50; //REN=1允許串行接受狀態,串口工作模式2
TMOD= 0x21;
AUXR=0X40; //開啟1T模式
ET0=1;
// TR0=1;
TH1 = 0xDC;
TL1 = 0xDC; // 設置波特率為9600 公式 TH1=256-(11059200/32/9600)=256-36=220 0xDC
TR1 = 1; //開啟定時器1
ES = 1; //開串口中斷
EA = 1; // 開總中斷
Com2_Init();
ReceiveCounter = 0;
ReceiveCounter2 = 0;
FlagReceive = 0;
FlagWork = 0;
while(1)
{
Com2_WriteOne(0x67);
//按鍵控制繼電器斷開,打開門
if(GBSYT1==0)
{
delay(10);//消抖
if(GBSYT1==0)
{
SYT1=1;
FlagWork = 1;
}
}
if(GBSYT2==0)
{
delay(10);//消抖
{
SYT2=1;
FlagWork = 1;
}
}
if(GBSYT3==0)
{
delay(10);//消抖
if(GBSYT3==0)
{
SYT3=1;
FlagWork = 1;
}
}
if(GBSYT4==0)
{
delay(10);//消抖
if(GBSYT4==0)
{
SYT4=1;
FlagWork = 1;
}
}
if(GBSYT5==0)
{
delay(10);//消抖
if(GBSYT5==0)
{
SYT5=1;
FlagWork = 1;
}
}
if(GBSYT6==0)
{
delay(10);//消抖
if(GBSYT6==0)
{
SYT6=1;
FlagWork = 1;
}
}
//數據接收打開實驗室臺
if( FlagReceive )
{ FlagReceive = 0;
switch( CharCommand( ReceiveBuf ))
{
//打開
case OpenAll:
SYT1 = 0; //低電平有效,低電平時才導通
SYT2 = 0;
SYT3 = 0;
SYT4 = 0;
SYT5 = 0;
SYT6 = 0;
FlagWork = 1;
break;
case OpenSYT1:
SYT1 = 0;
FlagWork = 1;
break;
case OpenSYT2:
SYT2 = 0;
FlagWork = 1;
break;
case OpenSYT3:
SYT3 = 0;
FlagWork = 1;
break;
case OpenSYT4:
SYT4 = 0;
FlagWork = 1;
break;
case OpenSYT5:
SYT5 = 0;
FlagWork = 1;
break;
case OpenSYT6:
SYT6 = 0;
FlagWork = 1;
break;
//關閉
case CloseSYT1:
SYT1 = 1;
FlagWork = 0;
break;
case CloseSYT2:
SYT2 = 1;
FlagWork = 0;
break;
case CloseSYT3:
SYT3 = 1;
FlagWork = 0;
break;
case CloseSYT4:
SYT4 = 1;
FlagWork = 0;
break;
case CloseSYT5:
SYT5 = 1;
FlagWork = 0;
break;
case CloseSYT6:
SYT6 = 1;
FlagWork = 0;
break;
case CloseOFF:
SYT1 = 1; //低電平有效,低電平時才導通
SYT2 = 1;
SYT3 = 1;
SYT4 = 1;
SYT5 = 1;
SYT6 = 1;
break;
default:
ReceiveCounter = 0;
FlagWork = 0;
break;
}
}
if( FlagWork == 0 )RcvBufPoint = 0;
if( ReceiveCounter >=8 )
{ temp = ReceiveCounter;
delay(500);
if( temp == ReceiveCounter )
{ if( temp <= 9 )
{
FlagReceive = 1;
}
else
{ FlagReceive = 0;
}
ReceiveCounter = 0;
RcvBufPoint = ReceiveBuf;
}
}
if(( FlagReceive == 0 )&&( ReceiveCounter2>=8 ))
{ temp = ReceiveCounter2;
delay(500);
if( temp == ReceiveCounter2 )
{ if( temp <= 9 )
{
FlagReceive = 1;
}
else
{ FlagReceive = 0;
}
ReceiveCounter2 = 0;
RcvBufPoint = ReceiveBuf2;
}
}
if( FlagWork )
{ FlagWork = 0;
qudong2();
delay(1000);
tingzhi();
delay(20000);
qudong1();
delay(1000);
tingzhi();
}
}
}
void Serial_int(void) interrupt 4 using 1 //!!!!!!!!!!目前只能接受16進制數,并對十六進制的數進行對比,需要改成對字符串的對比
{ //這里中斷的使用,interrupt 4 using 1 不是很明白,解釋下
unsigned char tmp; //答問1----計算機中所有數據都是16進制,處理器其實是無法識別所謂的字符的,比如字母'a' 對應的10進制就是 97 16進制就是0x61
//而大寫的字母'A',對應的10進制是65 16進制是0x41 有一個ASCII 表,此表規定了字母與數字的對應關系
if (RI)
{ //答問2----interrupt 4 using 1,前面的interrupt 4 表示此中斷的中斷向量是第4個中斷,當編譯器編譯這一段
//代碼的時候,會將此程序的跳轉地址寫到中斷位置偏移量為4的位置,如果此數字寫錯,則程序會異常,具體是寫到哪一個位
tmp = SBUF; //置,參看一下51內核的書就知道了
//using 1 表示使用第一組寄存器,因為特殊的寄存器有4組,通常第0組會非常繁忙,所以在中斷就使用第一組會快一點點
// ISP_Check(tmp);
ReceiveBuf[ ReceiveCounter ] = tmp;
if( ReceiveCounter < 9 )ReceiveCounter ++;
RI = 0;
}
}
void com2_isr()interrupt 8
{
EA=0;
while(1);
if (S2CON & S2RI)
{
S2CON &= ~S2RI; //清除S2RI位
ReceiveBuf2[ ReceiveCounter2 ] = S2BUF;
if( ReceiveCounter2 < 9 )ReceiveCounter2 ++;
}
EA=1;
}
//電機轉動角度控制定時器
void time0() interrupt 1
{
TH0=(65536-1000)/256;
TL0=(65536-18000)%256;
num++;
TR0=0;
TH0=(65536-17000)/256;
TL0=(65536-17000)%256;
TR0=1;
}
|