小R科技-WIFI机器人网·机器人创意工作室

 找回密码
 立即注册
查看: 7671|回复: 4

对WIFI小车下位机程序的几点疑惑

[复制链接]
发表于 2014-3-23 17:30:02 | 显示全部楼层 |阅读模式
第一,在串口程序中,为什么要设置串口的波特率可变呀,如果是为了满足不同单片机,或者以后升级用,我想把下面的这段改成固定的9600, 11.05M晶振用,怎么改呢?
void UART_init(void)
{
PCON |= 0x80;  //使能波特率倍速位SMOD
SCON = 0x50;  //8位数据,可变波特率
BRT = RELOAD_COUNT;  //设定独立波特率发生器重装值
AUXR |= 0x04;  //独立波特率发生器时钟为Fosc,即1T
AUXR |= 0x01;  //串口1选择独立波特率发生器为波特率发生器
AUXR |= 0x10;  //启动独立波特率发生器
ES      =   1;    //允许串口中断
    EA      =   1;    //开总中断
TI      =   1;
}


每二个问题不是很明白是怎么样解析出正确的包头和包尾的,不明白下面程序的运行过程
void UART_Interrupt_Receive(void) interrupt 4
{
static uint8 i;

    if(RI==1)
    {
        RI  =   0;
        if(rec_flag==0)
  {
   if(SBUF==0xff)
   {
    rec_flag=1;
    i=0;
   }   
  }
  else
  {
   if(SBUF==0xff)
   {
    rec_flag=0;
    if(i==3)
    {
     Communication_Decode();  
    }
    i=0;
   }
   else
   {
    buffer[i]=SBUF;
    i++;
   }
  }  
    }
    else
    {
        TI  =  0;
    }
}
回复

使用道具 举报

发表于 2014-3-23 18:58:39 | 显示全部楼层
这位大哥你没有学过c语言吗?设置波特可以看看单片机的参考书或者STC的技术文档。
回复 支持 反对

使用道具 举报

发表于 2014-3-23 21:50:38 | 显示全部楼层
建议先系统的学习一下单片机!这个很重要!
回复 支持 反对

使用道具 举报

发表于 2014-3-24 23:50:34 | 显示全部楼层
要努力学习吖。。。。。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-3-25 22:44:04 | 显示全部楼层
我把程序改成了这样:
#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int

int buffer[3];
int rec_flag=0;

//串口初始化
void UART_Init(void)
{
   TMOD = 0x21;
   PCON = 0x00;
   SCON = 0x50;
   TH1 = 0xFd; //设置波特率 9600
   TL1 = 0xFd;
   TR1 = 1; //启动定时器1
   ES = 1; //开串口中断
   EA = 1; //开总中断
   IT0=0;
   EX0=1;
}

//主函数
void main(void)
   {
      UART_Init();
      while(1)
         {
          }
    }
//根据串口信息执行相应动作子函数
void Communication_Decode(void)
   {
      if(buffer[0]==0x00)
           {
            switch(buffer[1])
              {
               case 0x01:P0=0xF6; return;
               case 0x02:P0=0xF9; return;
               case 0x03:P0=0xF5; return;
               case 0x04:P0=0xFA; return;
               case 0x00:P0=0x00; return;
               default: return;
              }
            }
      else
            {
             return;
             }
    }


//串口接收中断函数
void INT_UartRcv(void) interrupt 4
  {
         static int i;
      if(RI==1)
        {
          RI = 0;
          if(rec_flag==0)
              {
                if(SBUF==0xff)
                  {
                    rec_flag=1;
                    i=0;
                   }
               }
                else
                  {
                    if(SBUF==0xff)
                      {
                        rec_flag=0;
                        if(i==3)
                         {
                          Communication_Decode();
                          }
                          i=0;
                       }
                       else
                        {
                          buffer[i]=SBUF;
                          i++;
                         }
                   }
          }
         else
         {
          TI = 0;
          }
     }
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

新品特惠推荐上一条 /2 下一条

QQ|QQ技术咨询1|QQ技术咨询2|商务合作微信1:xiaorgeek001|商务合作微信2:XiaoRGEEK|诚聘英才|Archiver|手机版|小R科技-WIFI机器人网·机器人创意工作室 ( 粤ICP备15000788号-6 )

GMT+8, 2024-9-8 10:20 , Processed in 1.074465 second(s), 19 queries .

Powered by XiaoR GEEK X3.4

© 2014-2021 XiaoR GEEK

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