找回密碼
         注冊會員
        搜索附件  
        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区 | 亚洲精品无码MV在线观看| 日韩精品亚洲人成在线播放| 亚洲精品卡2卡3卡4卡5卡区| 精品性影院一区二区三区内射| 久久99国产精品一区二区| 久久精品国产99久久香蕉| 中文字幕一精品亚洲无线一区| 国产成人久久精品一区二区三区| 四虎国产精品永久地址49| 国产亚洲曝欧美不卡精品| 深夜福利视频网站| 99热精品在线观看| 久久99精品国产麻豆蜜芽| 亚洲欧洲国产精品香蕉网| 精品乱人伦一区二区三区| 亚洲AV成人精品日韩一区18p| 久久精品无码专区免费青青 | 亚洲一区无码精品色| 国产午夜精品无码| 国产综合精品蜜芽| 日产精品久久久久久久| 国产VA免费精品高清在线| 亚洲2022国产成人精品无码区| 欧美韩国精品另类综合| 亚洲精品视频免费观看| 91精品国产高清91久久久久久| 精品无码久久久久久久久久| 久久亚洲日韩精品一区二区三区 | 日韩美女免费福利视频| 国内精品免费在线观看| 中文字幕无码久久精品青草| 国产亚洲福利精品一区| 亚洲精品国产日韩无码AV永久免费网 | 蜜桃麻豆www久久国产精品 | 国产一区二区精品久久凹凸| chinesetube国产在线观看| 777国产盗摄偷窥精品0OOO| 美女扒开尿口给男人桶动态图| 色花堂国产精品第一页| 国产亚洲一区二区三区不卡|