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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 6031|回復(fù): 25
打印 上一主題 下一主題
收起左側(cè)

51單片機調(diào)用兩個子程序,為什么只能運行其中一個程序。

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:130231 發(fā)表于 2020-2-29 00:50 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
一個是中斷,一個是藍牙。就只能運行放其中第一個。第二個就沒反應(yīng)。調(diào)一下位置還一樣效果.有那位工程師遇到過這樣的問題。請求解答一下。謝謝!
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報

沙發(fā)
ID:235200 發(fā)表于 2020-2-29 02:04 | 只看該作者
如果設(shè)置了中斷,且中斷服務(wù)程序設(shè)置了向量地址,該函數(shù)是不需要被主程序調(diào) 用的,只要達到中斷的條件就能運行,與你所說的“藍牙”程序調(diào)用不是一回事,你提到只運行一個,是不是只運行中斷程序呢?中斷程序當(dāng)然與你設(shè)置的調(diào)用順序無關(guān)
回復(fù)

使用道具 舉報

板凳
ID:130231 發(fā)表于 2020-2-29 14:00 來自手機 | 只看該作者
它是調(diào)用中斷功能主程序,并不是中斷函數(shù),本來兩功可以獨立運行,我將它們原本兩個主程序改成函數(shù)方式調(diào)用合在一塊的,內(nèi)部while循環(huán)沒有改,可能是程序運第一個while ,就不往下運行了。
回復(fù)

使用道具 舉報

地板
ID:130231 發(fā)表于 2020-2-29 16:11 | 只看該作者
csmyldl 發(fā)表于 2020-2-29 02:04
如果設(shè)置了中斷,且中斷服務(wù)程序設(shè)置了向量地址,該函數(shù)是不需要被主程序調(diào) 用的,只要達到中斷的條件就能 ...

沒有直接調(diào)用該中斷函數(shù)。請看樓下我的描述。
回復(fù)

使用道具 舉報

5#
ID:235200 發(fā)表于 2020-2-29 17:49 | 只看該作者
zqy181818 發(fā)表于 2020-2-29 16:11
沒有直接調(diào)用該中斷函數(shù)。請看樓下我的描述。

那得看你具體的代碼,你這樣描述是想象不到的
回復(fù)

使用道具 舉報

6#
ID:130231 發(fā)表于 2020-2-29 20:04 | 只看該作者
csmyldl 發(fā)表于 2020-2-29 17:49
那得看你具體的代碼,你這樣描述是想象不到的

#include<reg52.h>
#define uchar unsigned char
#define uint  unsigned int
uchar buf[10]=0;  //接收緩存數(shù)組
uchar  r_x=0;//接收計數(shù)
uchar  r_flag=0;//接收成功標(biāo)志
uchar tt=0;//定時器變量
uchar num=0;//定時的計時變量
uchar flag=0;//標(biāo)志位
sbit DA =  P0^1;//上一曲
sbit DB =  P0^2;//下一曲
sbit DC =  P0^3;//單曲&循環(huán)
sbit DD =  P0^4;//播放&暫停
sbit DE =  P0^5;//播放第一首且不可觸發(fā)
sbit DF =  P0^6;//布防  (允許紅外信號接入)
void lanya();
void  bufang();

uchar read_data(void)//讀取接收數(shù)據(jù)
{

   uchar tep = 0;
   if(r_flag == 1)
   {
    r_flag = 0;
    tep = buf[2];

        }      
   return tep;
}
void uart_init()
{
  TMOD=0x20;
  TH1=0xfd;          //波特率9600
  TL1=0xfA;
  TR1=1;
  SM0=0;
  SM1=1;
  REN=1;
  EA=1;
  ES=1;
}
void main()
  {
  DA=1;
  DB=1;                                                                                                                                                                                                                                                  
  DC=1;
  DD=1;
  DE=1;
  DF=1;
  
             while(1)
           {
                 lanya();  
         bufang();
                 }
                 
                    
         
         }
          



