找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1938|回复: 10
收起左侧

单片机串口发送数据,通过按键判断发送,但是没有经过按键就直接发送了!

[复制链接]
ID:730961 发表于 2020-11-3 10:50 | 显示全部楼层 |阅读模式
untitled.png

这个就是程序,我用得单片机开发板,接上串口以后,直接发送数据了,而不是通过我按下那个按键在发送那个数据,而是一直发送,但是我按下另一个按键以后,就变成另一个一直发送了,求大佬指点一下,为什么不是按下那个按键发那个数据,

单片机源程序如下:
#include <reg51.h>    //头文件
typedef unsigned char u8;
typedef unsigned int u16;
u8 num= 0;  //串口发送变量
sbit k1 = P1^0;   //按键,led定义
sbit k2 = P2^2;
sbit LED = P0^0;
sbit LED1 = P0^1;
      //延时函数
void delay(u16 i)   
{
   while(i--);
}
   //发送数据函数
void fasong(u16 dat)   
{
   SBUF = dat;
   while(!TI);
   TI = 0;
}

void keypros()
{
if(k1==0)    //检测按键K1是否按下
{
  delay(50000);   //消除抖动 一般大约10ms
  if(k1==0)  //再次判断按键是否按下
  {
   LED=~LED;  //led取反
//   SBUF =0xff;
//            while(TI == 0);
//            TI = 0;
   num = 0xff;    //num赋值0xff
   delay(50000);   //延时
  }
//  while(!k1)
//  {
//     num = 0xfe;
//  };//检测按键是否松开
}
else if(k2==0)    //检测按键K2是否按下
{
  delay(50000);   //消除抖动 一般大约10ms
  if(k2==0)  //再次判断按键是否按下
  {
   LED1=~LED1; //led取反观察
//  SBUF =0xff;
//            while(TI == 0);
//            TI = 0;
   num = 0x00;    //赋值num 0x00
   delay(50000);   //延时
  }
}     
// num = 0x00;  
}

void main()
{
    SCON = 0x40;  //串口初始话
TMOD = 0x20;
PCON = 0X00;  //
TL1 = 0xFD;  //设定定时初值
TH1 = 0xFD;  //设定定时初值
TR1 = 1;
// k1 = 0;
// k2 = 1;
   while(1)
   {
  keypros();   //按键函数

  fasong(num);  //发送函数


   }
}



回复

使用道具 举报

ID:739545 发表于 2020-11-3 11:18 | 显示全部楼层
fasong(num);  //发送函数  
你本来就一直在发送,没有中断过,最好用flag进行标记发送,或者用中断进行发送更好
回复

使用道具 举报

ID:654028 发表于 2020-11-3 11:20 | 显示全部楼层
你这串口发的dat是在哪赋值的,
回复

使用道具 举报

ID:730961 发表于 2020-11-3 11:23 | 显示全部楼层
心有浮生 发表于 2020-11-3 11:20
你这串口发的dat是在哪赋值的,

不是有一个函数是
void fasong(u16 dat)   
{
    SBUF = dat;
    while(!TI);
    TI = 0;
}
num值给dat了
回复

使用道具 举报

ID:730961 发表于 2020-11-3 11:27 | 显示全部楼层
lovezjf234 发表于 2020-11-3 11:18
fasong(num);  //发送函数  
你本来就一直在发送,没有中断过,最好用flag进行标记发送,或者用中断进行发 ...

没太懂,我得理解是这样得:初始化以后不是进入while(1);循环了嘛?他不是要一直扫描我的按键函数嘛?我的按键按下以后才能发送num得值,不按下不就发送不了嘛?那么第一次不就是不能发送数据嘛?必须等我按下以后才能发送第一次得值?
回复

使用道具 举报

ID:88256 发表于 2020-11-3 11:51 | 显示全部楼层
小白学51i 发表于 2020-11-3 11:27
没太懂,我得理解是这样得:初始化以后不是进入while(1);循环了嘛?他不是要一直扫描我的按键函数嘛? ...

   while(1)
   {
  keypros();   //按键函数
  fasong(num);  //发送函数
   }

你看看你写的这个循环,执行按键处理之后就是发送,而不是判断按下什么键去处理发送,所以就会一直发送
回复

使用道具 举报

ID:424598 发表于 2020-11-3 12:50 来自手机 | 显示全部楼层
发送函数要放到按键函数的判断成功里面
回复

使用道具 举报

ID:278840 发表于 2020-11-3 13:11 | 显示全部楼层
当程序运行到fasong(num);串口就发送数据到上位机了,此时num= 0;如果要按键发送的话,就要在fasong()这个子函数加个判断比如定义一个变量Switch=flag.if(Switch_flag){Switch_flag = 0;fasong();}按键将Switch置1,然后if里面清零
回复

使用道具 举报

ID:245053 发表于 2020-11-3 13:19 | 显示全部楼层
主程序一直在执行fasong(num)函数,肯定是一直在发送数据了,fasong(num)要有条件(就是你的按键)的执行、结束
回复

使用道具 举报

ID:730961 发表于 2020-11-3 14:13 | 显示全部楼层
感谢大佬们,我把函数放在判断里面,或者在加一个判断就可以了
回复

使用道具 举报

ID:730961 发表于 2020-11-3 14:58 | 显示全部楼层
大佬们,怎么用printf(“打印一句话啊”),通过串口调试助手显示出来
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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