久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 7831|回復: 14
收起左側

串口中斷和while循環哪個優先級高一點

[復制鏈接]
ID:228342 發表于 2017-8-20 10:31 | 顯示全部樓層 |閱讀模式
為啥一有while循環  串口中斷就接不到數據了


QQ圖片20170820103003.png QQ圖片20170820103007.png


只要前進  就停止不了了   只要一前進 任何操作都執行不了了


求大神幫助



完整程序代碼:
#include<reg52.h>
#include <string.h>
#define uchar unsigned char
#define uint unsigned int
                                               
//小車輪子接線方式:in1=p1.2 in2=p1.3 in3=p1.6 in4=p1.7

sbit wleft0=P1^2;sbit wleft1=P1^3;//左輪
sbit wright0=P1^6;sbit wright1=P1^7;//右輪

sbit d0=P1^4;sbit d1=P1^5;//右輪


bit startBit = 0;                                  //串口接收開始標志位
bit newLineReceived = 0;                 //串口一幀協議包接收完成

unsigned char inputString[50];  //接收數據協議

uchar f=1;//0為前進 1為后退
uchar al=0;
uchar ar=0;
uchar l=10;                 //左輪速度 0~20內調節,控制輸出電壓,參數過低輪子不動,注意調試。
uchar r=10;                //右輪速度 0~20內調節,控制輸出電壓,參數過低輪子不動,注意調試。



/******************************************************************/
/* 串口中斷程序*/
/******************************************************************/

void UART_SER () interrupt 4
{
        unsigned char n;         //定義臨時變量
        static int num = 0;

        if(RI)                 //判斷是接收中斷產生
        {
                RI = 0;         //標志位清零
                n = SBUF; //讀入緩沖區的值

                //control=n;
            if(n == '$')
            {
              startBit = 1;
                  num = 0;
            }
            if(startBit == 1)
            {
               inputString[num] = n;     
            }  
            if (n == '#')
            {
               newLineReceived = 1;
               startBit = 0;
            }
                num++;
                if(num >= 50)
                {
                        num = 0;
                        startBit = 0;
                        newLineReceived        = 0;
                }
        }

}


//WIFI、藍牙初始化
void WifiInit(void)
{

           SCON = 0x50;         // SCON: 模式1, 8-bit UART, 使能接收
        TMOD |= 0x20;
        TH1=0xfd;                 //波特率9600 初值
        TL1=0xfd;
        TR1= 1;
        EA = 1;                    //開總中斷
        ES= 1;                         //打開串口中斷


}



void delay_ms(uint k)//延時函數
{
uint i,j;
        for(i=0;i<k;i++)
        {
                for(j=0;j<113;j++)
                {
                ;
                }
        }

}





uint a=0;
uint i=0;
void turn_left(){         //2.5v
        while(a<15){
                  wleft0=1;
                delay_ms(10);
                wleft0=0;
                delay_ms(10);
                a++;
        }
        if(wright1==1){
                wleft0=1;       
        }else{
                wleft0=0;
        }
   a=0;
}



void round_left(){//原地左轉       
        P1=0x77;
}

void round_right(){//原地右轉
        P1=0xbb;       
}

void stop(){
        P1 = 0xff;           //關閉所有LED和風扇
       
}


void run(uint r){//前進
        while(r){
                P1=0x7b;         
        }       
}

void retreat(){//后退
        P1=0xb7;;
}


main(){
        P1 = 0xff;           //關閉所有LED和風扇
        WifiInit();

        //循環接收藍牙數據
        while(1){
                if (newLineReceived)
                   {
                        switch(inputString[1])

                        {
                                case '0':  run(0);break;//停止
                                case '1':  run(1);break;//前進
                                case '2':  retreat();break;//后退
                                case '3':  round_left();break;//原地左轉
                                case '4':  round_right();break;//原地右轉
                                case '5':  turn_left();break;
                                case '6':  ;break;//開燈
                                default:P1 = 0xff;break;
                        }
               newLineReceived = 0;  
         
            }       
        }
       
       
}




回復

使用道具 舉報

ID:123289 發表于 2017-8-20 12:17 | 顯示全部樓層
語句無優先級之分,看你把哪個寫在前面,哪個就先被執行。

評分

參與人數 1黑幣 +20 收起 理由
admin + 20 回帖助人的獎勵!

查看全部評分

回復

使用道具 舉報

ID:228342 發表于 2017-8-20 12:59 來自觸屏版 | 顯示全部樓層
yzwzfyz 發表于 2017-8-20 12:17
語句無優先級之分,看你把哪個寫在前面,哪個就先被執行。

不是語句 是串口中斷  串口中斷好像不能中斷while循環
回復

使用道具 舉報

ID:223770 發表于 2017-8-20 13:00 | 顯示全部樓層
一個中斷,一個主循環,沒有比較價值啊

評分

參與人數 1黑幣 +20 收起 理由
admin + 20 回帖助人的獎勵!

