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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

51單片機串口中斷碰到的問題請前輩指教一下晚輩

[復制鏈接]
跳轉到指定樓層
樓主
ID:745568 發(fā)表于 2020-5-7 23:08 | 只看該作者 回帖獎勵 |正序瀏覽 |閱讀模式
我在今天學習了串口通訊,寫了個串口通訊的小程序,部分功能實現了,但有個BUG,我不知道哪里出來的問題,程序功能是這樣的,單片機P1.3有個按鍵,按一下發(fā)送一個0X11到串口助手上面,現在的情況是程序燒錄到單片機里面初次按按鍵有數據上傳到串口助手上面,但是一旦關了單片機電源再開,再按按鍵,那就沒有任何數據上傳到串口助手上面,但是這時候用串口助手隨意發(fā)一個16進制數給單片機,這時候單片機又奇跡般的活了,我現在不知道從哪下手修改程序了,請論壇的前輩指教一下,下面附上單片機程序
#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;
                                       
                                 }
              
    }
                                 
                                 
}

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

13#
ID:745568 發(fā)表于 2020-5-8 12:46 | 只看該作者
haha1934 發(fā)表于 2020-5-8 08:59
樓主按鍵掃描的程序寫在串口中斷程序里面,如果單片機的串口終端未被觸發(fā),你的按鍵掃描程序就不會被執(zhí)行 ...

好的,我會學習帖子所有的程序思路,十分感謝您了!
回復

使用道具 舉報

12#
ID:745568 發(fā)表于 2020-5-8 12:45 | 只看該作者
aking991 發(fā)表于 2020-5-8 08:57
按你這程序本來就只能執(zhí)行一次

我初學,有時候被莫名其妙的問題給繞進去了,我按這個思路來改下程序,謝謝你了
回復

使用道具 舉報

11#
無效樓層,該帖已經被刪除
10#
ID:745568 發(fā)表于 2020-5-8 12:43 | 只看該作者
13681878016 發(fā)表于 2020-5-8 07:20
因為樓主的按鍵觸發(fā)是在串口中斷服務函數里,主函數中沒掃描按鍵程序,(你的外部中斷是否有按鍵中斷沒看到 ...

哦,原來如此,我按這個思路改一下試試,感謝感謝
回復

使用道具 舉報

9#
無效樓層,該帖已經被刪除
8#
無效樓層,該帖已經被刪除
7#
ID:65956 發(fā)表于 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ā)送串口數據
//----------------------------
void S1_SendData(unsigned char dat1)        //發(fā)送串口數據
{
        SBUF = dat1;                     //發(fā)送當前數據
        while (!TI);                    //等待前一個數據發(fā)送完成
        TI = 0;                         //清除發(fā)送標志
}


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

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;
}
回復

使用道具 舉報

6#
ID:746236 發(fā)表于 2020-5-8 08:59 | 只看該作者
mffhxa 發(fā)表于 2020-5-8 01:40
實現樓主只發(fā)不收的功能,不需要中斷。就在樓主程序上改了下。(如果要自發(fā)自收再用串口接收中斷)
void m ...

樓主按鍵掃描的程序寫在串口中斷程序里面,如果單片機的串口終端未被觸發(fā),你的按鍵掃描程序就不會被執(zhí)行,這就與你所得到的結果一樣了,建議樓主如果只發(fā)不收的話采用樓上的建議,卓見僅供參考!
void InterruptUART()interrupt 4
{
uchar temp,temp1;
      if(!key1)
                          {
                             delay();
                                 while(!key1);
                                 {
                                   temp=0x11;
                                        SBUF=temp;
                                   while(!TI);
                                 TI=0;
                                       
                                 }
              
    }
回復

使用道具 舉報

5#
ID:65956 發(fā)表于 2020-5-8 08:57 | 只看該作者
按你這程序本來就只能執(zhí)行一次
回復

使用道具 舉報

地板
ID:213173 發(fā)表于 2020-5-8 08:17 | 只看該作者
在樓主程序基礎上修改:操作按鍵發(fā)送數據到上位機和串口中斷收到數據后返回上位機。看明白就能掌握串口的最基本運用。
  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;                //關串口中斷,防止與串口中斷沖突
  30.                         while(!key1);
  31.                         {
  32.                                 SBUF=0x11;//發(fā)送數據到上位機
  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;     //接收中斷請求標志位
  44.         temp=SBUF;//獲取SBUF接收到的數據
  45.         SBUF=temp;//將接收到的數據返回上位機
  46.         while(!TI);
  47.         TI=0;
  48. }
復制代碼
回復

使用道具 舉報

板凳
ID:482935 發(fā)表于 2020-5-8 07:20 | 只看該作者
因為樓主的按鍵觸發(fā)是在串口中斷服務函數里,主函數中沒掃描按鍵程序,(你的外部中斷是否有按鍵中斷沒看到)。所以你觸發(fā)不了按鍵一次,發(fā)送一個字節(jié)數據的現象。 你PC串口發(fā)送數據給51單片機,一旦51單片機接收完畢一個字節(jié),RI會置1,會自動進入串口中斷服務函數,然后一看你里面if(key==0),滿足條件了,所以觸發(fā)一次發(fā)送數據。 建議你把串口發(fā)送數據放入主函數中。 串口中斷一般只有接收數據才使用。
回復

使用道具 舉報

沙發(fā)
ID:195446 發(fā)表于 2020-5-8 01:40 | 只看該作者
實現樓主只發(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;
                                         
                                  }
       }
}
回復

使用道具 舉報

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

本版積分規(guī)則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表