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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 6065|回復: 25
打印 上一主題 下一主題
收起左側

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

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

使用道具 舉報

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

使用道具 舉報

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

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

使用道具 舉報

24#
ID:697884 發表于 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相關的代碼都是沒有用的了。是不是可以這樣理解。
回復

使用道具 舉報

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

使用道具 舉報

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

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

使用道具 舉報

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

使用道具 舉報

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

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

使用道具 舉報

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

直接去了是不行的
回復

使用道具 舉報

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

你說的很對!
回復

使用道具 舉報

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

理解的
回復

使用道具 舉報

16#
ID:697884 發表于 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();
                 }
                 
                    
         
         }
主函數去掉藍牙檢測函數。你這樣去測試下,應該問題不大了。
回復

使用道具 舉報

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

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

使用道具 舉報

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

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

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

11#
ID:159575 發表于 2020-3-1 18:22 來自手機 | 只看該作者
死循環啊,當然不行
回復

使用道具 舉報

10#
ID:155507 發表于 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. *********************************************************************/

復制代碼

回復

使用道具 舉報

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

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

使用道具 舉報

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

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

使用道具 舉報

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

使用道具 舉報

6#
ID:130231 發表于 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;//開中斷
                                         

                                    }
                           }
        }          
         
   }
       
/********************************************************************
                              結束
*********************************************************************/
回復

使用道具 舉報

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

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

使用道具 舉報

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

沒有直接調用該中斷函數。請看樓下我的描述。
回復

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 午夜在线影院 | 国产成人免费视频 | 亚洲 中文 欧美 日韩 在线观看 | 日韩高清电影 | 欧美激情精品久久久久久变态 | aa级毛片毛片免费观看久 | www午夜视频 | 久久精品视频亚洲 | 国产日韩欧美综合 | 蜜桃视频一区二区三区 | 天天插天天射天天干 | 人操人人| 国产日韩精品视频 | 成人在线观看免费视频 | 伊人网在线综合 | 中文字幕在线免费视频 | 国产精品观看 | av激情在线| 日本精品久久久久久久 | 国产一区二区精品在线 | 亚洲一区二区精品视频 | 久久久久久久久中文字幕 | 日韩精品一区二区三区第95 | 精品视频一区二区三区在线观看 | 日韩欧美高清dvd碟片 | 亚洲欧美视频一区 | 久久久亚洲一区 | 国产成人综合网 | 不卡一区二区三区四区 | 中文字幕一区二区三区四区五区 | 国产黄色小视频在线观看 | 日韩久久久久久 | 99国产精品久久久久久久 | 久久久国产一区二区 | 亚洲精品日韩一区二区电影 | 国产精品美女久久久久久免费 | 国产福利资源在线 | 国产成人精品区一区二区不卡 | 午夜视频在线观看网址 | 亚洲一区 中文字幕 | 青青草一区二区三区 |