久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2425|回復: 10
打印 上一主題 下一主題
收起左側

單片機串口發送數據,通過按鍵判斷發送,但是沒有經過按鍵就直接發送了!

[復制鏈接]
跳轉到指定樓層
樓主


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

單片機源程序如下:
#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);  //發送函數


   }
}



分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
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了
回復

使用道具 舉報

5#
ID:730961 發表于 2020-11-3 11:27 | 只看該作者
lovezjf234 發表于 2020-11-3 11:18
fasong(num);  //發送函數  
你本來就一直在發送,沒有中斷過,最好用flag進行標記發送,或者用中斷進行發 ...

沒太懂,我得理解是這樣得:初始化以后不是進入while(1);循環了嘛?他不是要一直掃描我的按鍵函數嘛?我的按鍵按下以后才能發送num得值,不按下不就發送不了嘛?那么第一次不就是不能發送數據嘛?必須等我按下以后才能發送第一次得值?
回復

使用道具 舉報

6#
ID:88256 發表于 2020-11-3 11:51 | 只看該作者
小白學51i 發表于 2020-11-3 11:27
沒太懂,我得理解是這樣得:初始化以后不是進入while(1);循環了嘛?他不是要一直掃描我的按鍵函數嘛? ...

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

你看看你寫的這個循環,執行按鍵處理之后就是發送,而不是判斷按下什么鍵去處理發送,所以就會一直發送
回復

使用道具 舉報

7#
ID:424598 發表于 2020-11-3 12:50 來自手機 | 只看該作者
發送函數要放到按鍵函數的判斷成功里面
回復

使用道具 舉報

8#
ID:278840 發表于 2020-11-3 13:11 | 只看該作者
當程序運行到fasong(num);串口就發送數據到上位機了,此時num= 0;如果要按鍵發送的話,就要在fasong()這個子函數加個判斷比如定義一個變量Switch=flag.if(Switch_flag){Switch_flag = 0;fasong();}按鍵將Switch置1,然后if里面清零
回復

使用道具 舉報

9#
ID:245053 發表于 2020-11-3 13:19 | 只看該作者
主程序一直在執行fasong(num)函數,肯定是一直在發送數據了,fasong(num)要有條件(就是你的按鍵)的執行、結束
回復

使用道具 舉報

10#
ID:730961 發表于 2020-11-3 14:13 | 只看該作者
感謝大佬們,我把函數放在判斷里面,或者在加一個判斷就可以了
回復

使用道具 舉報

11#
ID:730961 發表于 2020-11-3 14:58 | 只看該作者
大佬們,怎么用printf(“打印一句話啊”),通過串口調試助手顯示出來
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 久久精品成人 | 在线亚洲欧美 | 久久69精品久久久久久久电影好 | 超碰97人人人人人蜜桃 | 中日韩av| 偷拍第一页 | 日韩中文字幕在线视频 | 亚洲欧美一区二区三区国产精品 | 欧美区日韩区 | 精品1区2区3区4区 | 激情五月综合网 | 丁香久久 | 亚洲男人天堂 | 中文字幕在线观看国产 | 狠狠亚洲 | 免费看91| 国产高清无av久久 | 成人毛片视频免费 | 91极品视频| 久国产视频 | 91久久精品国产91久久性色tv | 亚洲综合热| 国产精品久久久久久婷婷天堂 | 国产精品一卡 | 97综合在线 | 欧美在线观看一区 | 国产电影一区二区 | 免费一区在线观看 | 欧美精品一二区 | 欧美精品在线免费观看 | 日韩一区在线播放 | 成人在线不卡 | 一区二区三区精品视频 | 久久午夜精品福利一区二区 | 久久综合国产 | 九九热在线免费视频 | 在线 丝袜 欧美 日韩 制服 | 男女在线免费观看 | 久久com| 在线免费观看毛片 | 国产成人精品一区二区三区四区 |