找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1637|回复: 5
收起左侧

请问关于单片机串口通信和按键的传输问题

[复制链接]
ID:608920 发表于 2020-8-8 10:35 | 显示全部楼层 |阅读模式
楼主使用串口通信控制从机行为,仿真发现从机行为不稳定,实际烧录后发现主机单次按键传输数据次数过多,而且次数不稳定无法确定稳定次数,进行按键消抖后也没法清除这种情况,我想按键按下后只传输一次数据作为地址,还能怎么改进代码而又使数据在每次按下按键后只传输一次?谢谢

捕获.PNG

单片机源程序如下:
  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. }
复制代码

回复

使用道具 举报

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:你那个消抖处理时间也太长了吧!!!
回复

使用道具 举报

ID:812792 发表于 2020-8-10 11:42 | 显示全部楼层
知道你用bai的是51核的单片机,但du不知道你用的是哪一种规格型号?K1接的哪根I/O?这根I/O会不会与外部中断有关?单片机是否开放了外部中断?会不会因外部中断的高优先级别导致这种现象的发生?会是增强型的51单片机吗?如果是,那么K1相关I/O又是如何配置的呢?
回复

使用道具 举报

ID:123289 发表于 2020-8-10 13:55 | 显示全部楼层
记住:
串行通讯时,如果一个数据串入了,你必须在一个串行周期内将它取走,否由下一个数据来了,它就会被冲掉。
你的程序能不能做到这一点呢?会不会数据来了,你的程序还在某个地方DELAY呢?
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表