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

標(biāo)題: 51單片機(jī)串口中斷碰到的問題請前輩指教一下晚輩 [打印本頁]

作者: 種豆少年    時(shí)間: 2020-5-7 23:08
標(biāo)題: 51單片機(jī)串口中斷碰到的問題請前輩指教一下晚輩
我在今天學(xué)習(xí)了串口通訊,寫了個(gè)串口通訊的小程序,部分功能實(shí)現(xiàn)了,但有個(gè)BUG,我不知道哪里出來的問題,程序功能是這樣的,單片機(jī)P1.3有個(gè)按鍵,按一下發(fā)送一個(gè)0X11到串口助手上面,現(xiàn)在的情況是程序燒錄到單片機(jī)里面初次按按鍵有數(shù)據(jù)上傳到串口助手上面,但是一旦關(guān)了單片機(jī)電源再開,再按按鍵,那就沒有任何數(shù)據(jù)上傳到串口助手上面,但是這時(shí)候用串口助手隨意發(fā)一個(gè)16進(jìn)制數(shù)給單片機(jī),這時(shí)候單片機(jī)又奇跡般的活了,我現(xiàn)在不知道從哪下手修改程序了,請論壇的前輩指教一下,下面附上單片機(jī)程序
#include<reg52.h>
#define uchar unsigned char

sbit key1=P1^3;
sbit key2=P1^2;
sbit key3=P1^1;
sbit key4=P1^0;
sbit l1=P0^0;
sbit l2=P0^1;
sbit l3=P0^2;
sbit l4=P0^3;
void ConfigUART(unsigned int baud);
void delay()
{
unsigned int i=11000;
while(i--);
}
void main()
{
   EA=1;
   ConfigUART(9600);
   while(1);
}

void ConfigUART(unsigned int baud)
{
   SCON=0x50;
   TMOD&=0x0f;
   TMOD|=0x20;
   TH1=256-(11059200/12/32)/baud;
   TL1=TH1;
   ET1=0;
   ES=1;
   TR1=1;
}

/*void InterruptUART()interrupt 4
{
  if(RI)
  {
    RI=0;
        SBUF=SBUF+1;
  }
  if(TI)
  {
    TI=0;
  }
}*/

void InterruptUART()interrupt 4
{
uchar temp,temp1;
      if(!key1)
                          {
                             delay();
                                 while(!key1);
                                 {
                                   temp=0x11;
                                        SBUF=temp;
                                   while(!TI);
                                 TI=0;
                                       
                                 }
              
    }
                                 
                                 
}


作者: mffhxa    時(shí)間: 2020-5-8 01:40
實(shí)現(xiàn)樓主只發(fā)不收的功能,不需要中斷。就在樓主程序上改了下。(如果要自發(fā)自收再用串口接收中斷)
void main()
{
     ConfigUART(9600);
    while(1);
{key_tran();}
}

void key_tran()
{
uchar temp,temp1;
       if(!key1)
                           {
                              delay();
                                  while(!key1);
                                  {
                                    temp=0x11;
                                         SBUF=temp;
                                    while(!TI);
                                  TI=0;
                                         
                                  }
       }
}
作者: 13681878016    時(shí)間: 2020-5-8 07:20
因?yàn)闃侵鞯陌存I觸發(fā)是在串口中斷服務(wù)函數(shù)里,主函數(shù)中沒掃描按鍵程序,(你的外部中斷是否有按鍵中斷沒看到)。所以你觸發(fā)不了按鍵一次,發(fā)送一個(gè)字節(jié)數(shù)據(jù)的現(xiàn)象。 你PC串口發(fā)送數(shù)據(jù)給51單片機(jī),一旦51單片機(jī)接收完畢一個(gè)字節(jié),RI會(huì)置1,會(huì)自動(dòng)進(jìn)入串口中斷服務(wù)函數(shù),然后一看你里面if(key==0),滿足條件了,所以觸發(fā)一次發(fā)送數(shù)據(jù)。 建議你把串口發(fā)送數(shù)據(jù)放入主函數(shù)中。 串口中斷一般只有接收數(shù)據(jù)才使用。
作者: wulin    時(shí)間: 2020-5-8 08:17
在樓主程序基礎(chǔ)上修改:操作按鍵發(fā)送數(shù)據(jù)到上位機(jī)和串口中斷收到數(shù)據(jù)后返回上位機(jī)?疵靼拙湍苷莆沾诘淖罨具\(yùn)用。
  1. #include<reg52.h>
  2. #define uchar unsigned char

  3. sbit key1=P1^3;

  4. void ConfigUART(unsigned int baud)
  5. {
  6.    SCON=0x50;
  7.    TMOD&=0x0f;
  8.    TMOD|=0x20;
  9.    TH1=256-(11059200/12/32)/baud;
  10.    TL1=TH1;
  11.    ET1=0;
  12.    ES=1;
  13.    TR1=1;
  14. }

  15. void delay()
  16. {
  17.         unsigned int i=11000;
  18.         while(i--);
  19. }

  20. void main()
  21. {
  22.         EA=1;
  23.         ConfigUART(9600);
  24.         while(1)
  25.         {
  26.                 if(!key1)
  27.                 {
  28.                         delay();
  29.                         ES=0;                //關(guān)串口中斷,防止與串口中斷沖突
  30.                         while(!key1);
  31.                         {
  32.                                 SBUF=0x11;//發(fā)送數(shù)據(jù)到上位機(jī)
  33.                                 while(!TI);
  34.                                 TI=0;
  35.                                 ES=1;        //開串口中斷
  36.                         }
  37.                 }
  38.         }
  39. }

  40. void InterruptUART()interrupt 4
  41. {
  42.         uchar temp;
  43.         RI=0;     //接收中斷請求標(biāo)志位
  44.         temp=SBUF;//獲取SBUF接收到的數(shù)據(jù)
  45.         SBUF=temp;//將接收到的數(shù)據(jù)返回上位機(jī)
  46.         while(!TI);
  47.         TI=0;
  48. }