void lanya()   //手機藍牙控制
{
  uchar key=0;
  uart_init(); //串口初始化
  
   
//  SPK=1;//蜂鳴器關(guān)
  DA=1;
  DB=1;
  DC=1;
  DD=1;
  DE=1;
  DF=1;
     while(1)
         {
          key = read_data();//讀取接收數(shù)據(jù)
        if(key == 'A') DA =0;//打開
        else if(key == 'B') DA =1;//關(guān)閉
        else if(key == 'C') DB =0;//打開
        else if(key == 'D') DB =1;//關(guān)閉
        else if(key == 'E') DC =0;//打開
        else if(key == 'F') DC =1;//關(guān)閉
        else if(key == 'G') DD =0;//打開
        else if(key == 'H') DD =1;//關(guān)閉
        else if(key == 'J') DE =0;//打開                                                                                            
        else if(key == 'K') DE =1;//關(guān)閉
        else if(key == 'M') DF =0;//打開
        else if(key == 'N') DF =1;//關(guān)閉
  }
  
}       
void ser()interrupt 4  //接收中斷
{
   RI=0; //清除接收標(biāo)志
   buf[r_x] = SBUF;//接收數(shù)據(jù)至緩存區(qū)
   r_x++;
   if(buf[0]!='O'){r_x=0;}
   if(r_x == 3)        //接收完成
   {
    r_x=0;
        r_flag=1;
   }

}
   /********************************************************************
                            定時器1函數(shù)
*********************************************************************/
void timer1init(void)//定時器1,16位方式2
{        EA=0;
    TMOD=0x11;//設(shè)置定時器0為工作方式1
        TH0=(65536-10000)/256;
        TL0=(65536-10000)%256;
        ET0=1;//開定時器0中斷
        TR0=1;//啟動定時器0
        tt=0;//
        EA=0;//關(guān)總中斷
}       
   /********************************************************************
                         中斷函數(shù)   
*********************************************************************/
void time0() interrupt 1
{
        TH0=(65536-50000)/256;
        TL0=(65536-50000)%256;
        tt++;
        if(tt==10)
          {tt=0; num++;
          }
        if((flag==2)&&(num==30))//布防時間,num=30即15秒,可以更改此實現(xiàn)布防延遲時間
           flag=4;

          
}
void  bufang()//布防函數(shù)     
{            
   timer1init();//初始化定時器
   DE =1;
   
                           while(1)
                        {
                    if(flag==4)//如果布防時間到
                          {
                           tt=0;//清計數(shù)為0
                           EA=0;//關(guān)中斷
                           num=0;//記的秒數(shù)清零
                           flag=5;//flag等于5

                          }       
                        if(DF)//如果感應(yīng)到人
                       
                         DE =0;         //        播放第一首且不可觸發(fā)
                          else DE =1;
                       
                        if(flag==5)//如果flag等于5
                           {
                             if(DF)//如果感應(yīng)到人
                                   {
                                     DE =0;
                                      EA=1;//開中斷
                                         

                                    }
                           }
        }          
         
   }
       
/********************************************************************
                              結(jié)束
*********************************************************************/
回復(fù)

使用道具 舉報

7#
ID:342451 發(fā)表于 2020-3-1 09:56 | 只看該作者
你兩個子函數(shù)里都帶著while(1),當(dāng)然只能執(zhí)行一個了,while(1)都沒法跳出去,他只會按照默認順序走第一個
回復(fù)

使用道具 舉報

8#
ID:130231 發(fā)表于 2020-3-1 15:03 | 只看該作者
之一知足 發(fā)表于 2020-3-1 09:56
你兩個子函數(shù)里都帶著while(1),當(dāng)然只能執(zhí)行一個了,while(1)都沒法跳出去,他只會按照默認順序走第一 ...

你有什么好的建義。說說看看。如果沒有while功能沒有了。更別說運行一個。
回復(fù)

使用道具 舉報

9#
ID:235200 發(fā)表于 2020-3-1 17:23 | 只看該作者
zqy181818 發(fā)表于 2020-3-1 15:03
你有什么好的建義。說說看看。如果沒有while功能沒有了。更別說運行一個。

