欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

標題: 51單片機調用兩個子程序,為什么只能運行其中一個程序。 [打印本頁]

作者: zqy181818    時間: 2020-2-29 00:50
標題: 51單片機調用兩個子程序,為什么只能運行其中一個程序。
一個是中斷,一個是藍牙。就只能運行放其中第一個。第二個就沒反應。調一下位置還一樣效果.有那位工程師遇到過這樣的問題。請求解答一下。謝謝!

作者: csmyldl    時間: 2020-2-29 02:04
如果設置了中斷,且中斷服務程序設置了向量地址,該函數是不需要被主程序調 用的,只要達到中斷的條件就能運行,與你所說的“藍牙”程序調用不是一回事,你提到只運行一個,是不是只運行中斷程序呢?中斷程序當然與你設置的調用順序無關
作者: zqy181818    時間: 2020-2-29 14:00
它是調用中斷功能主程序,并不是中斷函數,本來兩功可以獨立運行,我將它們原本兩個主程序改成函數方式調用合在一塊的,內部while循環沒有改,可能是程序運第一個while ,就不往下運行了。
作者: zqy181818    時間: 2020-2-29 16:11
csmyldl 發表于 2020-2-29 02:04
如果設置了中斷,且中斷服務程序設置了向量地址,該函數是不需要被主程序調 用的,只要達到中斷的條件就能 ...

沒有直接調用該中斷函數。請看樓下我的描述。
作者: csmyldl    時間: 2020-2-29 17:49
zqy181818 發表于 2020-2-29 16:11
沒有直接調用該中斷函數。請看樓下我的描述。

那得看你具體的代碼,你這樣描述是想象不到的
作者: zqy181818    時間: 2020-2-29 20:04
csmyldl 發表于 2020-2-29 17:49
那得看你具體的代碼,你這樣描述是想象不到的

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

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

   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;//蜂鳴器關
  DA=1;
  DB=1;
  DC=1;
  DD=1;
  DE=1;
  DF=1;
     while(1)
         {
          key = read_data();//讀取接收數據
        if(key == 'A') DA =0;//打開
        else if(key == 'B') DA =1;//關閉
        else if(key == 'C') DB =0;//打開
        else if(key == 'D') DB =1;//關閉
        else if(key == 'E') DC =0;//打開
        else if(key == 'F') DC =1;//關閉
        else if(key == 'G') DD =0;//打開
        else if(key == 'H') DD =1;//關閉
        else if(key == 'J') DE =0;//打開                                                                                            
        else if(key == 'K') DE =1;//關閉
        else if(key == 'M') DF =0;//打開
        else if(key == 'N') DF =1;//關閉
  }
  
}       
void ser()interrupt 4  //接收中斷
{
   RI=0; //清除接收標志
   buf[r_x] = SBUF;//接收數據至緩存區
   r_x++;
   if(buf[0]!='O'){r_x=0;}
   if(r_x == 3)        //接收完成
   {
    r_x=0;
        r_flag=1;
   }

}
   /********************************************************************
                            定時器1函數
*********************************************************************/
void timer1init(void)//定時器1,16位方式2
{        EA=0;
    TMOD=0x11;//設置定時器0為工作方式1
        TH0=(65536-10000)/256;
        TL0=(65536-10000)%256;
        ET0=1;//開定時器0中斷
        TR0=1;//啟動定時器0
        tt=0;//
        EA=0;//關總中斷
}       
   /********************************************************************
                         中斷函數   
*********************************************************************/
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秒,可以更改此實現布防延遲時間
           flag=4;

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

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

                                    }
                           }
        }          
         
   }
       
/********************************************************************
                              結束
*********************************************************************/
作者: 之一知足    時間: 2020-3-1 09:56
你兩個子函數里都帶著while(1),當然只能執行一個了,while(1)都沒法跳出去,他只會按照默認順序走第一個
作者: zqy181818    時間: 2020-3-1 15:03
之一知足 發表于 2020-3-1 09:56
你兩個子函數里都帶著while(1),當然只能執行一個了,while(1)都沒法跳出去,他只會按照默認順序走第一 ...

你有什么好的建義。說說看看。如果沒有while功能沒有了。更別說運行一個。
作者: csmyldl    時間: 2020-3-1 17:23
zqy181818 發表于 2020-3-1 15:03
你有什么好的建義。說說看看。如果沒有while功能沒有了。更別說運行一個。

