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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

C51單片機串口調試求助

[復制鏈接]
跳轉到指定樓層
樓主
ID:188773 發表于 2020-5-23 16:34 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
  目前在學習串口收發數據,目的是接收命令,根據命令修改數組內的值并發送出去,主要有下面兩個疑問
  1、串口調試有沒有好的方法可以在線仿真,能夠看到變量值的每步變化,我嘗試用了proteus仿真,串口調試助手發送數據,程序進不了串口中斷;
  2、我寫了下面一段程序,tmp[]數組接收的是串口調試助手發來的命令ASCII碼。紅色這句修改數組的值出了問題,接收到的ASCII碼0-b轉換成16進制的0-11,作為數組的下標賦值給b,接收到的ASCII碼1 、2、4、8轉換成16進制(tmp[2]-0x30),賦值給數組buzzer_value ''。但是實際每次buzzer_value ''都為0X00;后面發送的b 、(tmp[2]-0x30)的值又是對的,不知道中間有什么問題。 我嘗試把b改成數字下標或者把tmp[2]-0x30改成具體的十六進制數,結果都是對的。

                                        if((tmp[1]>='0')&&(tmp[1]<='9'))
                                          b=tmp[1]-0X30;
                                        else
                                          b=tmp[1]-0X51;
                                        buzzer_value  '[   b   ]'=(tmp[2]-0x30);

                                        a=0;
                                        while(a<12)
                                        {
                                                SBUF = buzzer_value[a];                //SUBF接受/發送緩沖器(又叫串行通信特殊功能寄存器)
                                                while(!TI);                                // 等特數據傳送        (TI發送中斷標志)
                                                TI = 0;                                        // 清除數據傳送標志
                                                a++;                                            // 下一個字符         
                                        }
                                SBUF = b;                //SUBF接受/發送緩沖器(又叫串行通信特殊功能寄存器)
                                                while(!TI);                                // 等特數據傳送        (TI發送中斷標志)
                                                TI = 0;                                        // 清除數據傳送標志        
                                SBUF = tmp[2]-0X30;                //SUBF接受/發送緩沖器(又叫串行通信特殊功能寄存器)
                                                while(!TI);                                // 等特數據傳送        (TI發送中斷標志)
                                                TI = 0;                                        // 清除數據傳送標志        
                                int_tmp();
                                b=0;                                
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:188773 發表于 2020-5-23 16:39 | 只看該作者
發帖出來的buzzer_value  '[   b   ]'不加引號不能顯示[]和里面的b
回復

使用道具 舉報

