股票

iPhone端wifi小车--C52下位机串口调试

今天解决了两个问题。
一个是占空比调速。这个用的是timer0中断,计数器计数,到100中断一次,10次进行一次速度调节,比较简单。
一个是串口接收字符串控制命令,即增加控制的稳定器,路由器启动或者被动重启的时候小车不至于乱串。
串口程序得到的经验有两点:
1,子函数都加上return吧,不然说不定什么时候就断线了,不回到主函数中。
2,逻辑关系一定不能有错误,今天因为计数错误耽误了不少时间。

遗留问题:
1,UART_send_byte()中最后 TI 为何要置1没想明白,就像串口接收的时候最后要把 TI 清零一样,不知道有什么作用,但是不这样做串口就是不接收数据。
2,在中断函数中调用UART_send_byte(),一次可以执行,但连续调用两次的话,函数就不再执行,不明白原因。

附源程序:
占空比:

  1. //timer0初始化
  2. void inittimer0(void)
  3. {
  4.     ET0=1; //允许timer0中断
  5.     //工作方式由串口初始化时同时设置,方式1
  6.     TH0=0xFF;
  7.     TL0=0x9C; //定时器赋初值,100机器周期溢出一次
  8.     TR0=1;  //开启timer0计数
  9. }
  10. //timer0中断函数
  11. void timer0() interrupt 1
  12. {
  13.     click++;
  14.     TH0=0xFF;
  15.     TL0=0x9C;
  16.     //重新赋初值
  17.     TR0=1; //定时器开始下一次计数
  18. }
  19. void main()
  20. {
  21.     ……;
  22.     ……;
  23.     while(1)
  24.     {
  25.         if(click<=dutycycles)
  26.             P2=p2mark;
  27.         else if(click<=10)
  28.             P2=0xF0;
  29.         else click=1;
  30.     }
  31. }

串口通讯:

  1. //通信解码 
  2. //编码格式:#0A#(0x23 0x30 0x41 0x23)
  3. 行走动作
  4. void Communication_Decode(void)
  5. {
  6.     //UART_send(buffer,3);
  7.     if(buffer[0]==0x30)//动作判断位’0′
  8.     {
  9.         switch(buffer[1])//执行具体动作
  10.         {
  11.             case 0x41:
  12.                 p2mark=0xF5;
  13.                 return;
  14.             case 0x42:
  15.                 p2mark=0xF9;
  16.                 return;
  17.             case 0x43:
  18.                 p2mark=0xF6;
  19.                 return;
  20.             case 0x44:
  21.                 p2mark=0xFA;
  22.                 return;
  23.             case 0x45:
  24.                 p2mark=0xF0;
  25.                 return;
  26.             default:
  27.                 return;
  28.         }
  29.     }
  30.     else
  31.         return;
  32. }
  33. //接收串口数据,符合要求的为4位字符串
  34. void UART_Interrupt_Receive(void) interrupt 4
  35. {
  36.     int i;
  37.     if(RI==1)//中断接收打开,进入接收
  38.     {
  39.         RI=0;//开始接收串口数据,RI清0
  40.         if(rec_flag==0) //标志为0,等待接收数据
  41.         {
  42.             if(SBUF==0x23) //缓冲区为0x23(#),表示有命令数据,标志置1,i置0,开始接收下一个,第一位丢弃
  43.             {
  44.                 rec_flag=1;
  45.                 i=0;
  46.             }
  47.         }
  48.         else//如果标志为1,正在接收数据
  49.         {
  50.             if(SBUF==0x23)//如果缓冲区为0x23(#),接收完成
  51.             {
  52.                 rec_flag=0; //标志置0
  53.                 if(i==2) //如果i=2,数据已经接收完毕,开始解码,不为3位表示接收的不是命令字符,不需要解码
  54.                 {
  55.                     Communication_Decode();
  56.                 }
  57.                 i=0; //解码完成后i置0
  58.             }else  //如果正在接收数据时缓冲区不为0x23,即接收进行中
  59.             {
  60.                 buffer[i]=SBUF; //从SBUF读入数据
  61.                 //UART_send_byte(buffer[i]);
  62.                 //UART_send_byte(buffer[1]);
  63.                 i++;
  64.             }
  65.         }
  66.     }
  67.     else
  68.     {
  69.         TI=0;  //中断接收未打开,进入发送中断
  70.     }
  71. }
打赏
原文链接:,转发请注明来源!

发表评论