灯光控制
#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;
}
|