这样改没错,但是要根据头文件来看,这样改的也放心啊,发送正常,看看中断使能是否都正确了呢,我这边有个我原来改的: 参考一下吧
//--------------UART接受中断函数-----------------
#pragma interrupt_handler uart_rx0:19
void uart_rx0(void)
{
static uchar EP;
UCSR0B&=~BIT(RXCIE0); //从上位机读取数据,RX中断使能关闭
// UCSR1B&=~BIT(RXCIE1); //从上位机读取数据,RX中断使能关闭
String0[EP]=UDR0;
//PORTB|=BIT(PB7);
EP++;
PORTB|=BIT(PB7);
/*if(String0[1]==0x6B)
{
EP=0;
}*/
if(EP==13) //String0[EP]==0x03&&
{
// EP_N=13;
EP=0;
flag0=1;
PORTB&=~BIT(PB7);
}
//UCSR1B|=BIT(RXCIE1);//RX中断使能打开
UCSR0B|=BIT(RXCIE0);//RX中断使能打开*/
}
#pragma interrupt_handler uart_rx1:31
//中断向量19是RX0结束后开始 31是RX1结束后开始
//extern void delay(uint ms);
void uart_rx1(void)
{
static uchar II=0; //定义局部函数内的静态变量
UCSR1B&=~BIT(RXCIE1); //从上位机读取数据,RX中断使能关闭
//UCSR0B&=~BIT(RXCIE0); //从上位机读取数据,RX中断使能关闭
String1[II]=UDR1;
II++;
if(II==9)
{
II=0;
flag1=1;
}
UCSR1B|=BIT(RXCIE1);//RX中断使能打开
//UCSR0B|=BIT(RXCIE0);//RX中断使能打开
}
//-------------------------------------------------------
// UART setup ----------------------------
//-------------------------------------
void uart0_init(uint baud)
{
UCSR0B=0x00;
UCSR0A=0x00; //控制寄存器清零
UCSR0C=(1<<UCSZ01)|(1<<UCSZ00);
//选择UCSRC,异步模式,禁止
// 校验,1位停止位,8位数据位
baud=mclk/16/baud-1 ; //波特率最大为65K
UBRR0L=baud;
UBRR0H=baud>>8; //设置波特率
UCSR0B=(1<<TXEN0)|(1<<RXEN0)|(1<<RXCIE0); //UCSRB=(1<<TXEN)|(1<<RXEN)|(1<<RXCIE);
//接收、发送使能,接收中断使能
// SREG=BIT(7); //全局中断开放
DDRE|=0X02; //配置TX0为输出(很重要)
//DDRD&=~BIT(0);
}
void uart1_init(uint baud)
{
UCSR1B=0x00;
UCSR1A=0x00; //控制寄存器清零
UCSR1C=(1<<UCSZ11)|(1<<UCSZ10);
//选择UCSRC,异步模式,禁止
// 校验,1位停止位,8位数据位
baud=mclk/16/baud-1 ; //波特率最大为65K
UBRR1L=baud;
UBRR1H=baud>>8; //设置波特率
UCSR1B=(1<<TXEN1)|(1<<RXEN1)|(1<<RXCIE1); //UCSRB=(1<<TXEN)|(1<<RXEN)|(1<<RXCIE);
// UCSR1B=0x98; //接收中断允许,发送结束和寄存器空中断关闭,采用查询发送模式 //接收、发送使能,接收中断使能
// SREG=BIT(7); //全局中断开放
DDRD|=0X04; //配置TX1为输出(很重要)
//DDRD&=~BIT(0);
}
void UART_Send0(uchar Data[],uint num)
{
uint I;
// PORTD|=BIT(PD4);//PD=1 发送。
for(I=0;I<num;I++)
{
while(!(UCSR0A&(BIT(UDRE0)))); //数据寄存器UDR是否为空
UDR0=Data[I]; //UDR赋值
while(!(UCSR0A&(BIT(TXC0)))); //数据是否已经发送完毕?
UCSR0A|=BIT(TXC0); //清除发送完毕标志位
}
delay(2);
// PORTD&=~BIT(PD4);//PD=0;接收
}
void UART_Send1(uchar Data[],uint num)//uart1带485输出
{
uint I;
//UCSRB=(1<<TXEN)|(1<<RXEN);
//UCSRB&=~(1<<RXCIE);//接收禁止
//TIMSK&=~BIT(2);//定时器1溢出中断关闭
PORTD|=BIT(PD4);//PD=1 发送。
for(I=0;I<num;I++)
{
while(!(UCSR1A&(BIT(UDRE1)))); //数据寄存器UDR是否为空
UDR1=Data[I]; //UDR赋值
while(!(UCSR1A&(BIT(TXC1)))); //数据是否已经发送完毕?
UCSR1A|=BIT(TXC1); //清除发送完毕标志位
}
//UCSRB=(1<<TXEN)|(1<<RXEN)|(1<<RXCIE);
//TIMSK|=BIT(2);//定时器1溢出中断打开
delay(2);
PORTD&=~BIT(PD4);//PD=0;接收
}
//
|