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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

單片機串口程序問題

[復制鏈接]
回帖獎勵 10 黑幣 回復本帖可獲得 10 黑幣獎勵! 每人限 1 次
跳轉到指定樓層
樓主
ID:827580 發表于 2020-12-10 09:55 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
我想實現的功能是,當我的按鍵狀態發生改變時,串口向上位機串口軟件發送自己的MCU序列號,加一串序列號。比如按鍵當前是高電平,就發送一次MCU序列號➕字符串1,按鍵當前低電平,就發送一次MCU序列號➕字符串2,目前單片機序列號也獲取到了,序列號是7個16進制數(0x01  0x02  0x03 0x04 0x05 0x06 0x07)類似這樣的,目前一上電它一直在持續發送,按下按鍵換一個繼續一直發送,哪位大佬幫我改一下,只有狀態發生改變的時候發送一次。而且十六進制的怎么跟字符串連接在一起,目前接受到的是亂碼,怎么能讓串口接收到的是0x01 0x02 0x03 0x04 0x05 0x06 0x07 手環已連接或者0x01 0x02 0x03 0x04 0x05 0x06 0x07 手環已斷開

單片機源程序如下:
  1. #include <reg52.h>
  2. #define jingzhen    11059200UL                         //使用110.592M晶體*/         
  3. #define botelv   9600UL                             //波特率定義為9600*/
  4. unsigned char zifuchuan1[]="靜電腕已連接";                                                //待顯示字符。
  5. unsigned char zifuchuan2[]="靜電腕帶未按規定佩戴,請檢查連接性";                        //待顯示字符。
  6. volatile unsigned char sending;
  7. sbit K2=P3^4;           //信號輸入腳
  8. sbit SPK=P0^0;     //定義喇叭端口
  9. sbit LED1=P0^1;    //定義燈光接口
  10. sbit LED2=P0^2;           //狀態掃描指示燈
  11. sbit LED3=P0^3;           //連接正常指示燈
  12. unsigned char frq;
  13. unsigned char key_flag = 0;            //接入狀態標志位
  14. void DelayUs2x(unsigned char t);//延時函數聲明
  15. void DelayMs(unsigned char t);        //延時函數聲明
  16. void BEEP(unsigned char i);            //聲光提示
  17. void sendc(unsigned char * pd);        //字符發送函數聲明
  18. void SHANSHUO(unsigned char i);        //接入情況掃描運行狀態指示
  19. unsigned char id_data[7];//存放MCU的真實序列號
  20. void sendMCUID(unsigned char idata *id_add);
  21. //***************************************************************//        延時函數
  22. void delay(unsigned char i)
  23. {
  24.         unsigned char j,k;
  25.         for(j=i;j>0;j--)
  26.                 for(k=90;k>0;k--);
  27. }
  28. /*******************************************************************/
  29. void read_save_ID()                  //讀取、MCU真實序列號
  30. {
  31.    unsigned char idata *id_add; //在idata中定義指針變量id_add
  32.    unsigned char i = 0;
  33.    unsigned char j = 0;
  34.        id_add = 0xF1; //指針變量賦初值,0xF1為序列號第一個字節的指針
  35.        for(j=0;j<7;j++)           //通過7次循環將序列號7個字節轉存至數組
  36.            {
  37.         i = *id_add;
  38.         id_data[j] = i;
  39.         id_add++;
  40.         }
  41. }
  42. //***************************************************************//鍵盤掃描函數
  43. void key_scan()
  44. {
  45.      SHANSHUO();
  46.          if(K2==1)
  47.           {
  48.                DelayMs(500);
  49.         //           sendMCUID(id_data);
  50.                    sendc(zifuchuan2);       
  51.                    BEEP();       
  52.                    DelayMs(500);
  53.                    DelayMs(500);            
  54.                 }
  55.       else if(K2!=1)
  56.           {
  57.               DelayMs(500);
  58.         //          sendMCUID(id_data);
  59.               sendc(zifuchuan1);
  60.                   LED3=0;
  61.                   DelayMs(500);
  62.                   DelayMs(500);
  63.           }
  64. }
  65. //*****************************************************************//串口初始化函數
  66. void init(void)                                //串口初始化
  67. {
  68. EA=0; //暫時關閉中斷
  69. TMOD&=0x0F;  //定時器1模式控制在高4位
  70. TMOD|=0x20;    //定時器1工作在模式2,自動重裝模式
  71. SCON=0x50;     //串口工作在模式1
  72. TH0 = 0x0FF;
  73. TL0 = 0x9C;
  74. TH1=256-jingzhen/(botelv*12*16);  //計算定時器重裝值
  75. TL1=256-jingzhen/(botelv*12*16);
  76. PCON|=0x80;    //串口波特率加倍
  77. ES=1;         //串行中斷允許
  78. TR1=1;        //啟動定時器1
  79. REN=1;        //允許接收
  80. EA=1;         //允許中斷
  81. TI=1;
  82. LED3=1;
  83. key_scan();
  84. }
  85. //**********************************************************************************//字節發送函數
  86. void send(unsigned char d)                  //發送一個字節的數據,形參d即為待發送數據。
  87. {

  88. SBUF=d; //將數據寫入到串口緩沖
  89. sending=1;         //設置發送標志
  90. while(sending); //等待發送完畢
  91. }
  92. //*********************************************************************************//字符串發送函數
  93. void BEEP(unsigned char i)
  94. {
  95.    for(i=0;i<200;i++)
  96.           {
  97.             DelayUs2x(200);
  98.                 DelayUs2x(200);
  99.                 SPK=!SPK;
  100.                 LED1=!LED1;
  101.               }
  102.        for(i=0;i<200;i++)
  103.           {
  104.              DelayMs(1);  
  105.                  SPK=!SPK;
  106.                  LED1=!LED1;
  107.           }
  108. }
  109. /******************************************************************************************/
  110. void SHANSHUO(unsigned char i)
  111. {   
  112.     LED2=0;
  113.         DelayUs2x(2000);
  114.         LED2=1;
  115.         }
  116. /*****************************************************************************************/
  117. void sendc(unsigned char * pd)
  118. {
  119. while((*pd)!='\0') //發送字符串,直到遇到0才結束
  120. {
  121.   send(*pd); //發送一個字符
  122.   pd++;  //移動到下一個字符
  123. }
  124. }
  125. /*****************************************************************************************/
  126. void sendMCUID(unsigned char idata *id_add)
  127. {
  128. while((*id_add)!='\0') //發送字符串,直到遇到0才結束
  129. {
  130.   DelayMs(500);
  131.   DelayMs(500);
  132.   send(*id_add); //發送一個字符
  133.   DelayMs(500);
  134.   DelayMs(500);
  135.   id_add++;  //移動到下一個字符
  136. }
  137. }
  138. //************************************************************************************//主函數
  139. void main()
  140. {
  141.     while(1)
  142.         {
  143.        init();       
  144.         }         
  145.    }


  146.                      
  147. void DelayUs2x(unsigned char t)
  148. {   
  149. while(--t);
  150. }

  151. void DelayMs(unsigned char t)
  152. {
  153.      
  154. while(t--)
  155. {
  156.      //大致延時1mS
  157.      DelayUs2x(245);
  158.          DelayUs2x(245);
  159. }
  160. }

  161. void uart(void) interrupt 4                 //串口發送中斷
  162. {

  163. if(RI)    //收到數據
  164. {
  165.   RI=0;   //清中斷請求
  166. }
  167. else      //發送完一字節數據
  168. {
  169.   TI=0;
  170.   sending=0;  //清正在發送標志
  171. }
  172. }
