WIFI小车记录五:单片机串口通信

来源:互联网 发布:lol面具淘宝 编辑:程序博客网 时间:2024/04/30 14:22

    单片机用的是ATMege 128,编程软件用的是ICCV8 for AVR CodeBlocks IDE。CodeBlocks 这么好用的IDE套在了ICCAVR上面,用起来各种好看各种爽啊,各种配置只要点点点就可以自动生成!!

    单片机编程已经有点经验,总体上还是比较简单的。遇到困难的地方主要就是串口通信了,之前没有接触过。好在也一个个解决了。下面就贴一下串口通信的代码吧。

    这是IDE里面自带的配置工具,只要点一点就可以生成代码啦,下面就是我的配置。

下面就是生成的串口0初始化代码,直接copy就可以

void uart0_init(void){ UCSR0B = 0x00; //disable while setting baud rate UCSR0A = 0x00; UCSR0C = 0x06; UBRR0L = 0x33; //set baud rate lo UBRR0H = 0x00; //set baud rate hi UCSR0B = 0xD8;}

这里使用中断接收数据。

#pragma interrupt_handler uart0_rx_isr:iv_USART0_RXCvoid uart0_rx_isr(void){    CLI();    Rece[0]=UDR0;    if(Rece[0]=='A')   //编码起始字符    {        do        {            while( !(UCSR0A & (1<<RXC0)) );//RXC检验接受缓冲器中是否还有数据未读出            i++;            Rece[i]=UDR0;            if(Rece[i]=='A')  //编码结束字符                break;        }while(1);            if(Rece[i-3]=='C')   //如果是C,则调用控制模式函数                 WirelessControl(Rece[i-2]);  //控制模式            else if(Rece[i-3]=='D')   //如果是D,则调用驾驶模式函数                 WirelessDrive(Rece[i-2],Rece[i-1]);   //两个参数,一个是方向,一个是速度大小        i=0;    }    SEI(); //uart has received a character in UDR}

驾驶模式函数

void WirelessDrive(char c1,char c2){    int speedrate=c2-'0';    if(c1=='L')    {        LeftWheel(0.7,0);        RightWheel(0.7*(10-speedrate)/10,0);    }    else if(c1=='R')    {        LeftWheel(0.7*(10-speedrate)/10,0);        RightWheel(0.7,0);    }    else if(c1=='F')    {        RightDriveSpeed=0.7;        LeftDriveSpeed=0.7;        RightWheel(RightDriveSpeed,0);        LeftWheel(LeftDriveSpeed,0);    }    else if(c1=='B')    {        RightDriveSpeed=0.7;        LeftDriveSpeed=0.7;        RightWheel(RightDriveSpeed,1);        LeftWheel(LeftDriveSpeed,1);    }    else if(c1=='S')    {        RightDriveSpeed=0;        LeftDriveSpeed=0;        RightWheel(RightDriveSpeed,0);        LeftWheel(LeftDriveSpeed,0);    }}

串口发送则使用查询模式

void SendChar(unsigned char c) //发送采用查询方式{    while(!(UCSR0A&(1<<UDRE0)));     //等待UDR为空    UDR0 = c;}void SendString(unsigned char *ptr){    UCSR0B|=0x08;    UCSR0A|=0x20;    while (1)    {        if((*ptr)!='\0')           {               SendChar(*ptr);                ptr++;           }           else           {                UCSR0A&=0xdf;                UCSR0B&=0xf7;                break;           }    }}


串口通信大体程序就是这样。








0 0
原创粉丝点击