復(fù)制代碼

作者: aking991    時(shí)間: 2020-5-8 08:57
按你這程序本來就只能執(zhí)行一次
作者: haha1934    時(shí)間: 2020-5-8 08:59
mffhxa 發(fā)表于 2020-5-8 01:40
實(shí)現(xiàn)樓主只發(fā)不收的功能,不需要中斷。就在樓主程序上改了下。(如果要自發(fā)自收再用串口接收中斷)
void m ...

樓主按鍵掃描的程序?qū)懺诖谥袛喑绦蚶锩,如果單片機(jī)的串口終端未被觸發(fā),你的按鍵掃描程序就不會(huì)被執(zhí)行,這就與你所得到的結(jié)果一樣了,建議樓主如果只發(fā)不收的話采用樓上的建議,卓見僅供參考!
void InterruptUART()interrupt 4
{
uchar temp,temp1;
      if(!key1)
                          {
                             delay();
                                 while(!key1);
                                 {
                                   temp=0x11;
                                        SBUF=temp;
                                   while(!TI);
                                 TI=0;
                                       
                                 }
              
    }
作者: aking991    時(shí)間: 2020-5-8 09:05
你那程序本來就只能執(zhí)行一次,簡單的幫你改一下你試試,這樣你每次按都可以的
#include<reg52.h>
#define uchar unsigned char

sbit key1=P1^3;
sbit key2=P1^2;
sbit key3=P1^1;
sbit key4=P1^0;
sbit l1=P0^0;
sbit l2=P0^1;
sbit l3=P0^2;
sbit l4=P0^3;
void ConfigUART(unsigned int baud);
void delay()
{
unsigned int i=11000;
while(i--);
}

//----------------------------
//發(fā)送串口數(shù)據(jù)
//----------------------------
void S1_SendData(unsigned char dat1)        //發(fā)送串口數(shù)據(jù)
{
        SBUF = dat1;                     //發(fā)送當(dāng)前數(shù)據(jù)
        while (!TI);                    //等待前一個(gè)數(shù)據(jù)發(fā)送完成
        TI = 0;                         //清除發(fā)送標(biāo)志
}


void main()
{
        ConfigUART(9600);
        EA=1;
        while(1)
        {
         if(!key1)
                }
                        delay();
                        if(!key1)
                        {
                                S1_SendData(0x11)        //發(fā)送串口數(shù)據(jù)
                        }       
                }
        }
}

void ConfigUART(unsigned int baud)
{
        SCON=0x50;
        TMOD&=0x0f;
        TMOD|=0x20;
        TH1=256-(11059200/12/32)/baud;
        TL1=TH1;
        ET1=0;
        ES=1;
        TR1=1;
}
作者: 種豆少年    時(shí)間: 2020-5-8 12:43
13681878016 發(fā)表于 2020-5-8 07:20
因?yàn)闃侵鞯陌存I觸發(fā)是在串口中斷服務(wù)函數(shù)里,主函數(shù)中沒掃描按鍵程序,(你的外部中斷是否有按鍵中斷沒看到 ...

哦,原來如此,我按這個(gè)思路改一下試試,感謝感謝
作者: 種豆少年    時(shí)間: 2020-5-8 12:45
aking991 發(fā)表于 2020-5-8 08:57
按你這程序本來就只能執(zhí)行一次

我初學(xué),有時(shí)候被莫名其妙的問題給繞進(jìn)去了,我按這個(gè)思路來改下程序,謝謝你了
作者: 種豆少年    時(shí)間: 2020-5-8 12:46
haha1934 發(fā)表于 2020-5-8 08:59
樓主按鍵掃描的程序?qū)懺诖谥袛喑绦蚶锩,如果單片機(jī)的串口終端未被觸發(fā),你的按鍵掃描程序就不會(huì)被執(zhí)行 ...

好的,我會(huì)學(xué)習(xí)帖子所有的程序思路,十分感謝您了!




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