找回密碼
         注冊(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.www.9936d.com/) 詳細(xì)文章請(qǐng)參考:http://www.www.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.

        返回頂部
        久久亚洲精品无码观看不卡| 国产一区二区三区精品视频| 影音先锋2020色资源网| 你懂的国产精品| 国产精品无码专区| 亚洲精品乱码久久久久久| 婷婷国产成人精品一区二| MM1313亚洲精品无码| 精品在线免费观看| 国产成人精品999在线观看| 色妞ww精品视频7777| 147西西午夜大胆视频| 亚洲欧美国产精品专区久久| 久久青青草原精品国产不卡| 中文国产成人精品久久不卡| 成人久久精品一区二区三区| 2021国产精品视频| 久久久久久一区国产精品| 无码精品A∨在线观看中文| 欧美日韩精品一区二区| 亚洲国产精品嫩草影院久久| 精品久久久久久久久久久久久久久 | 国产精品无码AV一区二区三区 | 黄网址在线播放免费| 欧美精品一区二区久久| 久久996热精品xxxx| 无码少妇精品一区二区免费动态| 亚洲精品视频在线| 91不卡在线精品国产| 337P亚洲精品色噜噜| 最新国产精品视频免费看 | 免费精品国产自产拍在线观看| 精品亚洲成a人片在线观看少妇| 人妻精品久久无码区| 久久久久久九九99精品| 国产成人精品大尺度在线观看| 亚洲国产精品久久电影欧美| 国产成人1024精品免费| 精品无码一区二区三区亚洲桃色| 国产精品久久久久乳精品爆| 精品国产呦系列在线观看免费|