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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

我想按鍵按下一次單片機就發送一次數據到串口助手,但一直循環發送

[復制鏈接]
跳轉到指定樓層
樓主

求大神幫忙看看我的問題

單片機源程序如下:
  1. #include <REG52.h>
  2. unsigned char code a[]={0x78,0x09,0x00,0x00,0x00};
  3. unsigned char i,j;
  4. sbit k3 = P3^3;
  5. bit flag;
  6. void delay(unsigned int n)   
  7. {
  8.     unsigned char a,b;
  9.     for(a=0;a<n;a++)
  10.         for(b=0;b<123;b++);
  11.    
  12. }


  13. void InitUART(void)
  14. {
  15.     TMOD = 0x20;
  16.     SCON = 0x50;
  17.     TH1 = 0xFD;  //9600
  18.     TL1 = TH1;
  19.     PCON = 0x00;
  20.     EA = 0;
  21.     ES = 1;
  22.     TR1 = 1;
  23. }


  24. void Send_string(unsigned char c)
  25. {


  26.   SBUF=c;
  27.   while(TI==0);
  28.   TI=0;
  29. }
  30. void key()
  31. {
  32. if(k3==0)
  33. {  delay(100);
  34.          if(k3==0)
  35.          {
  36.                                 for(i=0;i<5;i++)
  37.                 {
  38.              Send_string(a[ i]);                  delay(10);                }         } }}

  39. void main(void)
  40. {        P3 = 0xff;
  41. InitUART();         
  42. while(1)           {               key();           }        }
復制代碼





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

使用道具 舉報

沙發
ID:357396 發表于 2018-10-25 22:24 | 只看該作者
EA=1的
回復

使用道具 舉報

板凳
ID:415560 發表于 2018-10-25 23:41 | 只看該作者
用中斷吧,中斷好做一點
回復

使用道具 舉報

地板
ID:213173 發表于 2018-10-26 08:13 | 只看該作者
改一下按鍵程序即可
void key()
{
        if(k3==0)
        {
                delay(100);
                if(k3==0)
                {
                        for(i=0;i<5;i++)
                        {
                                Send_string(a[i]);                  
//                                delay(10);               
                        }         
                        while(!k3);
                }
        }
}
回復

使用道具 舉報

5#
ID:164602 發表于 2018-10-26 08:25 | 只看該作者
你的程序,我修改了一下,符合我的板子:12M下的4800加倍(從程序上看,你的波特率是11.0592M下的9600)
得到的結果是沒有問題的——你的程序中問題是按鍵沒有松開消抖。
#include <REG51.h>

unsigned char code a[]={0x78,0x09,0x00,0x00,0x00};
unsigned char i,j;
sbit k3 = P3^3;
bit flag;

void delay(unsigned int n)   
{
    unsigned char a,b;
    for(a=0;a<n;a++)
        for(b=0;b<123;b++);
}


void InitUART(void)
{
//    TMOD = 0x20;
//    SCON = 0x50;
//    TH1 = 0xFD;  //9600
//    TL1 = TH1;
//    PCON = 0x00;
//    EA = 0;
//    ES = 1;
//    TR1 = 1;
        PCON |= 0x80;
        SCON = 0x50;
        TMOD &= 0x0F;
        TMOD |= 0x20;
        TL1 = 0xF3;
        TH1 = 0xF3;
        ET1 = 0;
        TR1 = 1;
}


void Send_string(unsigned char c)
{
  SBUF=c;
  while(TI==0);
  TI=0;
}

void key()
{
        if(k3==0)
        {
                delay(100);
      if(k3==0)
      {
         for(i=0;i<5;i++)
         {
             Send_string(a[i]);
             delay(10);
         }
                                 for (i=0;(i<50)&&(k3==0);i++)
                                 {
                                                delay(100);
                                        }
       }
        }
}

void main(void)
{
        P3 = 0xff;
        InitUART();         
        while(1)
        {
     key();
  }
}