被調(diào)用的子函數(shù)里均不能有while(1)無限循環(huán),如果要有,可以加上時間的與,如while(time--),事先給time一個合適的值
回復(fù)

使用道具 舉報

10#
ID:155507 發(fā)表于 2020-3-1 18:22 | 只看該作者
給你改了,對比一下就知道哪里改了。

  1. #include <reg52.h>
  2. #define uchar unsigned char
  3. #define uint  unsigned int
  4. uchar buf[10]=0;  //接收緩存數(shù)組
  5. uchar  r_x=0;//接收計數(shù)
  6. uchar  r_flag=0;//接收成功標(biāo)志
  7. uchar tt=0;//定時器變量
  8. uchar num=0;//定時的計時變量
  9. uchar flag=0;//標(biāo)志位
  10. sbit DA =  P0^1;//上一曲
  11. sbit DB =  P0^2;//下一曲
  12. sbit DC =  P0^3;//單曲&循環(huán)
  13. sbit DD =  P0^4;//播放&暫停
  14. sbit DE =  P0^5;//播放第一首且不可觸發(fā)
  15. sbit DF =  P0^6;//布防  (允許紅外信號接入)
  16. void lanya();
  17. void  bufang();

  18. uchar read_data(void)//讀取接收數(shù)據(jù)
  19. {

  20.         uchar tep = 0;
  21.         if(r_flag == 1)
  22.         {
  23.                 r_flag = 0;
  24.                 tep = buf[2];

  25.         }      
  26.         return tep;
  27. }
  28. void uart_init()
  29. {
  30.         TMOD=0x20;
  31.         TH1=0xfd;          //波特率9600
  32.         TL1=0xfA;
  33.         TR1=1;
  34.         SM0=0;
  35.         SM1=1;
  36.         REN=1;
  37.         EA=1;
  38.         ES=1;
  39. }
  40. void main()
  41. {
  42.         uchar key=0;
  43.         uart_init(); //串口初始化


  44.         //  SPK=1;//蜂鳴器關(guān)
  45.         DA=1;
  46.         DB=1;
  47.         DC=1;
  48.         DD=1;
  49.         DE=1;
  50.         DF=1;
  51.         DA=1;
  52.         DB=1;
  53.        
  54.         DC=1;
  55.         DD=1;
  56.         DE=1;
  57.         DF=1;
  58.        
  59.         timer1init();//初始化定時器
  60.         DE =1;

  61.         while(1)
  62.         {
  63.                 lanya();  
  64.                 bufang();
  65.         }
  66.        
  67. }




  68. void lanya()   //手機藍牙控制
  69. {

  70. //        while(1)
  71. //        {
  72.                 key = read_data();//讀取接收數(shù)據(jù)
  73.                 if(key == 'A') DA =0;//打開
  74.                 else if(key == 'B') DA =1;//關(guān)閉
  75.                 else if(key == 'C') DB =0;//打開
  76.                 else if(key == 'D') DB =1;//關(guān)閉
  77.                 else if(key == 'E') DC =0;//打開
  78.                 else if(key == 'F') DC =1;//關(guān)閉
  79.                 else if(key == 'G') DD =0;//打開
  80.                 else if(key == 'H') DD =1;//關(guān)閉
  81.                 else if(key == 'J') DE =0;//打開                                                                                            
  82.                 else if(key == 'K') DE =1;//關(guān)閉
  83.                 else if(key == 'M') DF =0;//打開
  84.                 else if(key == 'N') DF =1;//關(guān)閉
  85. //        }

  86. }      
  87. void ser()interrupt 4  //接收中斷
  88. {
  89.         RI=0; //清除接收標(biāo)志
  90.         buf[r_x] = SBUF;//接收數(shù)據(jù)至緩存區(qū)
  91.         r_x++;
  92.         if(buf[0]!='O'){r_x=0;}
  93.         if(r_x == 3)        //接收完成
  94.         {
  95.                 r_x=0;
  96.                 r_flag=1;
  97.         }

  98. }
  99. /********************************************************************
  100.                                                         定時器1函數(shù)
  101. *********************************************************************/
  102. void timer1init(void)//定時器1,16位方式2
  103. {        EA=0;
  104.         TMOD=0x11;//設(shè)置定時器0為工作方式1
  105.         TH0=(65536-10000)/256;
  106.         TL0=(65536-10000)%256;
  107.         ET0=1;//開定時器0中斷
  108.         TR0=1;//啟動定時器0
  109.         tt=0;//
  110.         EA=0;//關(guān)總中斷
  111. }      
  112. /********************************************************************
  113.                                                 中斷函數(shù)   
  114. *********************************************************************/
  115. void time0() interrupt 1
  116. {
  117.         TH0=(65536-50000)/256;
  118.         TL0=(65536-50000)%256;
  119.         tt++;
  120.         if(tt==10)
  121.         {tt=0; num++;
  122.         }
  123.         if((flag==2)&&(num==30))//布防時間,num=30即15秒,可以更改此實現(xiàn)布防延遲時間
  124.         flag=4;

  125.        
  126. }
  127. void  bufang()//布防函數(shù)     
  128. {            

  129. //        while(1)
  130. //        {
  131.                 if(flag==4)//如果布防時間到
  132.                 {
  133.                         tt=0;//清計數(shù)為0
  134.                         EA=0;//關(guān)中斷
  135.                         num=0;//記的秒數(shù)清零
  136.                         flag=5;//flag等于5

  137.                 }      
  138.                 if(DF)//如果感應(yīng)到人
  139.                
  140.                 DE =0;         //        播放第一首且不可觸發(fā)
  141.                 else DE =1;
  142.                
  143.                 if(flag==5)//如果flag等于5
  144.                 {
  145.                         if(DF)//如果感應(yīng)到人
  146.                         {
  147.                                 DE =0;
  148.                                 EA=1;//開中斷

  149.                         }
  150.                 }
  151. //        }         
  152.        
  153. }

  154. /********************************************************************
  155.                                                         結(jié)束
  156. *********************************************************************/

