找回密碼
         注冊(cè)會(huì)員
        搜索附件  

        任務(wù)5.rar

         

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



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

              說(shuō)明:本程序主要完成上位機(jī)發(fā)送字符給單片機(jī)控制外圍器件的任務(wù)
                  時(shí)間: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?";

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


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

                                                      主函數(shù)

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

                while(1)
                {
                        Key_Scan();        
                }

        }

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

                                 延時(shí)1ms函數(shù)

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

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

                                 延時(shí)1us函數(shù)

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


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

                                                      初始化函數(shù)

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

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

                                                      串口中斷函數(shù)

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

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

                                }

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

                                }

                        }               
                }
                ES=1;

        }                                                  

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

                                    按鍵掃描函數(shù)

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


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

                                                      串口發(fā)送函數(shù)

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

        }

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

                                                      蜂鳴器函數(shù)

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

              說(shuō)明:本程序主要完成上位機(jī)發(fā)送字符給單片機(jī)控制外圍器件的任務(wù)
                  時(shí)間: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?";

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


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

                                                      主函數(shù)

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

                while(1)
                {
                        Key_Scan();         
                }

        }

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

                                 延時(shí)1ms函數(shù)

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

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

                                 延時(shí)1us函數(shù)

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


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

                                                      初始化函數(shù)

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

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

                                                      串口中斷函數(shù)

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

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

                                }

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

                                }

                        }               
                }
                ES=1;

        }                                                   

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

                                    按鍵掃描函數(shù)

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


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

                                                      串口發(fā)送函數(shù)

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

        }

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

                                                      蜂鳴器函數(shù)

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

                                                      串口中斷函數(shù)

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

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

                                }

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

                                }

                        }               
                }
              //  ES=1;

        }   
        求解。。。。。
        能說(shuō)說(shuō)  ES= 0 關(guān)閉串口中斷 這是什么意思嗎???
        在線等待中。。。。。
        如果ES  = 0 那么 其他的中斷在想使用 是不是就不能夠?qū)嵱么诹四兀浚浚浚?/div>

        QQ|手機(jī)版|MCU資訊論壇 ( 京ICP備18035221號(hào)-2 )|網(wǎng)站地圖

        GMT+8, 2025-3-18 11:27 , Processed in 0.041137 second(s), 8 queries , Redis On.

        Powered by Discuz! X3.5

        © 2001-2024 Discuz! Team.

        返回頂部
        无码日韩精品一区二区免费暖暖| 国产精品国产三级国产AⅤ| 成人国内精品久久久久影院VR| 最新亚洲精品国自产在线观看| 国产精品一区在线观看你懂的| 日韩精品一区二区三区中文字幕| 日本高清在线精品一区二区三区| 国产精品熟女一区二区| 国产精品成人精品久久久| 亚洲宅男精品一区在线观看| 国产精品网站在线观看免费传媒| 98香蕉草草视频在线精品看| 午夜福利麻豆国产精品 | 亚洲日韩国产精品乱| 久久丫精品国产亚洲av不卡| 午夜精品在线观看| 一级做a爰黑人又硬又粗免费看51社区国产精品视 | 亚洲国产精品无码久久九九| 精品久久久久久无码专区| 国产精品狼人久久久久影院| xx视频在线永久免费观看| 久久亚洲精品视频| 一区二区三区免费在线| 国产精品久久亚洲不卡动漫| 四虎国产精品永久在线无码| 国产精品成人A区在线观看| 久久人搡人人玩人妻精品首页 | 国产精品成人国产乱一区| 好大用力深一点动态图| 亚洲一二成人精品区| 日韩电影中文字幕| 青青青青久久精品国产| 一本一本久久A久久综合精品| 亚洲精品在线观看视频| 99国产牛牛视频在线网站| 国产成人精品日本亚洲专区| 亚洲色精品88色婷婷七月丁香| 国产精品 视频一区 二区三区| 亚洲国产精品无码久久98| 国产VA免费精品高清在线| 欧美精品videosse精子|