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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

請問關于單片機串口通信和按鍵的傳輸問題

[復制鏈接]
跳轉到指定樓層
樓主
樓主使用串口通信控制從機行為,仿真發現從機行為不穩定,實際燒錄后發現主機單次按鍵傳輸數據次數過多,而且次數不穩定無法確定穩定次數,進行按鍵消抖后也沒法清除這種情況,我想按鍵按下后只傳輸一次數據作為地址,還能怎么改進代碼而又使數據在每次按下按鍵后只傳輸一次?謝謝



單片機源程序如下:
  1. #include<reg51.h>
  2. #define address_one 0x11
  3. #define address_two 0x12
  4. #define address_three 0x13

  5. sbit key1=P3^2;
  6. sbit key2=P3^3;
  7. sbit key3=P3^4;

  8. void delay(unsigned char time)
  9. {
  10.         int j=0;
  11.         for(;time>0;time--)
  12.                 for(;j<110;j++);
  13. }

  14. void SetInit()
  15. {
  16.         SCON=0x50;//10100000
  17.         TMOD=0x20;
  18.         PCON=0x00;
  19.         TH1=TL1=0xFD;
  20.         TI=RI=0;
  21.         TR1=1;
  22.         IE=0X90;
  23. }

  24. void button()
  25. {
  26.         if(key1==0)
  27.         {
  28.                 delay(500);
  29.                 if(key1==0){

  30.                 TB8=1;
  31.                 SBUF=address_one;
  32.                 while(TI==0);
  33.                 TI=0;        }
  34.         }
  35.         else if(key2==0)
  36.         {
  37.                 TB8=1;
  38.                 SBUF=address_two;
  39.                 while(TI==0);
  40.                 TI=0;
  41.         }
  42.         else if(key3==0)
  43.         {
  44.                 TB8=1;
  45.                 SBUF=address_three;
  46.                 while(TI==0);
  47.                 TI=0;
  48.         }
  49. }



  50. int main()
  51. {
  52.         SetInit();
  53.         SBUF=0xFF;
  54.         while(TI==0);
  55.         TI=0;
  56.         while(1)
  57.                 button();
  58.         return 0;
  59. }
復制代碼

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

使用道具 舉報

沙發
ID:213173 發表于 2020-8-8 14:25 | 只看該作者
本帖最后由 wulin 于 2020-8-8 21:20 編輯

void button()
{
        unsigned char k;
        if(!key1||!key2||!key3)
        {
                delay(20);
                if(!key1||!key2||!key3)
                {
                        if(!key1)
                                k=address_one;
                        else if(!key2)
                                k=address_two;
                        else if(!key3)
                                k=address_three;
                        SBUF=k;
                        while(!TI);
                        TI=0;
                        while(!key1||!key2||!key3);
                }
        }
}
回復

使用道具 舉報

板凳
ID:86926 發表于 2020-8-8 14:31 | 只看該作者
你沒做按鍵按下時長的處理,按下發送完一邊如果你沒及時松開按鍵而程序又進行第二次掃描就會再次發送數據了,你可以試一下不同按下按鍵到放開的時間,你一直按下就會一直發送了。
回復

使用道具 舉報

地板
ID:804115 發表于 2020-8-10 00:27 | 只看該作者
核心思想:以按鍵松開作為執行標準。
PS:你那個消抖處理時間也太長了吧!!!
回復

使用道具 舉報

5#
ID:812792 發表于 2020-8-10 11:42 | 只看該作者
知道你用bai的是51核的單片機,但du不知道你用的是哪一種規格型號?K1接的哪根I/O?這根I/O會不會與外部中斷有關?單片機是否開放了外部中斷?會不會因外部中斷的高優先級別導致這種現象的發生?會是增強型的51單片機嗎?如果是,那么K1相關I/O又是如何配置的呢?
回復

使用道具 舉報

6#
ID:123289 發表于 2020-8-10 13:55 | 只看該作者
記住:
串行通訊時,如果一個數據串入了,你必須在一個串行周期內將它取走,否由下一個數據來了,它就會被沖掉。
你的程序能不能做到這一點呢?會不會數據來了,你的程序還在某個地方DELAY呢?
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 爱草在线 | a网站在线观看 | 亚洲精选一区二区 | 农村真人裸体丰满少妇毛片 | 久久国产一区二区 | 亚洲天堂av网| 国产精彩视频一区 | 免费观看成人鲁鲁鲁鲁鲁视频 | 婷婷久久精品一区二区 | 国产视频中文字幕 | 久草福利 | 久久亚洲精品国产精品紫薇 | 精品少妇一区二区三区日产乱码 | 亚洲日本欧美日韩高观看 | 日韩av一区在线观看 | 国产高清免费 | 亚洲国产91 | 91在线精品视频 | 91国产精品 | 亚洲精品一区中文字幕 | 91精品久久久 | 精品一区二区久久久久久久网精 | 日本黄色免费大片 | 日韩av啪啪网站大全免费观看 | 午夜视频在线观看网站 | 天天射影院 | 爱爱免费视频 | 伊人精品一区二区三区 | 老司机成人在线 | 丝袜毛片| 国产成人免费在线 | 99国产精品99久久久久久 | 欧美成人精品一区二区男人看 | 嫩草懂你的影院入口 | 免费成人在线网站 | 99精品免费 | 亚洲手机视频在线 | 在线观看精品视频网站 | 久久国产精品99久久久久 | 国产免费看 | 久久精品天堂 |