欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

    標題: 看下這程序如何實現以下功能 [打印本頁]

    作者: ken5588492    時間: 2012-6-14 14:24
    標題: 看下這程序如何實現以下功能

    IO定義:

    輸出口P0.0

    輸入口P2.7\P2.6P2.5\P2.4

    要求:1、P2.6為低時,P0.0為高;P2.7和P2.6為低時,P0.0為低。P2.7單獨為低時,不作任何反映。

            2、當P2.4為低時,無論P2.7和P2.6在什么狀態,P0.0為低。

            3、當P2.5為低時,P0.0為低。

    以下是程序,但有問題,請高手指出:

    /*

     


    */
    #include<STC12C5A60S2.h>
    #define uchar unsigned char
    #define uint unsigned int
    #define Delaytime  100 //消抖
    #define Delaybeemp 10
    typedef signed   long           INT64S;
    typedef unsigned long           INT64U;
    typedef signed   int            INT32S;
    typedef unsigned int            INT32U;
    typedef signed   short          INT16S;
    typedef unsigned short          INT16U;
    typedef signed   char           INT8S;
    typedef unsigned char           INT8U;
    /*IO口定義*/
    sbit out_upper=P0^0;   //接電磁閥
    sbit out_lower = P0^2; //不用
    sbit Buzzer = P0^1; //不用

     

    sbit Upper_limit=P2^4; //(接光膜傳感器)
    sbit Lower_limit = P2^5; //檢測電磁到位開關

    sbit button = P2^6; //按鈕S2
    sbit button1 = P2^7; //按鈕S1

    typedef struct tagTYPE_UART_BUFFER
    {
     INT8U  ucFlag; 
        INT8U  ucIndex;
        INT8U  ucLength;
        INT8U  ucBuffer[20];
    }TYPE_UART_BUFFER, *pTYPE_UART_BUFFER;

    typedef struct tagTYPE_UART_INFO
    {
        TYPE_UART_BUFFER    sRX;
        TYPE_UART_BUFFER    sTX;
    }TYPE_UART_INFO, *pTYPE_UART_INFO;
    // ---------------------------------------------
    unsigned char button_flag,jishu_flag,Upper_limit_flag,Lower_limit_flag;
    unsigned char delay = Delaytime;
    TYPE_UART_INFO xdata sUART0_Info = {0};

    void sendonebyte(void);
    /*
    函數功能:串口初始化,
    波特率:38400 工作在1T模式,使用定時器1計數
    */
    void InitUART(void)
    {
        TMOD = 0x21;
        SCON = 0x50;
     AUXR |= 0x40;//使其工作在1T模式下
        TH1 = 0xF7;
        TL1 = TH1;
        PCON = 0x00;
        EA = 1;
        ES = 1;
        TR1 = 1;

     //定時器0 定時時間:10ms
     TH0 = 0x0FF;
        TL0 = 0x0F6;
        EA = 1;
        ET0 = 1;
        TR0 = 1;
     //初始化輸入輸出的io
     P0M0 = 0xff;
     P0M1 = 0x00;
     P2M0 = 0x00;
     P2M1 = 0xff;
    }

    /*
    函數功能:延時時間為10ms
    */
    void delay_10ms(void)   //誤差 0us
    {
        unsigned char a,b,c;
        for(c=1;c>0;c--)
            for(b=38;b>0;b--)
                for(a=130;a>0;a--);
    }

    void main(void)
    {
     uchar i,flag=0;
    // jishu_flag = 0;
     InitUART();
     out_upper = 1;//此時汽缸向上動作
     out_lower = 1;
     Upper_limit_flag = 0;   //  光幕傳感器
     Lower_limit_flag = 0;     //到位開關
     button_flag = 0; //按鈕S1
     button1_flag = 0; //按鈕S2
     while(1)
     {
    //  if(sUART0_Info.sRX.ucFlag == 1)
    //  {
    //   sUART0_Info.sRX.ucFlag = 0;
    //    out_upper = 1;//此時汽缸向上動作
    //    out_lower = 1;
    //   for(i = 0;i<sUART0_Info.sRX.ucLength;i++)
    //   {
    //    sUART0_Info.sRX.ucBuffer = 0;
    //   }
    //  }

     


      if(Upper_limit_flag == 1)  //光幕傳感器
      {
          Upper_limit_flag = 0;
          out_upper = 1;//此時汽缸向上動作
          out_lower = 1;
          flag = 0;
         
      }
      if((Lower_limit_flag == 1)&&(flag == 0)) //限位開關和光幕傳感器做邏輯與運算
      {
       Lower_limit_flag = 0;     //限位開關為低電位
        flag = 1;
       out_upper = 1;//此時汽缸向下動作
       out_lower = 0;
       sendonebyte();
      }
      if(button_flag == 1)&&(button1_flag == 1)    //按鈕按下
      {
         button_flag = 0;
         out_upper = 0;//此時汽缸向下動作
         out_lower = 1;
      }
    //  if((input==0)&&(jishu_flag == 0))
    //  {
    //   delay_10ms();
    //   if((input==0)&&(jishu_flag == 0))
    //   {
    //    output = 0;//把汽缸合上
    //    jishu_flag = 1;
    //    overtime = 0;
    //    while((input_test_qg==1)&&(overtime++ < Delaybeemp-1))
    //    {
    //    
    //     for(i = 0;i< 100;i++)
    //     {
    //      delay_10ms();    
    //     }
    //    }
    //     if(overtime>=Delaybeemp-1)
    //     {
    //      Buzzer = 0;
    //     }
    //     else if(input==0)
    //     {
    //      sendonebyte();
    //     }
    //   }
    //  }
    //  if(button_flag == 1)
    //  {
    //   button_flag = 0;
    //   Buzzer = 1;
    //   output = 1;
    //  // jishu_flag = 0;
    //  } 
    //  if(input==1)
    //  {
    //   delay_10ms();
    //   if(input==1)
    //   {
    //    jishu_flag = 0; 
    //    Buzzer = 1;
    //   } 
    //  }
     }  
    }


    void ISR_UART0(void)interrupt 4
    {

         INT8U ucTemp;// 暫存變量
        // 接收
        if (RI){
            // ---------------------------------------------
            // 啟動接收
            RI = 0;
            ucTemp = SBUF;
            // 判斷數據
            switch (sUART0_Info.sRX.ucIndex)
      {
                case 0:// "Z"
                    if (ucTemp == 'Z')
        {
                        // "Z"
                        sUART0_Info.sRX.ucBuffer[sUART0_Info.sRX.ucIndex ++] = ucTemp;
                    }
                    else
        {
                        // 無效數據
                        sUART0_Info.sRX.ucIndex = 0;
                    }
                    break;
                case 1:// "U"
                    if (ucTemp == 'U')
        {
                      
                        sUART0_Info.sRX.ucBuffer[sUART0_Info.sRX.ucIndex ++] = ucTemp;
                    }
                    else
        {
                        // 無效數據
                        sUART0_Info.sRX.ucIndex = 0;
                    }
                    break;
                case 2:// "Z"
                    if (ucTemp == 'Z')
        {
                        // "Z"
                        sUART0_Info.sRX.ucBuffer[sUART0_Info.sRX.ucIndex ++] = ucTemp;
                    }
                    else
        {
                        // 無效數據
                        sUART0_Info.sRX.ucIndex = 0;
                    }
                    break;
                default:// 通信數據
                    // 接收通信數據,
                    sUART0_Info.sRX.ucBuffer[sUART0_Info.sRX.ucIndex ++] = ucTemp;             
                    // 接收通信數據,判斷回車鍵
                    if(((ucTemp == '\r')||((ucTemp == '\n')))&&(sUART0_Info.sRX.ucIndex >= 3))
        {
                     sUART0_Info.sRX.ucLength = sUART0_Info.sRX.ucIndex;
         sUART0_Info.sRX.ucIndex = 0; //接收完,清零索引
         sUART0_Info.sRX.ucFlag = 1;                
                    }
                    else
        {
                    }
                    break;
            } 
            // ---------------------------------------------
        }

        // ---------------------------------------------
        if (TI){
            // ---------------------------------------------
            TI = 0;
            // ---------------------------------------------
            if (sUART0_Info.sTX.ucIndex < sUART0_Info.sTX.ucLength)
      {
                SBUF = sUART0_Info.sTX.ucBuffer[sUART0_Info.sTX.ucIndex ++];
            }
            else
      {
                sUART0_Info.sTX.ucIndex = 0;
                sUART0_Info.sTX.ucLength = 0;
            }
            // ---------------------------------------------
        }
        // ---------------------------------------------
    }

    //10 ms掃描按鍵
    void Timer0Interrupt(void) interrupt 1
    {
      // 清除標志
        TF0 = 0;
        TR0 = 0;
        TH0 = 0x0FF;
        TL0 = 0x0F6;
     TR0 = 1;  
     if((button == 0)||(Upper_limit == 0)||(Lower_limit == 0)) //按鈕、光幕傳感器、到位開關存在邏輯或的關系
     {
      delay -- ; //延時消抖
      if(!delay)
      {
       delay =  Delaytime;
       if(button == 0)
       {
        button_flag =1;
       }
       else if(Upper_limit == 0)
       {
        Upper_limit_flag = 1;
       }
       else if(Lower_limit == 0)
       {
         Lower_limit_flag = 1;
       }           
      }
     }

        //add your code here!
    }

    void sendonebyte(void)
    {
      sUART0_Info.sTX.ucBuffer[0] = 'Z';
      sUART0_Info.sTX.ucBuffer[1] = 'f';
      sUART0_Info.sTX.ucBuffer[2] = 'Z';
      sUART0_Info.sTX.ucBuffer[3] = '\r';
      sUART0_Info.sTX.ucIndex = 0;
         sUART0_Info.sTX.ucLength = 4;
      SBUF = sUART0_Info.sTX.ucBuffer[sUART0_Info.sTX.ucIndex ++];
    }

     






    歡迎光臨 (http://m.raoushi.com/bbs/) Powered by Discuz! X3.1