找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索

我想按键按下一次单片机就发送一次数据到串口助手,但一直循环发送

查看数: 6742 | 评论数: 12 | 收藏 0
关灯 | 提示:支持键盘翻页<-左 右->
    组图打开中,请稍候......
发布时间: 2018-10-25 22:12

正文摘要:

求大神帮忙看看我的问题 单片机源程序如下: #include <REG52.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)  ...

回复

ID:416027 发表于 2018-10-26 21:22
你可以用while()语句检测按键是否弹起来,单片机的运行速度很快你按键按下一次的时间这段程序可能走了好几遍了
ID:357396 发表于 2018-10-26 20:40
感谢各位大神帮助!!,好像是我的开发板有问题,换了一个板子就好了
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);这句放这里也可以。
}

ID:410942 发表于 2018-10-26 14:29
加多一个标志位flag.按下一次flag取反,在按键里加多一个判断。if(k3==0&&flag==0)..这样试一下。
ID:357396 发表于 2018-10-26 11:41
一个做毕设的人 发表于 2018-10-25 23:41
用中断吧,中断好做一点

我用中断也是这样...........
ID:330198 发表于 2018-10-26 10:14
我试过没问题,除非你按键一直按下了,否则不会一直发的
ID:383749 发表于 2018-10-26 10:08
楼上说的EA=1,是需要开总中断的。另外你的硬件是怎么设计的,按键按下去拉低IO口,松开后有上拉电阻拉高吧?
ID:308437 发表于 2018-10-26 09:03
你串口中断没写啊。如果不写,可以直接在发送完,写上ES=0;(关闭串口,但是不建议这做,可能会有很多问题),还是把程序放到中断吧
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,这个没有找到原因。因为你原来的程序只会发送两次,也是不循环一直发送,也没有收到多余的数据(在我的板子了,修改了波特率后)
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);
                }
        }
}
ID:415560 发表于 2018-10-25 23:41
用中断吧,中断好做一点
ID:357396 发表于 2018-10-25 22:24
EA=1的

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

Powered by 单片机教程网

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