復制代碼

1.zip

26.96 KB, 下載次數: 7

源碼

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

使用道具 舉報

沙發
ID:827580 發表于 2020-12-10 10:00 | 只看該作者
幫解決此問題,30元MONEY,此話算數
回復

使用道具 舉報

板凳
ID:276663 發表于 2020-12-10 12:39 | 只看該作者
做個標志位,發送過后就不再發了。
回復

使用道具 舉報

地板
ID:858078 發表于 2020-12-10 14:05 | 只看該作者
"怎么能讓串口接收到的是0x01 0x02 0x03 0x04 0x05 0x06 0x07",
將16進制數轉成hex string格式輸出
回復

使用道具 舉報

5#
ID:216962 發表于 2020-12-10 14:25 | 只看該作者
一樓正解。。
回復

使用道具 舉報

6#
ID:358620 發表于 2020-12-10 17:17 | 只看該作者
你好,你板子一上電按鍵就兩個狀態,要么是高電平要么是低電平,每次按鍵掃描就發送一次,所以是一直發送,增加兩個標志位,High_Flag,Low_Flag,檢測按鍵是高電平的時候High_Flag=1,Low_Flag=0檢測到低電平的時候反過來,在發送哪里只需判斷一下就OK了,這個就可以實現狀態改變一次發送一次
回復

使用道具 舉報

7#
ID:827580 發表于 2020-12-11 08:58 | 只看該作者
lihaifeng_avr@1 發表于 2020-12-10 17:17
你好,你板子一上電按鍵就兩個狀態,要么是高電平要么是低電平,每次按鍵掃描就發送一次,所以是一直發送, ...

收到!謝謝!
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 99视频在线播放 | 国产精品久久久久久久久 | 91影院| 日韩欧美一级精品久久 | 日日摸天天添天天添破 | 欧美午夜一区二区三区免费大片 | 久久久久久看片 | 欧美a在线 | 日韩欧美国产精品一区 | 偷拍第一页 | 亚洲精品粉嫩美女一区 | 久草资源网站 | 日韩欧美国产一区二区 | 欧美成人a∨高清免费观看 91伊人 | 二区在线观看 | 亚洲日韩欧美一区二区在线 | 国产精品日女人 | 日韩久久成人 | 超碰520| 狠狠婷婷综合久久久久久妖精 | 精品成人免费视频 | 玖草资源| 日韩一区二区三区视频在线播放 | 久久久久久亚洲精品不卡 | 日本免费一区二区三区四区 | 日本大片在线播放 | 欧美精品在欧美一区二区 | 欧美成人精品激情在线观看 | 欧美日韩一区二区三区不卡视频 | 精品国产黄a∨片高清在线 成人区精品一区二区婷婷 日本一区二区视频 | 日韩av在线免费 | 久久噜噜噜精品国产亚洲综合 | 亚洲精品一区二区在线观看 | 91精品国产色综合久久 | 91精品麻豆日日躁夜夜躁 | 91电影 | 亚洲啊v| 蜜桃臀av一区二区三区 | 国产一区二区三区在线免费 | 国产真实乱对白精彩久久小说 | 中文字幕一区二区三区在线观看 |