美文网首页
AVR 串口程序

AVR 串口程序

作者: 光头不光还亮 | 来源:发表于2020-03-25 10:51 被阅读0次

    #include<iom128v.h>

    #include <macros.h>

    #define uchar unsigned char

    #define uint unsigned int

    #define mclk 8000000

    #pragma interrupt_handler uart rx0:19//定义RX结束中断

    //#pragma#pragma interrupt_handler uart_rx1:31

    long int rdata0,rdata1,rx_i,flag = 0,flag1=0;

    long int wdata[10];

    uchar rx_data[6];

    long int fre_span = 0,fre_g;

    long int fre_m;

    void delay(uint ms)

    {

    uint i,j;

    for(i = 0; i < ms;i ++)

    {

    for(j=0;j <1141;j++)

    ;

    }

    }

    void uart_init0(uint baud0)

    {

    UCSR0B = 0X00;

    UCSR0A = 0X00; //控制寄存器清零

    //UCSR1B = 0X00;

    //UCSR1A = 0X00; //控制寄存器清零

    UCSR0C = (1<<UCSZ01)|(1<<UCSZ00);8位数据位,其余位默认0,异步模式,奇偶模式:禁止,1位停止位

    //UCSR1C = (1<<UCSZ11)|(1<<UCSZ10);

    baud0 = mclk / 16/9600-1;//波特率最大为65K , BURR = (Fosc/(16*baud))-1,BURR寄存器值,Fosc时钟,baud波特率

    //baud1 = mclk / 16 / baud1-1;

    UBRR0L = mclk/16/9600-1;

    UBRR0H = (mclk/16/9600-1) >> 8;//设置波特率

    UBRR1L = mclk/16/9600-1;

    UBRR1H = (mclk/16/9600-1) >> 8;

    UCSR0B = (1<<TXEN0) | (1<<RXEN0) | (1<<RXCIE0);//接收,发送使能,接收中断使能

    //UCSR1B = (1<<TXEN1) | (1<<RXEN1) | (1<<RXCIE1);

    SREG = BIT(7); //全局中断开发

    }

    void uart_sendB0(long int data0)

    {

    while(!(UCSROA & (BIT(UDRE0))))//UDRE0=1S说明数据缓冲器为空

    UDR0 = data0;                    //UDR数据寄存器

    while(!(UCSR0A & (BIT(TXC0))))//缓冲器为空,TXC0置位=1

    UCSR0A |= BIT(TXC0);写1进行清除,为下次检测准备

    }

    void uart_rx0()

    {

    //UCSR0B = ~BIT(RXCIE0);//关闭接收中断

    rdata0 = UDR0;

    switch(flag)

    {

    case 0:if(rdata0 == 'Q')

    flag = 1;

    else

    flag = 0;

    break;

    case 1:Wdata[0] = rdata0; flag = 2;break;

    case 2:Wdata[1] = rdata0; flag = 3;break;

    case 3:wdata[2] = rdata0; flag = 4;break;

    case 4:Wdata[3] = rdata0; flag = 5;break;

    case 5:Wdata[4] = rdata0; flag = 6;break;

    case 6:Wdata[5] = rdata0; flag = 7;break;

    case 7:Wdata[6] = rdata0; flag = 8;break;

    case 8:Wdata[7] = rdata0; flag = 9;break;

    case 9:if(data0 == 'G')

    flag = 10;

    else

    flag = 0;

    break;

    default:break;

    }

    //flag = 1;

    //UCSR0B |= BIT(RXCIE0);//启动接收中断

    }

    void uart_rx1()

    {

    UCSR1B &= ~BIT(RXCIE1);//关闭接收中断

    rdata0 = UDR1;

    switch(flag)

    {

    case 0 :

    if(rdata0 == 0x55) flag = 1;

    else if (rdata0 == 0x33) flag = 5;

    esle if (rdata0 == 0x66) flag =12;

    else flag = 0;

    break;

    case 1:Wdata[0] = rdata0; flag = 2;break;

    case 2:Wdata[1] = rdata0; flag = 3;break;

    case 3:if(rdata0 == 0xf0) break;

    else flag = 0;break;

    case 5:Wdata[0] = rdata0; flag = 6;break;

    case 6:Wdata[1] = rdata0; flag = 7;break;

    case 7:Wdata[2] = rdata0; flag = 8;break;

    case 8:Wdata[3] = rdata0; flag = 9;break;

    case 9:Wdata[4] = rdata0; flag = 10;break;

    case 10:

    if(rdata0 == 0xff) break;

    else flag = 0;

    break;

    case 12:rx_data[0] = rdata0;flag = 13;break;

    }

    }

    相关文章

      网友评论

          本文标题:AVR 串口程序

          本文链接:https://www.haomeiwen.com/subject/nrrtuhtx.html