美文网首页
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