找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3800|回复: 0
打印 上一主题 下一主题
收起左侧

单片机灯光控制程序

[复制链接]
跳转到指定楼层
楼主
ID:140042 发表于 2016-9-21 16:23 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
灯光控制
#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;
}


评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表