板凳
ID:188773 發表于 2020-5-23 21:00 | 只看該作者
本帖最后由 guan1989 于 2020-5-23 21:02 編輯




  1. //串口通訊實驗  
  2. //這里寫好程序 下載到單片機里
  3. //直接 用下載軟件的串口助手   以16進制 發送 8A  會接收到  我愛單片機
  4. //此程序雖然很少 但是它有著串口通訊和接收的所有功能  
  5. //需要用串口的朋友只要用它改改就可以實現自己想要的效果



  6. #include "stc8.h"

  7. unsigned char data  key_value[14]={0,0,0,0,0,0,0,0,0,0,0,0,0,0}; //實時存儲按鍵按下標志位:LED1,LED2,LED3...LED10,test,mute,,LED_ALARM,buzzer;用于顯示和通訊
  8. unsigned char data  key_alarm[12]={1,1,1,1,1,1,1,1,1,1,1,1}; //按鍵按下是否生效標志位:LED1,LED2,...lLED10,test,mute               
  9. unsigned char data  buzzer_value[12]={1,1,2,4,8,1,1,1,1,1,1,1};//1表示2秒1鳴,2表示1秒1鳴、4表示1秒2鳴、8表示長鳴                         

  10. /*
  11. 命令A11,表示key_alarm[0]=1;A10,表示key_alarm[0]=0;返回key_alarm[12]
  12. 命令B11,表示buzzer_value[1]=1;B10,表示buzzer_value[1]=0;返回buzzer_value[12]
  13. 命令KEY,返回key_value[14]

  14. */
  15. unsigned char tmp[4];        //存儲接收到的值;
  16. unsigned char ucreceive_num=0;


  17. void main()
  18. {
  19.   //  P3M0 |= 0x03 ;
  20.         //        P3M1 &=0xfc ;                //uart1推挽輸出,需限流電阻
  21.                  SCON |= 0x50;       //REN=1允許串行接受狀態,串口工作模式2               
  22.            TMOD= 0x20;      //定時器工作方式2       8位 自動重裝載定時器  實現波特率               
  23.            AUXR=0X40;                 //開啟1T模式   
  24.            TH1 =TL1= 0xDC;                        //  設置波特率為9600  公式 TH1=256-(11059200/32/9600)=256-36=220  0xDC
  25.                                                                                                         //  設置波特率為9600  公式 TH1=256-(22118400/32/9600)=256-72=184  0xB8
  26.                               // 如有不明白請查 STC8手冊上有詳細說明
  27.       
  28.        
  29.                 TR1  = 1;        //開啟定時器1                                                      
  30.                 ES   = 1;        //開串口中斷                  
  31.                 EA   = 1;        // 開總中斷
  32.        
  33.                 while(1)
  34.                 {
  35.                        
  36.                 }

  37. }

  38. /***********************************************
  39. *函數名稱:Uart1_SendChar
  40. *功    能:串口1發送單個字符函數
  41. *入口參數:Udat:欲發送的數據
  42. *返 回 值:無       
  43. *備    注:無
  44. ************************************************/
  45. void int_tmp()
  46. {
  47.         ucreceive_num=0;
  48.         tmp[0]=0x00;
  49.         tmp[1]=0x00;
  50.         tmp[2]=0x00;
  51. }

  52. /***********************************************
  53. *函數名稱:Uart1_SendChar
  54. *功    能:串口1發送單個字符函數
  55. *入口參數:Udat:欲發送的數據
  56. *返 回 值:無       
  57. *備    注:無
  58. ************************************************/
  59. void ISP_Check()
  60. {
  61.                 unsigned char a;
  62.                 unsigned char c;
  63.                 switch(tmp[0])
  64.                 {
  65.                         case 'K' :
  66.                         if((tmp[1]=='E')&&(tmp[2]=='Y'))
  67.                         {
  68.                                 ES= 0;
  69.                                 a=0;
  70.                                 while(a<14)
  71.                                 {
  72.                                         SBUF = key_value[a];                //SUBF接受/發送緩沖器(又叫串行通信特殊功能寄存器)
  73.                                         while(!TI);                                // 等特數據傳送        (TI發送中斷標志)
  74.                                         TI = 0;                                        // 清除數據傳送標志
  75.                                         a++;                                            // 下一個字符
  76.                                 }       
  77.                         int_tmp();
  78.                         }
  79.                         break;
  80.                        
  81.                         case 'A'        :
  82.                                 if(        (        ((tmp[1]>='0')&&(tmp[1]<='9'))        ||        ((tmp[1]>='a')&&(tmp[1]<='b'))        ) &&( (tmp[2]=='0') || (tmp[2]=='1')  ))
  83.                                 {
  84.                                         ES= 0;
  85.                                         if((tmp[1]>='0')&&(tmp[1]<='9'))
  86.                                                 c=tmp[1]-0X30;
  87.                                         else
  88.                                                 c=tmp[1]-0X51;
  89.                                         key_alarm[c] = (tmp[2]-0x30);
  90.                                         a=0;
  91.                                         while(a<12)
  92.                                         {
  93.                                                 SBUF = key_alarm[a];                //SUBF接受/發送緩沖器(又叫串行通信特殊功能寄存器)
  94.                                                 while(!TI);                                // 等特數據傳送        (TI發送中斷標志)
  95.                                                 TI = 0;                                        // 清除數據傳送標志
  96.                                                 a++;                                            // 下一個字符
  97.                                         }
  98.                                 SBUF = c;                //SUBF接受/發送緩沖器(又叫串行通信特殊功能寄存器)
  99.                                                 while(!TI);                                // 等特數據傳送        (TI發送中斷標志)
  100.                                                 TI = 0;                                        // 清除數據傳送標志       
  101.                                 SBUF = tmp[2]-0x30;                //SUBF接受/發送緩沖器(又叫串行通信特殊功能寄存器)
  102.                                                 while(!TI);                                // 等特數據傳送        (TI發送中斷標志)
  103.                                                 TI = 0;                                        // 清除數據傳送標志
  104.                                         int_tmp();
  105.                                 }
  106.                                 break;
  107.                        
  108.                         case 'B' :
  109.                                 if(        (        ((tmp[1]>='0')&&(tmp[1]<='9'))        ||        ((tmp[1]>='a')&&(tmp[1]<='b'))        ) &&( (tmp[2]=='1') || (tmp[2]=='2') ||(tmp[2]=='4') ||(tmp[2]=='8') ))
  110.                                 {
  111.                                         ES= 0;
  112.                                         if((tmp[1]>='0')&&(tmp[1]<='9'))
  113.                                                 c=tmp[1]-0X30;
  114.                                         else
  115.                                                 c=tmp[1]-0X51;
  116.                                         buzzer_value[c] = (tmp[2]-0x30);
  117.                                         a=0;
  118.                                         while(a<12)
  119.                                         {
  120.                                                 SBUF = buzzer_value[a];                //SUBF接受/發送緩沖器(又叫串行通信特殊功能寄存器)
  121.                                                 while(!TI);                                // 等特數據傳送        (TI發送中斷標志)
  122.                                                 TI = 0;                                        // 清除數據傳送標志
  123.                                                 a++;                                            // 下一個字符        
  124.                                         }
  125.                                 SBUF = c;                //SUBF接受/發送緩沖器(又叫串行通信特殊功能寄存器)
  126.                                                 while(!TI);                                // 等特數據傳送        (TI發送中斷標志)
  127.                                                 TI = 0;                                        // 清除數據傳送標志       
  128.                                 SBUF = tmp[2]-0x30;                //SUBF接受/發送緩沖器(又叫串行通信特殊功能寄存器)
  129.                                                 while(!TI);                                // 等特數據傳送        (TI發送中斷標志)
  130.                                                 TI = 0;                                        // 清除數據傳送標志       
  131.                                 int_tmp();
  132.                                 c=0;                               
  133.                                 }
  134.                                 break;
  135.                                
  136.                         default :
  137.                                 ES=0;
  138.                                 int_tmp();
  139.                 }
  140.                 ES=1;               
  141. }               



  142. void Serial_int(void) interrupt 4 using 1
  143. {
  144.         if (RI)
  145.     {       
  146.                 tmp[ucreceive_num] = SBUF;
  147.                 ucreceive_num++;
  148.                 ISP_Check();
  149.                 if(ucreceive_num==3)
  150.                 int_tmp();
  151.                 RI = 0;       
  152.     }
  153. }  
