久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3837|回復: 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 共享資料的黑幣獎勵!

查看全部評分

回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 你懂的在线视频播放 | 一级毛片视频 | 亚洲视频在线播放 | 久久久久久综合 | 精品久久久久香蕉网 | 久久精品成人 | 亚洲福利电影网 | 国产婷婷 | 成人精品高清 | 91精品久久久久久综合五月天 | 色久在线| 一区二区精品在线 | 日韩在线精品视频 | 免费黄色的视频 | 人人叉| 亚洲成人精品一区二区 | 亚洲欧洲成人av每日更新 | 日韩在线中文 | 久久一区二区三区四区 | 天天射网站 | 免费一区二区三区在线视频 | 视频一区二区在线观看 | 亚洲精品一区二区网址 | 在线视频a | 日韩欧美福利视频 | 欧美激情精品久久久久久 | 国产精品欧美一区二区 | 午夜影视在线观看 | 日韩欧美国产成人一区二区 | 亚洲国产黄色av | 综合精品久久久 | 国产精品一区二区三区免费观看 | 亚洲精品中文字幕av | 日韩欧美在线视频 | 国产高清一区二区三区 | 一级毛片在线播放 | 自拍偷拍欧美 | 偷拍自拍第一页 | 久久久久久久亚洲精品 | 亚洲精品免费观看 | 久久精品一区二区三区四区 |