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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2712|回復: 9
收起左側

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

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

回復

使用道具 舉報

ID:195446 發(fā)表于 2020-5-8 01:40 | 顯示全部樓層
實現(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;
                                         
                                  }
       }
}
回復

使用道具 舉報

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

使用道具 舉報

ID:213173 發(fā)表于 2020-5-8 08:17 | 顯示全部樓層
在樓主程序基礎上修改:操作按鍵發(fā)送數(shù)據(jù)到上位機和串口中斷收到數(shù)據(jù)后返回上位機。看明白就能掌握串口的最基本運用。
  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ā)送數(shù)據(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;     //接收中斷請求標志位
  44.         temp=SBUF;//獲取SBUF接收到的數(shù)據(jù)
  45.         SBUF=temp;//將接收到的數(shù)據(jù)返回上位機
  46.         while(!TI);
  47.         TI=0;
  48. }
復制代碼
回復

使用道具 舉報

ID:65956 發(fā)表于 2020-5-8 08:57 | 顯示全部樓層
按你這程序本來就只能執(zhí)行一次
回復

使用道具 舉報

ID:746236 發(fā)表于 2020-5-8 08:59 | 顯示全部樓層
mffhxa 發(fā)表于 2020-5-8 01:40
實現(xiàn)樓主只發(fā)不收的功能,不需要中斷。就在樓主程序上改了下。(如果要自發(fā)自收再用串口接收中斷)
void m ...

樓主按鍵掃描的程序?qū)懺诖谥袛喑绦蚶锩妫绻麊纹瑱C的串口終端未被觸發(fā),你的按鍵掃描程序就不會被執(zhí)行,這就與你所得到的結果一樣了,建議樓主如果只發(fā)不收的話采用樓上的建議,卓見僅供參考!
void InterruptUART()interrupt 4
{
uchar temp,temp1;
      if(!key1)
                          {
                             delay();
                                 while(!key1);
                                 {
                                   temp=0x11;
                                        SBUF=temp;
                                   while(!TI);
                                 TI=0;
                                       
                                 }
              
    }
回復

使用道具 舉報

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ā)送串口數(shù)據(jù)
//----------------------------
void S1_SendData(unsigned char dat1)        //發(fā)送串口數(shù)據(jù)
{
        SBUF = dat1;                     //發(fā)送當前數(shù)據(jù)
        while (!TI);                    //等待前一個數(shù)據(jù)發(fā)送完成
        TI = 0;                         //清除發(fā)送標志
}


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

使用道具 舉報

ID:745568 發(fā)表于 2020-5-8 12:43 | 顯示全部樓層
13681878016 發(fā)表于 2020-5-8 07:20
因為樓主的按鍵觸發(fā)是在串口中斷服務函數(shù)里,主函數(shù)中沒掃描按鍵程序,(你的外部中斷是否有按鍵中斷沒看到 ...

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

使用道具 舉報

ID:745568 發(fā)表于 2020-5-8 12:45 | 顯示全部樓層
aking991 發(fā)表于 2020-5-8 08:57
按你這程序本來就只能執(zhí)行一次

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

使用道具 舉報

ID:745568 發(fā)表于 2020-5-8 12:46 | 顯示全部樓層
haha1934 發(fā)表于 2020-5-8 08:59
樓主按鍵掃描的程序?qū)懺诖谥袛喑绦蚶锩妫绻麊纹瑱C的串口終端未被觸發(fā),你的按鍵掃描程序就不會被執(zhí)行 ...

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

使用道具 舉報

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

本版積分規(guī)則

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

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

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 一区二区三区四区在线 | 夫妻午夜影院 | 91极品视频 | 亚洲性网 | 欧美日韩综合一区 | 波多野吉衣在线播放 | 亚洲一区二区三区视频免费观看 | 日本黄色大片免费 | 日韩精品免费视频 | 国产精品99久久久久久久vr | 精品在线一区二区 | 日韩在线观看网站 | 91影片 | 综合激情网 | 99精品福利视频 | 亚洲国产aⅴ精品 | 亚洲国产高清免费 | 日韩高清黄色 | 午夜视频在线 | 久久精品亚洲欧美日韩久久 | 日韩av中文| 日韩av三区 | 国产精品污污视频 | 天天爽一爽 | 久久久国产精品 | 国产精品久久久久久久久久久久冷 | 欧美日韩国产免费 | 91色综合 | 亚洲国产aⅴ精品一区二区 免费观看av | 国产在线观看不卡一区二区三区 | 北条麻妃一区二区三区在线观看 | 日日干天天操 | h视频免费在线观看 | 国产精品国产三级国产aⅴ无密码 | 在线色网址 | 日韩国产欧美一区 | 国产一区二区三区久久久久久久久 | 国产午夜精品视频 | 三级欧美 | 青青草视频网 | 国产一二三区电影 |