找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4565|回复: 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 单片机教程网

快速回复 返回顶部 返回列表