找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 6141|回复: 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 单片机教程网

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