復制代碼

源代碼見附件
回復

使用道具 舉報

地板
ID:213173 發表于 2020-5-24 07:51 | 只看該作者
樓主這不是串口通訊問題,是數據解析問題。
回復

使用道具 舉報

5#
ID:188773 發表于 2020-5-24 16:05 | 只看該作者
wulin 發表于 2020-5-24 07:51
樓主這不是串口通訊問題,是數據解析問題。

死活找不到原因
回復

使用道具 舉報

6#
ID:188773 發表于 2020-5-24 16:16 | 只看該作者
wulin 發表于 2020-5-24 07:51
樓主這不是串口通訊問題,是數據解析問題。

請問有什么方向的解決思路
回復

使用道具 舉報

7#
ID:188773 發表于 2020-5-24 16:50 | 只看該作者
wulin 發表于 2020-5-24 07:51
樓主這不是串口通訊問題,是數據解析問題。
  1. if((tmp[1]>='0')&&(tmp[1]<='9'))
  2.                                           b=tmp[1]-0X30;
  3.                                         else
  4.                                           b=tmp[1]-0X51;
  5.                                         buzzer_value  '[   b   ]'=(tmp[2]-0x30);
復制代碼
我把上面一段修改了下,如下圖。buzzer_value '[ b ]'=(tmp[2]-0x30);這一句分解成了case,結果是正確的,但是原理不是很懂,是不是編譯器的編譯過程有問題。
  1.                                 {
  2.                                         ES= 0;
  3.                                         if((tmp[1]>='0')&&(tmp[1]<='9'))
  4.                                         {
  5.                                                 switch(tmp[2])
  6.                                                 {
  7.                                                         case'1':buzzer_value[tmp[1]-0X30] =1;break;
  8.                                                         case'2':buzzer_value[tmp[1]-0X30] =2;break;
  9.                                                         case'4':buzzer_value[tmp[1]-0X30] =4;break;
  10.                                                         case'8':buzzer_value[tmp[1]-0X30] =8;break;
  11.                                                 }
  12.                                         }
  13.                                         else                               
  14.                                         {                                               
  15.                                                 switch(tmp[2])
  16.                                                 {
  17.                                                         case'1':buzzer_value[tmp[1]-0X57] =1;break;
  18.                                                         case'2':buzzer_value[tmp[1]-0X57] =2;break;
  19.                                                         case'4':buzzer_value[tmp[1]-0X57] =4;break;
  20.                                                         case'8':buzzer_value[tmp[1]-0X57] =8;break;
  21.                                                 }
  22.                                         }       
復制代碼



回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 久久国产精品一区二区三区 | 性国产xxxx乳高跟 | 欧美一区二区三区在线观看视频 | 国产视频中文字幕在线观看 | 欧美 日韩 国产 成人 在线 91 | 看特级黄色片 | 天天干狠狠干 | 888久久久| 人人爽日日躁夜夜躁尤物 | 毛片视频网址 | 综合色影院 | 青青草av网站 | 殴美黄色录像 | 在线看av的网址 | 日韩在线视频免费观看 | 精品一二区 | 中文字幕一级 | 日本一区二区三区在线观看 | 国产目拍亚洲精品99久久精品 | 国产www成人| 日韩在线欧美 | 成人av一区| av在线免费观看网站 | 91精品国产一区二区三区蜜臀 | 亚洲欧美精品在线观看 | 国产精品免费小视频 | 9999国产精品欧美久久久久久 | 国产视频亚洲视频 | 日韩中文字幕视频 | 在线亚洲一区 | av影音资源 | 中文字幕在线一区二区三区 | 中国美女撒尿txxxxx视频 | 国产在线一区二区三区 | 中文在线一区二区 | 欧美精品91 | 亚洲第一色站 | 久久久久久91 | 日本成人中文字幕在线观看 | 欧美日韩视频一区二区 | 欧美日韩精品一区二区三区四区 |