被調用的子函數里均不能有while(1)無限循環,如果要有,可以加上時間的與,如while(time--),事先給time一個合適的值
作者: angmall    時間: 2020-3-1 18:22
給你改了,對比一下就知道哪里改了。

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

  18. uchar read_data(void)//讀取接收數據
  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;//蜂鳴器關
  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();//讀取接收數據
  73.                 if(key == 'A') DA =0;//打開
  74.                 else if(key == 'B') DA =1;//關閉
  75.                 else if(key == 'C') DB =0;//打開
  76.                 else if(key == 'D') DB =1;//關閉
  77.                 else if(key == 'E') DC =0;//打開
  78.                 else if(key == 'F') DC =1;//關閉
  79.                 else if(key == 'G') DD =0;//打開
  80.                 else if(key == 'H') DD =1;//關閉
  81.                 else if(key == 'J') DE =0;//打開                                                                                            
  82.                 else if(key == 'K') DE =1;//關閉
  83.                 else if(key == 'M') DF =0;//打開
  84.                 else if(key == 'N') DF =1;//關閉
  85. //        }

  86. }      
  87. void ser()interrupt 4  //接收中斷
  88. {
  89.         RI=0; //清除接收標志
  90.         buf[r_x] = SBUF;//接收數據至緩存區
  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函數
  101. *********************************************************************/
  102. void timer1init(void)//定時器1,16位方式2
  103. {        EA=0;
  104.         TMOD=0x11;//設置定時器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;//關總中斷
  111. }      
  112. /********************************************************************
  113.                                                 中斷函數   
  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秒,可以更改此實現布防延遲時間
  124.         flag=4;

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

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

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

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

  154. /********************************************************************
  155.                                                         結束
  156. *********************************************************************/

復制代碼


作者: lyl44    時間: 2020-3-1 18:22
死循環啊,當然不行
作者: lyl44    時間: 2020-3-1 18:24
把兩個while都去掉
作者: lovexulu    時間: 2020-3-1 20:36
兩個子函數中的while都去掉吧,三個while(1)!!
作者: zqy181818    時間: 2020-3-1 21:29
angmall 發表于 2020-3-1 18:22
給你改了,對比一下就知道哪里改了。

怎么不知道啊,那樣不行的,你自己編譯一下。
作者: zqy181818    時間: 2020-3-1 23:59
csmyldl 發表于 2020-3-1 17:23
被調用的子函數里均不能有while(1)無限循環,如果要有,可以加上時間的與,如while(time--),事先給time一個 ...

理論可行,可是藍牙又不干事了。只有中斷在努力。不知道是量沒給夠還是什么。
作者: yxh1999    時間: 2020-3-2 09:01
void lanya()   //手機藍牙控制這個函數不能要,把藍牙的處理加在void ser()interrupt 4  中斷函數里面。
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رÕ
      
   }
}
藍牙的功能,中斷就處理完了。不需要在主函數里面去循環的查找
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();
                 }
                 
                    
         
         }
主函數去掉藍牙檢測函數。你這樣去測試下,應該問題不大了。
作者: zqy181818    時間: 2020-3-3 00:06
lyl44 發表于 2020-3-1 18:22
死循環啊,當然不行

理解的
作者: zqy181818    時間: 2020-3-3 00:07
之一知足 發表于 2020-3-1 09:56
你兩個子函數里都帶著while(1),當然只能執行一個了,while(1)都沒法跳出去,他只會按照默認順序走第一 ...

你說的很對!
作者: zqy181818    時間: 2020-3-3 00:11
lyl44 發表于 2020-3-1 18:24
把兩個while都去掉

直接去了是不行的
作者: zqy181818    時間: 2020-3-3 18:09
yxh1999 發表于 2020-3-2 09:01
void lanya()   //手機藍牙控制這個函數不能要,把藍牙的處理加在void ser()interrupt 4  中斷函數里面。
...

你把藍牙改了!,單獨使用都成問題啊。更別說配合  bufang()運行了。
作者: yxh1999    時間: 2020-3-4 09:40
謝謝回復。又仔細看了下你的代碼,覺得問題還是很多的。uchar flag=0;//這個變量你怎么處理的,沒有哪里在自加跟自減,賦值0,時間中斷里面等2的時候賦值4, bufang();函數里面判斷4跟5,感覺你的 bufang();函數永遠都不會起作用啊,因為這個變量一直都是0啊。我的解決思路就是串口判斷你放在中斷里面去執行, bufang();你放在主循環里面,這樣 while(1)沒啥關系。你要注意中斷的開關, EA=0;//關中斷關了后,你的串口中斷也關閉了。串口中斷你可以一直打開。時間中斷你按自己的需要開關。
作者: zqy181818    時間: 2020-3-4 14:49
yxh1999 發表于 2020-3-4 09:40
謝謝回復。又仔細看了下你的代碼,覺得問題還是很多的。uchar flag=0;//這個變量你怎么處理的,沒有哪里在 ...

首先謝謝你!這么熱情的回復。bufang();單獨使用是可以用的。flag是個標志。4跟5放在程序,時間段的標志而已。判斷就可以知道時間到哪了。不用自加跟自減的。《你要注意中斷的開關, EA=0;//關中斷關了后,你的串口中斷也關閉了。》這句你說對了。。。bufang();調用是要注意 EA=0.l因為共用會有影響。
作者: haierzaifei11    時間: 2020-3-4 15:03
如果沒有while功能沒有了。更別說運行一個。
作者: yxh1999    時間: 2020-3-5 09:24
主要是我沒有明白flag這個變量是怎么變化的。
    if((flag==2)&&(num==30))//布防時間,num=30即15秒,可以更改此實現布防延遲時間
           flag=4;
可以理解為flag等于2了才能觸發flag等于4,后面的函數里面flag等于4了才能得到flag等于5.那flag怎么得到2的。那是不是說flag相關的代碼都是沒有用的了。是不是可以這樣理解。
作者: zqy181818    時間: 2020-3-5 15:12
yxh1999 發表于 2020-3-5 09:24
主要是我沒有明白flag這個變量是怎么變化的。
    if((flag==2)&&(num==30))//布防時間,num=30即15秒,可 ...

可以的。你明白就好。一時大意沒有查到這個放標志程序沒有復制過去。當時做程序要求上電就可以運行。后來才加上這個控件的,想在手機上控制的。合成后一直在考慮while問題。沒有在意這個。現在主要問題是如何讓他們同時運行。
作者: 萌新求帶10086    時間: 2020-6-2 18:55
大佬可不可以分享一下電子幸運轉盤的單片機程序阿 供學習使用




歡迎光臨 (http://m.raoushi.com/bbs/) Powered by Discuz! X3.1