復(fù)制代碼

回復(fù)

使用道具 舉報

11#
ID:159575 發(fā)表于 2020-3-1 18:22 來自手機 | 只看該作者
死循環(huán)啊,當(dāng)然不行
回復(fù)

使用道具 舉報

12#
ID:159575 發(fā)表于 2020-3-1 18:24 來自手機 | 只看該作者
把兩個while都去掉
回復(fù)

使用道具 舉報

13#
ID:687694 發(fā)表于 2020-3-1 20:36 | 只看該作者
兩個子函數(shù)中的while都去掉吧,三個while(1)!!
回復(fù)

使用道具 舉報

14#
ID:130231 發(fā)表于 2020-3-1 21:29 | 只看該作者
angmall 發(fā)表于 2020-3-1 18:22
給你改了,對比一下就知道哪里改了。

怎么不知道啊,那樣不行的,你自己編譯一下。
回復(fù)

使用道具 舉報

15#
ID:130231 發(fā)表于 2020-3-1 23:59 來自手機 | 只看該作者
csmyldl 發(fā)表于 2020-3-1 17:23
被調(diào)用的子函數(shù)里均不能有while(1)無限循環(huán),如果要有,可以加上時間的與,如while(time--),事先給time一個 ...

理論可行,可是藍牙又不干事了。只有中斷在努力。不知道是量沒給夠還是什么。
回復(fù)

使用道具 舉報