看你的截圖,接收到的數據多了一個FF,這個沒有找到原因。因為你原來的程序只會發送兩次,也是不循環一直發送,也沒有收到多余的數據(在我的板子了,修改了波特率后)
回復

使用道具 舉報

6#
ID:308437 發表于 2018-10-26 09:03 | 只看該作者
你串口中斷沒寫啊。如果不寫,可以直接在發送完,寫上ES=0;(關閉串口,但是不建議這做,可能會有很多問題),還是把程序放到中斷吧
回復

使用道具 舉報

7#
ID:383749 發表于 2018-10-26 10:08 | 只看該作者
樓上說的EA=1,是需要開總中斷的。另外你的硬件是怎么設計的,按鍵按下去拉低IO口,松開后有上拉電阻拉高吧?
回復

使用道具 舉報

8#
ID:330198 發表于 2018-10-26 10:14 | 只看該作者
我試過沒問題,除非你按鍵一直按下了,否則不會一直發的
回復

使用道具 舉報

9#
ID:357396 發表于 2018-10-26 11:41 | 只看該作者
一個做畢設的人 發表于 2018-10-25 23:41
用中斷吧,中斷好做一點

我用中斷也是這樣...........
回復

使用道具 舉報

10#
ID:410942 發表于 2018-10-26 14:29 | 只看該作者
加多一個標志位flag.按下一次flag取反,在按鍵里加多一個判斷。if(k3==0&&flag==0)..這樣試一下。
回復

使用道具 舉報

11#
ID:410942 發表于 2018-10-26 17:06 | 只看該作者
wulin 發表于 2018-10-26 08:13
改一下按鍵程序即可
void key()
{

改一下按鍵程序即可
void key()
{
        if(k3==0)
        {
                delay(100);
                if(k3==0)
                {
                        for(i=0;i<5;i++)
                        {
                                Send_string(a);                  
//                                delay(10);               
                        }         
                     //   while(!k3);這句放這里 還是有時會發兩次
                }
                 //   while(!k3);這句放這里效果最好。
        }
                 //   while(!k3);這句放這里也可以。
}

回復

使用道具 舉報

12#
ID:357396 發表于 2018-10-26 20:40 | 只看該作者
感謝各位大神幫助!!,好像是我的開發板有問題,換了一個板子就好了
回復

使用道具 舉報

13#
ID:416027 發表于 2018-10-26 21:22 | 只看該作者
你可以用while()語句檢測按鍵是否彈起來,單片機的運行速度很快你按鍵按下一次的時間這段程序可能走了好幾遍了
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 欧美成人a∨高清免费观看 欧美日韩中 | 久久国产精品一区二区三区 | 久久综合av | 亚洲一区二区三区在线免费 | 成年人在线观看视频 | 中文字幕亚洲一区二区三区 | 亚州国产| 欧美理论片在线 | 天天操天天干天天爽 | 黄视频网站免费观看 | 国产精品日韩 | 九色.com | 亚洲日韩欧美一区二区在线 | 91精品久久久久久综合五月天 | 91久久国产综合久久 | 久久久久久久久久久福利观看 | 国产精品一区二区av | 狠狠ri| 色视频网站在线观看 | 天天插天天操 | 亚洲国产激情 | 欧美一级二级在线观看 | 成人在线观看中文字幕 | 91精品国产乱码久久久久久久久 | 九九av | 岛国av免费在线观看 | 久久精品成人热国产成 | www.日本国产 | 午夜精品一区二区三区在线视频 | 亚洲精品一区二区三区在线 | 久久亚洲国产精品 | 欧美日韩亚洲国产 | 精品丝袜在线 | 精品国产精品三级精品av网址 | 欧美日韩手机在线观看 | 成人av一区二区三区 | 在线国产一区二区 | 日本不卡一区二区三区 | 日韩中文字幕免费在线观看 | 国产一区二区三区四区五区加勒比 | 最新av在线播放 |