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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 5737|回復: 6
收起左側

新人關于PC與單片機開發板的串口通信問題

[復制鏈接]
ID:210889 發表于 2017-6-19 11:32 | 顯示全部樓層 |閱讀模式
自己參照了教程例子,用串口調試助手完成了發送1,2,3數據分別控制led亮,流水燈功能,呼吸燈功能.
然后我想再結合開發板按鍵上的控制上面三個功能的程序,整合到一起. 整合后發現只能實現串口調試助手發送數據(助手也能正常顯示接受數據),
按鍵部分就沒反應了.  下面程序, 不知道是我自己編寫邏輯有錯還是什么,望人指點一下.

  1. #include <reg52.h>
  2. #include <intrins.h>
  3. #define uchar unsigned char
  4. #define uint unsigned int
  5. sbit S1=P3^5;
  6. sbit S2=P3^4;
  7. sbit S3=P3^3;
  8. sbit S4=P3^2;
  9. sbit led1=P1^0;
  10. sbit led2=P1^1;
  11. sbit led3=P1^2;
  12. sbit led4=P1^3;
  13. uchar aa=0xfe,num = 0,a;
  14. uchar i = 0,j = 0,k = 0,t = 0;
  15. void delay(unsigned int t)        ;
  16. void delay2(unsigned int z);
  17. void keyscan();
  18. void initial_com();



  19. void initial_com()
  20. {
  21. //SCON = 0x50;
  22. TMOD|= 0x20;
  23. TH1 = 0xfd;
  24. TL1 = 0xfd;

  25. TR1 = 1;
  26. REN = 1;
  27. SM0 = 0;
  28. SM1 = 1;
  29. EA = 1;
  30. ES = 0;   //允許串口中斷
  31. SBUF = 0x01;
  32. while(!TI);
  33. TI = 0;   //串口中斷  
  34. ES = 1;

  35. }

  36. void keyscan()                          //掃描按鍵程序
  37. {
  38.   if(S1==0)
  39.    {
  40.      delay(5);
  41.          if(S1==0)
  42.          {
  43.            i++;
  44.           }
  45.           while(!S1);
  46.           delay(5);
  47.           while(!S1);
  48.         }
  49.         
  50.         if(S2==0)
  51.    {
  52.      delay(5);
  53.          if(S2==0)
  54.          {
  55.            j++;
  56.           }
  57.           while(!S2);
  58.           delay(5);
  59.           while(!S2);
  60.         }
  61.         
  62.         if(S3==0)
  63.    {
  64.      delay(5);
  65.          if(S3==0)
  66.          {
  67.            k++;
  68.           }
  69.           while(!S3);
  70.           delay(5);
  71.           while(!S3);
  72.         }
  73.         
  74.         if(S4==0)
  75.    {
  76.      delay(5);
  77.          if(S4==0)
  78.          {
  79.            t++;
  80.           }
  81.           while(!S4);
  82.           delay(5);
  83.           while(!S4);
  84.         }
  85.         
  86. }

  87. void delay(unsigned int t)
  88. {
  89.   unsigned int x,y;
  90.   for(x=t;x>0;x--)
  91.   for(y=110;y>0;y--);
  92. }
  93. void delay2(unsigned int z)
  94. {
  95.   while(--z);
  96. }
  97. void main()
  98. { //P1=0xff;
  99.   unsigned int CYCLE=600,PWM_LOW=0;//定義周期(呼吸燈部分)
  100.   // aa = 0xfe;
  101.    initial_com();
  102.    while(1)
  103.    {
  104.     if(num==1)
  105.     {
  106.      ES = 0;
  107.          num = 0;
  108.          SBUF = a;
  109.          SBUF = i;
  110.          while(!TI);
  111.          TI = 0;
  112.          ES = 1;
  113.     }




  114.         }
  115. }

  116. void ser() interrupt 4
  117. {
  118. unsigned   int CYCLE=600,PWM_LOW=0;
  119.         keyscan();
  120.         RI=0;
  121. //        P1=SBUF;                        //接收數據SBUF,即將計算機的數據接收。
  122.     i = SBUF;
  123.         a=SBUF;
  124. //        ledoff=SBUF;
  125.         num=1;
  126.         //aa=0xfe;
  127. /*****************呼吸燈部分*******************/
  128.         if(a == 0x03)
  129.         {  
  130.                  while (1) //主循環
  131.   { //keyscan();
  132.   //if(S1==0)
  133. // {
  134.    // delay(5);
  135. //        if(S1==0)
  136. //        {
  137. led1=1;
  138. delay2(150000);                           
  139. for(PWM_LOW=1;PWM_LOW<CYCLE;PWM_LOW++)//PWM_LOW表示低電平時間
  140. {

  141. led1=0; //點亮LED
  142. delay2(PWM_LOW)
  143. led1=1; //熄滅LED
  144. delay2(CYCLE-PWM_LOW)

  145. }
  146. //LED0=0;
  147. for(PWM_LOW=CYCLE-1;PWM_LOW>0;PWM_LOW--)


  148. led1=0;
  149. delay2(PWM_LOW);
  150. led1=1;
  151. delay2(CYCLE-PWM_LOW);

  152.           }
  153.         }
  154. }        
  155. /*****控制燈******/
  156.         if(a == 0x01)
  157.         {         
  158.                  P1 = aa;        
  159.            delay(100);
  160.                  aa = _crol_(aa,1);
  161.         }
  162.         if(a == 0x00)
  163.         {
  164.           P1 = 0xff;
  165.         }
  166.              /**************流水燈部分****************/
  167.            if(a == 0x02) //偶數整除等于,按鍵在        偶次數才觸發流水燈
  168.           {
  169.         P1=aa;;  
  170.         delay(500);  
  171.         aa=_crol_(aa,1);
  172.                 }
  173. /*************按鍵控制部分,是不是我不應該寫在這個中斷里面???寫在主函數上也是沒反應***************/         
  174.   if(i==1)
  175.     {
  176.       delay(5);
  177.           if(i==1)
  178.         {
  179.            led1= 0;
  180.            }
  181.          }




  182.   if(i==2)
  183.      {
  184.         P1=aa;;  
  185.         delay(500);  
  186.         aa=_crol_(aa,1);
  187.                 }



  188.   if(i==3)
  189.      {
  190.            while(1)
  191.            {
  192.              led1= 1;
  193.                  delay2(150000);
  194.                  for(PWM_LOW=1;PWM_LOW<CYCLE;PWM_LOW++)
  195.                    {
  196.                       led1= 0;
  197.                           delay2(PWM_LOW);
  198.                           led1=1;
  199.                           delay2(CYCLE-PWM_LOW);
  200.                    }
  201.                         for(PWM_LOW=CYCLE-1;PWM_LOW>0;PWM_LOW--)
  202.              {                    //與逐漸變亮相反的過程   

  203.              led1=0;
  204.              delay2(PWM_LOW);
  205.              led1=1;
  206.              delay2(CYCLE-PWM_LOW);
  207.                          }
  208.            }
  209.          }         
  210. }

