找回密碼
         注冊會員
        搜索附件  
        MCU資訊論壇 附件中心 單片機論壇 51單片機論壇 QQ截圖未命名.png

        QQ截圖未命名.png

         

        串口通信問題 求助:
        先按按鍵 k1 就沒事 助手出現Hello what do you want to do?
        怎么我 L1 后再按按鍵就不顯示 正常了 前面第一個Hello 的H就變成1了
        發L2前面L就變2了   L3 L4 m1 m2 m3 m4 也一樣
        是SBUF里的數據沒被清除嗎
                   付protuse



        /************************************************************************

              說明:本程序主要完成上位機發送字符給單片機控制外圍器件的任務
                  時間:2011.7.30

        *************************************************************************/

        //頭文件
        #include <regx52.h>
        //宏定義
        #define uchar unsigned char
        #define uint unsigned int

        sbit k1 = P3 ^ 2;                //按鍵1
        sbit speaker = P1 ^ 4;  // 蜂鳴器

        uchar rev[]={""};        //接收到的字符
        uchar ser_text[]="Hello, What do you want to do?";

        //-----------------------------------------------------------------------
        //函數聲明
        void System_Init();                //初始化
        void Key_Scan();      //按鍵掃描函數
        void Delay_1ms(uint z); //延時1ms函數
        void Delay_1us(uint time_us);        //延時1us函數
        void Serial_Txd(uchar *p);    //串口發送函數
        void beer();
        //-----------------------------------------------------------------------


        /************************************************************************

                                                      主函數

        *************************************************************************/
        void main()
        {
                System_Init();

                while(1)
                {
                        Key_Scan();        
                }

        }

        /***********************************************************************************

                                 延時1ms函數

        ***********************************************************************************/
        void Delay_1ms(uint z)
        {
            uint x,y;
                for(x = z;x > 0;x--)
                   for(y = 110;y >0;y--);
        }

        /***********************************************************************************

                                 延時1us函數

        ***********************************************************************************/
        void Delay_1us(uint time_us)
        {
                while(--time_us);
        }


        /************************************************************************

                                                      初始化函數

        *************************************************************************/
        void System_Init()
        {
                SCON = 0X50;
                PCON = 0X00;
                TMOD = 0X20;
                TH1 = 0XFD;
                TL1 = 0XFD;
                EA = 1;
                ES = 1;
                TR1 = 1;
        }

        /************************************************************************

                                                      串口中斷函數

        *************************************************************************/          
        void Serial_Rxd() interrupt 4
        {
                ES=0;
                if(RI)
                {
                        rev[0] = SBUF;
                        RI = 0;
                        if(rev[0] == 'm')                     //如果第一個字符是m
                        {
                                while(!RI);
                                rev[1] = SBUF;
                                RI = 0;
                                switch(rev[1])                                          //判斷第二個字符
                                {
                                        case '1':P2 = 0; P0 = 0xff; break;         //是1 第一個數碼管亮
                                        case '2':P2 = 1; P0 = 0xff; break;         //是2 第二個數碼管亮
                                        case '3':P2 = 2; P0 = 0xff; break;         //是3 第三個數碼管亮
                                        case '4':P2 = 3; P0 = 0xff; break;          //是4 第四個數碼管亮
                                }
                               

                        }
                        if(rev[0] == 'L')                                  //如果第一個字符是m
                        {
                                while(!RI);
                                rev[1] = SBUF;
                                RI = 0;
                                switch(rev[1])                                   //判斷第二個字符
                                {
                                        case '1':P1 = 0XFE; break;           //是1 第一個LED亮
                                        case '2':P1 = 0XFD; break;           //是2 第二個LED亮
                                        case '3':P1 = 0XFB; break;           //是3 第三個LED亮
                                        case '4':P1 = 0XF7; break;            //是4 第四個LED亮

                                }

                        }
                        if(rev[0] == 'b')                                       //判斷第一個字符是不是b
                        {
                                while(!RI);
                                rev[1] = SBUF;
                                RI = 0;
                                if(rev[1] == 'e')                                   //判斷第二個字符是不是e
                                {
                                        while(!RI);
                                        rev[2] = SBUF;
                                        RI = 0;                                                  
                                        if(rev[2] == 'e')                           //判斷第三個字符是不是e
                                        {
                                                while(!RI);
                                                rev[3] = SBUF;
                                                RI = 0;
                                                if(rev[3] == 'r')                  //判斷第四個字符是不是r
                                                {
                                                        beer();                          //全部是蜂鳴器響
                                                }
               
                                        }

                                }

                        }               
                }
                ES=1;

        }                                                  

        /***********************************************************************************

                                    按鍵掃描函數

        ***********************************************************************************/
        void Key_Scan()
        {
            if(k1 == 0)                                              //如果按鍵1被按下
                {
                    Delay_1ms(21);                //延時20ms
                        if(k1 == 0)                                      //按鍵1確實被按下
                        {                                                   
                                Serial_Txd(ser_text);                      //串口發送函數
                            while(!k1)                              //松手檢測
                            Delay_1ms(21);
                             while(!k1);
                        }
                }
        }


        /************************************************************************

                                                      串口發送函數

        *************************************************************************/
        void Serial_Txd(uchar *p)
        {
                uint i;
                Delay_1ms(1);
                for(i = 0;i < 30;i++)
                {
                        SBUF = *p++;
                        while(!TI);
                        TI = 0;
                }

        }

        /************************************************************************

                                                      蜂鳴器函數

        *************************************************************************/
        void beer()
        {
                uint i;
                for(i = 0;i < 1600;i++)                  //大概時間是1s
                {
                        speaker = !speaker;
                        Delay_1us(70);                 //控制發聲頻率
               
                }
        }
        另外程序哪里還可以改進 求賜教
        寫得非常好呀。。。。
        /************************************************************************

              說明:本程序主要完成上位機發送字符給單片機控制外圍器件的任務
                  時間:2011.7.30

        *************************************************************************/

        //頭文件
        #include <regx52.h>
        //宏定義
        #define uchar unsigned char
        #define uint unsigned int

        sbit k1 = P3 ^ 2;                //按鍵1
        sbit speaker = P1 ^ 4;  // 蜂鳴器

        uchar rev[]={""};        //接收到的字符
        uchar ser_text[]="Hello, What do you want to do?";

        //-----------------------------------------------------------------------
        //函數聲明
        void System_Init();                //初始化
        void Key_Scan();      //按鍵掃描函數
        void Delay_1ms(uint z); //延時1ms函數
        void Delay_1us(uint time_us);        //延時1us函數
        void Serial_Txd(uchar *p);    //串口發送函數
        void beer();
        //-----------------------------------------------------------------------


        /************************************************************************

                                                      主函數

        *************************************************************************/
        void main()
        {
                System_Init();

                while(1)
                {
                        Key_Scan();         
                }

        }

        /***********************************************************************************

                                 延時1ms函數

        ***********************************************************************************/
        void Delay_1ms(uint z)
        {
            uint x,y;
                for(x = z;x > 0;x--)
                   for(y = 110;y >0;y--);
        }

        /***********************************************************************************

                                 延時1us函數

        ***********************************************************************************/
        void Delay_1us(uint time_us)
        {
                while(--time_us);
        }


        /************************************************************************

                                                      初始化函數

        *************************************************************************/
        void System_Init()
        {
                SCON = 0X50;
                PCON = 0X00;
                TMOD = 0X20;
                TH1 = 0XFD;
                TL1 = 0XFD;
                EA = 1;
                ES = 1;
                TR1 = 1;
        }

        /************************************************************************

                                                      串口中斷函數

        *************************************************************************/         
        void Serial_Rxd() interrupt 4
        {
                ES=0;
                if(RI)
                {
                        rev[0] = SBUF;
                        RI = 0;
                        if(rev[0] == 'm')                     //如果第一個字符是m
                        {
                                while(!RI);
                                rev[1] = SBUF;
                                RI = 0;
                                switch(rev[1])                                          //判斷第二個字符
                                {
                                        case '1':P2 = 0; P0 = 0xff; break;         //是1 第一個數碼管亮
                                        case '2':P2 = 1; P0 = 0xff; break;         //是2 第二個數碼管亮
                                        case '3':P2 = 2; P0 = 0xff; break;         //是3 第三個數碼管亮
                                        case '4':P2 = 3; P0 = 0xff; break;          //是4 第四個數碼管亮
                                }
                                

                        }else if(rev[0] == 'L')                                  //如果第一個字符是L
                            {
                                while(!RI);
                                rev[1] = SBUF;
                                RI = 0;
                                switch(rev[1])                                   //判斷第二個字符
                                {
                                        case '1':P1 = 0XFE; break;           //是1 第一個LED亮
                                        case '2':P1 = 0XFD; break;           //是2 第二個LED亮
                                        case '3':P1 = 0XFB; break;           //是3 第三個LED亮
                                        case '4':P1 = 0XF7; break;            //是4 第四個LED亮

                                }

                             }else if(rev[0] == 'b')                                       //判斷第一個字符是不是b
                               {
                                 while(!RI);
                                 rev[1] = SBUF;
                                 RI = 0;
                                 if(rev[1] == 'e')                                   //判斷第二個字符是不是e
                                {
                                        while(!RI);
                                        rev[2] = SBUF;
                                        RI = 0;                                                   
                                        if(rev[2] == 'e')                           //判斷第三個字符是不是e
                                        {
                                                while(!RI);
                                                rev[3] = SBUF;
                                                RI = 0;
                                                if(rev[3] == 'r')                  //判斷第四個字符是不是r
                                                {
                                                        beer();                          //全部是蜂鳴器響
                                                }
                
                                        }

                                }

                        }               
                }
                ES=1;

        }                                                   

        /***********************************************************************************

                                    按鍵掃描函數

        ***********************************************************************************/
        void Key_Scan()
        {
            if(k1 == 0)                                              //如果按鍵1被按下
                {
                    Delay_1ms(21);                //延時20ms
                        if(k1 == 0)                                      //按鍵1確實被按下
                        {                                                   
                                Serial_Txd(ser_text);                      //串口發送函數
                            while(!k1)                              //松手檢測
                            Delay_1ms(21);
                             while(!k1);
                        }
                }
        }


        /************************************************************************

                                                      串口發送函數

        *************************************************************************/
        void Serial_Txd(uchar *p)
        {
                uint i;
                Delay_1ms(1);
                for(i = 0;i < 30;i++)
                {
                        SBUF = *p++;
                        while(!TI);
                        TI = 0;
                }

        }

        /************************************************************************

                                                      蜂鳴器函數

        *************************************************************************/
        void beer()
        {
                uint i;
                for(i = 0;i < 1600;i++)                  //大概時間是1s
                {
                        speaker = !speaker;
                        Delay_1us(70);                 //控制發聲頻率
                
                }
        }
        - 本文內容摘錄自:MCU資訊論壇(http://www.www.9936d.com/) 詳細文章請參考:http://www.www.9936d.com/thread-1428-1-1.html
        程序寫得 真好。。。。。
        我試驗了, 將 中斷函數 換成這樣 一是好事的。。。。
        /************************************************************************

                                                      串口中斷函數

        *************************************************************************/         
        void Serial_Rxd() interrupt 4
        {
               // ES=0;
                if(RI)
                {
                        rev[0] = SBUF;
                        RI = 0;
                        if(rev[0] == 'm')                     //如果第一個字符是m
                        {
                                while(!RI);
                                rev[1] = SBUF;
                                RI = 0;
                                switch(rev[1])                                          //判斷第二個字符
                                {
                                        case '1':P2 = 0; P0 = 0xff; break;         //是1 第一個數碼管亮
                                        case '2':P2 = 1; P0 = 0xff; break;         //是2 第二個數碼管亮
                                        case '3':P2 = 2; P0 = 0xff; break;         //是3 第三個數碼管亮
                                        case '4':P2 = 3; P0 = 0xff; break;          //是4 第四個數碼管亮
                                }
                                

                        }
                        if(rev[0] == 'L')                                  //如果第一個字符是m
                        {
                                while(!RI);
                                rev[1] = SBUF;
                                RI = 0;
                                switch(rev[1])                                   //判斷第二個字符
                                {
                                        case '1':P1 = 0XFE; break;           //是1 第一個LED亮
                                        case '2':P1 = 0XFD; break;           //是2 第二個LED亮
                                        case '3':P1 = 0XFB; break;           //是3 第三個LED亮
                                        case '4':P1 = 0XF7; break;            //是4 第四個LED亮

                                }

                        }
                        if(rev[0] == 'b')                                       //判斷第一個字符是不是b
                        {
                                while(!RI);
                                rev[1] = SBUF;
                                RI = 0;
                                if(rev[1] == 'e')                                   //判斷第二個字符是不是e
                                {
                                        while(!RI);
                                        rev[2] = SBUF;
                                        RI = 0;                                                   
                                        if(rev[2] == 'e')                           //判斷第三個字符是不是e
                                        {
                                                while(!RI);
                                                rev[3] = SBUF;
                                                RI = 0;
                                                if(rev[3] == 'r')                  //判斷第四個字符是不是r
                                                {
                                                        beer();                          //全部是蜂鳴器響
                                                }
                
                                        }

                                }

                        }               
                }
              //  ES=1;

        }   
        求解。。。。。
        能說說  ES= 0 關閉串口中斷 這是什么意思嗎???
        在線等待中。。。。。
        如果ES  = 0 那么 其他的中斷在想使用 是不是就不能夠實用串口了呢????
        QQ截圖未命名.png

        QQ|手機版|MCU資訊論壇 ( 京ICP備18035221號-2 )|網站地圖

        GMT+8, 2025-5-2 13:13 , Processed in 0.040518 second(s), 8 queries , Redis On.

        Powered by Discuz! X3.5

        © 2001-2025 Discuz! Team.

        返回頂部
        亚洲av永久无码精品古装片| 国产亚洲精品拍拍拍拍拍| 国自产精品手机在线观看视| 午夜精品美女写真福利| 少妇精品无码一区二区三区| 久久亚洲AV永久无码精品| 99国产精品一区二区| 5566成人免费视频观看| 久久精品国产精品亚洲艾草网美妙| 四虎永久在线精品免费一区二区| 亚洲国产精品久久| 久久精品国产亚洲Aⅴ蜜臀色欲 | 永久免费精品视频| 亚洲日韩精品一区二区三区| 精品一区二区三区免费毛片爱| 亚洲精品国产精品国自产观看| 国产午夜福利精品久久| 久久99精品国产一区二区三区| 亚洲2022国产成人精品无码区| 国产精品毛片无遮挡| 日韩人妻无码精品久久免费一| 99久久精品国产麻豆| 国产线视频精品免费观看视频| 5566成人免费视频观看| 久久精品国产久精国产| 久久国产乱子伦免费精品| 亚洲精品免费观看| 影音先锋能看的网站| 最新国产美女肝交视频播放 | 精品久久久久久亚洲| 日韩欧美一区二区三区中文精品| 久久久无码精品亚洲日韩按摩| 伊在人亚洲香蕉精品区麻豆| 国产亚洲精品拍拍拍拍拍| xxxxx爽日本护士在线播放| 久久精品国产久精国产| 男人扎女下面很爽网站| 免费无遮挡禁18污污网站| 国产福利视精品永久免费 | 无码人妻精品一区二区三 | 亚洲综合另类小说|