欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

標(biāo)題: 單片機串口發(fā)送數(shù)據(jù),通過按鍵判斷發(fā)送,但是沒有經(jīng)過按鍵就直接發(fā)送了! [打印本頁]

作者: 小白學(xué)51i    時間: 2020-11-3 10:50
標(biāo)題: 單片機串口發(fā)送數(shù)據(jù),通過按鍵判斷發(fā)送,但是沒有經(jīng)過按鍵就直接發(fā)送了!


這個就是程序,我用得單片機開發(fā)板,接上串口以后,直接發(fā)送數(shù)據(jù)了,而不是通過我按下那個按鍵在發(fā)送那個數(shù)據(jù),而是一直發(fā)送,但是我按下另一個按鍵以后,就變成另一個一直發(fā)送了,求大佬指點一下,為什么不是按下那個按鍵發(fā)那個數(shù)據(jù),

單片機源程序如下:
#include <reg51.h>    //頭文件
typedef unsigned char u8;
typedef unsigned int u16;
u8 num= 0;  //串口發(fā)送變量
sbit k1 = P1^0;   //按鍵,led定義
sbit k2 = P2^2;
sbit LED = P0^0;
sbit LED1 = P0^1;
      //延時函數(shù)
void delay(u16 i)   
{
   while(i--);
}
   //發(fā)送數(shù)據(jù)函數(shù)
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;  //設(shè)定定時初值
TH1 = 0xFD;  //設(shè)定定時初值
TR1 = 1;
// k1 = 0;
// k2 = 1;
   while(1)
   {
  keypros();   //按鍵函數(shù)

  fasong(num);  //發(fā)送函數(shù)


   }
}




作者: lovezjf234    時間: 2020-11-3 11:18
fasong(num);  //發(fā)送函數(shù)  
你本來就一直在發(fā)送,沒有中斷過,最好用flag進(jìn)行標(biāo)記發(fā)送,或者用中斷進(jìn)行發(fā)送更好

作者: 心有浮生    時間: 2020-11-3 11:20
你這串口發(fā)的dat是在哪賦值的,
作者: 小白學(xué)51i    時間: 2020-11-3 11:23
心有浮生 發(fā)表于 2020-11-3 11:20
你這串口發(fā)的dat是在哪賦值的,

不是有一個函數(shù)是
void fasong(u16 dat)   
{
    SBUF = dat;
    while(!TI);
    TI = 0;
}
num值給dat了

作者: 小白學(xué)51i    時間: 2020-11-3 11:27
lovezjf234 發(fā)表于 2020-11-3 11:18
fasong(num);  //發(fā)送函數(shù)  
你本來就一直在發(fā)送,沒有中斷過,最好用flag進(jìn)行標(biāo)記發(fā)送,或者用中斷進(jìn)行發(fā) ...

沒太懂,我得理解是這樣得:初始化以后不是進(jìn)入while(1);循環(huán)了嘛?他不是要一直掃描我的按鍵函數(shù)嘛?我的按鍵按下以后才能發(fā)送num得值,不按下不就發(fā)送不了嘛?那么第一次不就是不能發(fā)送數(shù)據(jù)嘛?必須等我按下以后才能發(fā)送第一次得值?
作者: hhdsdy    時間: 2020-11-3 11:51
小白學(xué)51i 發(fā)表于 2020-11-3 11:27
沒太懂,我得理解是這樣得:初始化以后不是進(jìn)入while(1);循環(huán)了嘛?他不是要一直掃描我的按鍵函數(shù)嘛? ...

   while(1)
   {
  keypros();   //按鍵函數(shù)
  fasong(num);  //發(fā)送函數(shù)
   }

你看看你寫的這個循環(huán),執(zhí)行按鍵處理之后就是發(fā)送,而不是判斷按下什么鍵去處理發(fā)送,所以就會一直發(fā)送
作者: ssk7793    時間: 2020-11-3 12:50
發(fā)送函數(shù)要放到按鍵函數(shù)的判斷成功里面
作者: 器車人    時間: 2020-11-3 13:11
當(dāng)程序運行到fasong(num);串口就發(fā)送數(shù)據(jù)到上位機了,此時num= 0;如果要按鍵發(fā)送的話,就要在fasong()這個子函數(shù)加個判斷比如定義一個變量Switch=flag.if(Switch_flag){Switch_flag = 0;fasong();}按鍵將Switch置1,然后if里面清零
作者: pcf2000    時間: 2020-11-3 13:19
主程序一直在執(zhí)行fasong(num)函數(shù),肯定是一直在發(fā)送數(shù)據(jù)了,fasong(num)要有條件(就是你的按鍵)的執(zhí)行、結(jié)束
作者: 小白學(xué)51i    時間: 2020-11-3 14:13
感謝大佬們,我把函數(shù)放在判斷里面,或者在加一個判斷就可以了
作者: 小白學(xué)51i    時間: 2020-11-3 14:58
大佬們,怎么用printf(“打印一句話啊”),通過串口調(diào)試助手顯示出來




歡迎光臨 (http://m.raoushi.com/bbs/) Powered by Discuz! X3.1