16#
ID:697884 發(fā)表于 2020-3-2 09:01 | 只看該作者
void lanya()   //手機藍牙控制這個函數(shù)不能要,把藍牙的處理加在void ser()interrupt 4  中斷函數(shù)里面。
void ser()interrupt 4  //½óêÕÖD¶Ï
{
   RI=0; //Çå3y½óêÕ±êÖ¾
   buf[r_x] = SBUF;//½óêÕêy¾YÖá»o′æÇø
   r_x++;
   if(buf[0]!='O'){r_x=0;}
   if(r_x == 3)        //½óêÕíê3é
   {
    r_x=0;
        r_flag=1;
   }
   if(r_flag==1)
   {
        r_flag=0;
        if(buf[2] == 'A') DA =0;//′ò¿a
        else if(buf[2] == 'B') DA =1;//1رÕ
        else if(buf[2] == 'C') DB =0;//′ò¿a
        else if(buf[2] == 'D') DB =1;//1رÕ
        else if(buf[2] == 'E') DC =0;//′ò¿a
        else if(buf[2] == 'F') DC =1;//1رÕ
        else if(buf[2] == 'G') DD =0;//′ò¿a
        else if(buf[2] == 'H') DD =1;//1رÕ
        else if(buf[2] == 'J') DE =0;//′ò¿a                                                                                            
        else if(buf[2] == 'K') DE =1;//1رÕ
        else if(buf[2] == 'M') DF =0;//′ò¿a
        else if(buf[2] == 'N') DF =1;//1رÕ
      
   }
}
藍牙的功能,中斷就處理完了。不需要在主函數(shù)里面去循環(huán)的查找
void lanya()   //êÖ»úà¶Ñà¿ØÖÆ
{
  uchar key=0;
  uart_init(); //′®¿ú3õê¼»ˉ
  
   
//  SPK=1;//·äÃùÆ÷1Ø
  DA=1;
  DB=1;
  DC=1;
  DD=1;
  DE=1;
  DF=1;
  
  
  void main()
  {
  DA=1;
  DB=1;                                                                                                                                                                                                                                                  
  DC=1;
  DD=1;
  DE=1;
  DF=1;
  uart_init();
             while(1)
           {
              //   lanya();  
         bufang();
                 }
                 
                    
         
         }
主函數(shù)去掉藍牙檢測函數(shù)。你這樣去測試下,應(yīng)該問題不大了。
回復(fù)

使用道具 舉報

17#
ID:130231 發(fā)表于 2020-3-3 00:06 來自手機 | 只看該作者
lyl44 發(fā)表于 2020-3-1 18:22
死循環(huán)啊,當(dāng)然不行

理解的
回復(fù)

使用道具 舉報

18#
ID:130231 發(fā)表于 2020-3-3 00:07 來自手機 | 只看該作者
之一知足 發(fā)表于 2020-3-1 09:56
你兩個子函數(shù)里都帶著while(1),當(dāng)然只能執(zhí)行一個了,while(1)都沒法跳出去,他只會按照默認順序走第一 ...

你說的很對!
回復(fù)

使用道具 舉報

19#
ID:130231 發(fā)表于 2020-3-3 00:11 來自手機 | 只看該作者
lyl44 發(fā)表于 2020-3-1 18:24
把兩個while都去掉

直接去了是不行的
回復(fù)

使用道具 舉報

20#
ID:130231 發(fā)表于 2020-3-3 18:09 | 只看該作者
yxh1999 發(fā)表于 2020-3-2 09:01
void lanya()   //手機藍牙控制這個函數(shù)不能要,把藍牙的處理加在void ser()interrupt 4  中斷函數(shù)里面。
...

你把藍牙改了!,單獨使用都成問題啊。更別說配合  bufang()運行了。
回復(fù)

使用道具 舉報

21#
ID:697884 發(fā)表于 2020-3-4 09:40 | 只看該作者
謝謝回復(fù)。又仔細看了下你的代碼,覺得問題還是很多的。uchar flag=0;//這個變量你怎么處理的,沒有哪里在自加跟自減,賦值0,時間中斷里面等2的時候賦值4, bufang();函數(shù)里面判斷4跟5,感覺你的 bufang();函數(shù)永遠都不會起作用啊,因為這個變量一直都是0啊。我的解決思路就是串口判斷你放在中斷里面去執(zhí)行, bufang();你放在主循環(huán)里面,這樣 while(1)沒啥關(guān)系。你要注意中斷的開關(guān), EA=0;//關(guān)中斷關(guān)了后,你的串口中斷也關(guān)閉了。串口中斷你可以一直打開。時間中斷你按自己的需要開關(guān)。
回復(fù)

使用道具 舉報

22#
ID:130231 發(fā)表于 2020-3-4 14:49 | 只看該作者
yxh1999 發(fā)表于 2020-3-4 09:40
謝謝回復(fù)。又仔細看了下你的代碼,覺得問題還是很多的。uchar flag=0;//這個變量你怎么處理的,沒有哪里在 ...

首先謝謝你!這么熱情的回復(fù)。bufang();單獨使用是可以用的。flag是個標(biāo)志。4跟5放在程序,時間段的標(biāo)志而已。判斷就可以知道時間到哪了。不用自加跟自減的。《你要注意中斷的開關(guān), EA=0;//關(guān)中斷關(guān)了后,你的串口中斷也關(guān)閉了。》這句你說對了。。。bufang();調(diào)用是要注意 EA=0.l因為共用會有影響。
回復(fù)

使用道具 舉報

23#
ID:679425 發(fā)表于 2020-3-4 15:03 | 只看該作者
如果沒有while功能沒有了。更別說運行一個。
回復(fù)

使用道具 舉報

24#
ID:697884 發(fā)表于 2020-3-5 09:24 | 只看該作者
主要是我沒有明白flag這個變量是怎么變化的。
    if((flag==2)&&(num==30))//布防時間,num=30即15秒,可以更改此實現(xiàn)布防延遲時間
           flag=4;
可以理解為flag等于2了才能觸發(fā)flag等于4,后面的函數(shù)里面flag等于4了才能得到flag等于5.那flag怎么得到2的。那是不是說flag相關(guān)的代碼都是沒有用的了。是不是可以這樣理解。
回復(fù)

使用道具 舉報

25#
ID:130231 發(fā)表于 2020-3-5 15:12 | 只看該作者
yxh1999 發(fā)表于 2020-3-5 09:24
主要是我沒有明白flag這個變量是怎么變化的。
    if((flag==2)&&(num==30))//布防時間,num=30即15秒,可 ...

可以的。你明白就好。一時大意沒有查到這個放標(biāo)志程序沒有復(fù)制過去。當(dāng)時做程序要求上電就可以運行。后來才加上這個控件的,想在手機上控制的。合成后一直在考慮while問題。沒有在意這個。現(xiàn)在主要問題是如何讓他們同時運行。
回復(fù)

使用道具 舉報

26#
ID:767726 發(fā)表于 2020-6-2 18:55 | 只看該作者
大佬可不可以分享一下電子幸運轉(zhuǎn)盤的單片機程序阿 供學(xué)習(xí)使用
回復(fù)

使用道具 舉報

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

本版積分規(guī)則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 国产午夜精品一区二区三区在线观看 | 国产无人区一区二区三区 | 日韩中出 | av免费网址 | 成人国产精品久久久 | 在线观看亚洲精品视频 | 午夜a级理论片915影院 | 日韩精品一区二区三区第95 | 欧美激情一区 | 欧美在线观看一区 | 国产a一区二区 | 午夜一区二区三区在线观看 | 国产专区在线 | 国产成人免费视频网站视频社区 | 亚洲欧美一区二区三区视频 | 久久久久免费观看 | 91看片免费版 | 成人中文字幕在线观看 | 精品日韩一区二区 | 欧美一区二区三区精品 | 日韩国产精品一区二区三区 | 亚洲综合天堂网 | 国产一区二区视频免费在线观看 | 日韩一二三 | 国产在线观看一区 | 黄色片a级 | 老外黄色一级片 | 欧美高清视频在线观看 | 亚洲一区二区网站 | 国产99视频精品免费播放照片 | 爱爱视频日本 | 亚洲国产成人精品久久久国产成人一区 | 国产中文一区二区三区 | 亚洲精选一区 | 欧美精品tv| 久久伊人精品 | 粉嫩国产精品一区二区在线观看 | 99亚洲精品| 国产精品视频在线播放 | 日韩av大片免费看 | 久久精品国产久精国产 |