查看全部評分

回復

使用道具 舉報

ID:228342 發表于 2017-8-20 14:42 來自觸屏版 | 顯示全部樓層
常沉 發表于 2017-8-20 13:00
一個中斷,一個主循環,沒有比較價值啊

可是while一循環 串口中斷里就沒法接受藍牙數據了是咋回事啊
回復

使用道具 舉報

ID:228347 發表于 2017-8-20 15:49 | 顯示全部樓層
問題出在你這個run函數里面,里面的while循環跳不出來,不能那么寫。
void run(uint r){//前進
        while(r){
                P1=0x7b;         
        }        
}
前進過程中來串口中斷,需要做其他動作需要在這個while里面講你的r置0 跳出循環

評分

參與人數 1黑幣 +50 收起 理由
admin + 50 回帖助人的獎勵!

查看全部評分

回復

使用道具 舉報

ID:228342 發表于 2017-8-20 20:54 來自觸屏版 | 顯示全部樓層
oo0o_11 發表于 2017-8-20 15:49
問題出在你這個run函數里面,里面的while循環跳不出來,不能那么寫。
void run(uint r){//前進
        w ...

可是怎么在外部中斷這個while啊
回復

使用道具 舉報

ID:123289 發表于 2017-8-21 01:12 | 顯示全部樓層
如果WHILE不在一個更高級或等級的中斷服務程序中,必被串口中斷打斷。
回復

使用道具 舉報

ID:228342 發表于 2017-8-21 10:04 來自觸屏版 | 顯示全部樓層
yzwzfyz 發表于 2017-8-21 01:12
如果WHILE不在一個更高級或等級的中斷服務程序中,必被串口中斷打斷。

可是打斷不了啊
回復

使用道具 舉報

ID:227393 發表于 2017-8-21 10:09 來自觸屏版 | 顯示全部樓層
中斷高
回復

使用道具 舉報

ID:228342 發表于 2017-8-21 10:22 | 顯示全部樓層
oo0o_11 發表于 2017-8-20 15:49
問題出在你這個run函數里面,里面的while循環跳不出來,不能那么寫。
void run(uint r){//前進
        w ...

void run(){//前進
        while(1){
                P1=0x7b;
                if(rw==0){
                        break;
                }         
        }       
}



case '0':  rw=0;break;//停止
case '1':  rw=1;run();break;//前進

我改成這樣還是不行啊  只要一執行ruin 其他的任何操作都執行不了了
回復

使用道具 舉報

ID:228347 發表于 2017-8-21 11:13 來自觸屏版 | 顯示全部樓層
hkoos 發表于 2017-8-21 10:22
void run(){//前進
        while(1){
                P1=0x7b;

這樣寫當然不會跳出循環了,串口中斷是執行了,但是程序一直還在run函數的while(1)里面。。。沒有執行到case語句那里。兩種方法,把串口處理那部分語句寫進run函數while里面;或者,你把所有的轉動程序寫在一個函數里面,設置同一個變量,不要有循環,然后把這個函數放主函數while里面運行,串口命令去改變這個變量就好了。
回復

使用道具 舉報

ID:228699 發表于 2017-8-21 21:26 | 顯示全部樓層
中斷高的,只是進去了你這程序體現不出來,程序沒寫好。
回復

使用道具 舉報

ID:123289 發表于 2017-8-21 22:59 | 顯示全部樓層
樓主:你能證明打不斷嗎?(樓主9樓問題)。

進入匯編級調試:
在中斷處設斷點,改單步運行,執行到中斷返回RETI后,看是不是回到你的程序中去了。
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: av黄色在线观看 | 欧美日韩综合视频 | 亚洲人成人网 | 日韩国产在线观看 | 不用播放器看的av | 精品免费在线 | 亚洲一区二区高清 | 香蕉视频在线播放 | 人人干视频在线 | 国产视频福利在线观看 | 涩涩视频网站在线观看 | 日韩欧美国产精品一区二区三区 | 成人在线观看中文字幕 | 老外几下就让我高潮了 | 超碰最新在线 | 另类亚洲视频 | 亚洲欧美一区二区三区视频 | 中文字幕一区二区三区乱码在线 | 国产精品国产精品国产专区不蜜 | 亚洲综合色网站 | 欧美激情a∨在线视频播放 成人免费共享视频 | 亚洲一区二区三区桃乃木香奈 | 欧美精品成人影院 | 亚洲一区不卡在线 | 最新国产精品视频 | 亚洲视频在线观看 | 国产99热在线 | 91精品在线播放 | 在线中文字幕亚洲 | 91麻豆精品国产91久久久久久 | 日韩欧美国产一区二区 | 国产二区精品视频 | 久久精品91久久久久久再现 | 一区在线观看 | 国产精品a久久久久 | 偷牌自拍 | 天天操网| 精品国产一区探花在线观看 | 美女福利网站 | 亚洲人人 | 毛片入口 |