復制代碼
回復

使用道具 舉報

ID:210889 發表于 2017-6-19 12:23 | 顯示全部樓層
有些注釋可能排錯了,主要是按鍵控制,在串口助手上實現與顯示接收到的數據問題
回復

使用道具 舉報

ID:210889 發表于 2017-6-19 14:55 | 顯示全部樓層
人工置頂
回復

使用道具 舉報

ID:210889 發表于 2017-6-19 16:08 | 顯示全部樓層
我好像解決了,開發板上的按鍵和串口助手上發送數據,都能實現功能而且有顯示接收到的數據.
但是仍有一個問題,在串口助手上發送流水燈的指令02,它只左移1位就停止了,可是_crol_函數不是會一直左移嗎?而且我按鍵部分的程序也是用_crol_,它可以不斷循環左移.這是為什么?
回復

使用道具 舉報

ID:164602 發表于 2017-6-20 08:53 | 顯示全部樓層
仔細看了你的程序,問題在這里:
你的程序:(只取回答部分)
  • void ser() interrupt 4
  • {
  • unsigned   int CYCLE=600,PWM_LOW=0;
  •         keyscan();



問題就在這里!
當中斷發生時,你調用讀鍵程序,我問問你:1、你知道什么時間發生了中斷?只有那個時間你按的鍵才會被程序判斷啊;2、你按鍵的速度能趕上程序的時間?3、你一直按著鍵,然后發數據,看看有沒有效果。
解決辦法:
第一:簡單的,在這里加循環等待,按過鍵后才走;
第二:復雜的,按鍵函數不放這里,放主函數,這里作上記號,在主函數去判斷。

評分

參與人數 1黑幣 +8 收起 理由
LIPPPP + 8 很給力!

查看全部評分

回復

使用道具 舉報

ID:210889 發表于 2017-6-20 17:46 | 顯示全部樓層
HC6800-ES-V2.0 發表于 2017-6-20 08:53
仔細看了你的程序,問題在這里:
你的程序:(只取回答部分)

哦那個掃描函數我也不清楚為什么會在哪里哈哈,可能 修改時弄上去了. 不過謝謝你仔細看了程序
其實最終版本可以實現了我想要的功能,但是在串口中斷中的流水燈部分如果我添加了循環的話,會跳不出來,不添加循環的話只能不停地發送數據, 我初衷是想發送數據,流水燈一直循環直至發送其他數據.

再次感謝你為我解答.不止一次了
回復

使用道具 舉報

ID:164602 發表于 2017-6-21 08:43 | 顯示全部樓層
LIPPPP 發表于 2017-6-20 17:46
哦那個掃描函數我也不清楚為什么會在哪里哈哈,可能 修改時弄上去了. 不過謝謝你仔細看了程序
其實最終版 ...

可以用定時器啊,不是T0還沒用嘛。祝你成功!
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 欧美国产日韩在线观看成人 | 久热电影| 成人二区 | 国产激情在线观看 | 99精品久久久 | 成人在线免费网站 | 少妇久久久久 | 国产999精品久久久久久 | 精品欧美 | 亚洲国产网 | 日本aa毛片a级毛片免费观看 | 在线看一区二区 | a黄视频| 青青久草 | 五月激情婷婷六月 | 久久一区二区视频 | 欧美精品一区二区在线观看 | 国产a视频| 欧美成人精品一区二区男人看 | 国产乱码精品一区二区三区中文 | 国产成人久久精品一区二区三区 | 精品久久久久久久人人人人传媒 | 国产精品久久久久久久久久免费 | 国产在线观看不卡一区二区三区 | 国产午夜视频 | aaaaaa大片免费看最大的 | 国产精品www | 美女视频三区 | 在线一区二区三区 | 国产精品久久一区二区三区 | 高清国产午夜精品久久久久久 | 日本精品久久 | 国产精品久久久久久久久久久久久 | 精品欧美一区二区在线观看视频 | 欧美亚洲另类在线 | 成人在线视频免费播放 | 黄视频网址| 久久av一区二区三区 | 一区二区av | 99精品视频免费观看 | 成人精品免费 |