各位大侠,能不能看看下面的程序有什么错误,或需要改进的地方? 端口已经设置好了。编译环境是GCC ,
//发送字符voidusart_send(uchari){while(!(UCSRA&(1<<UDRE)));//采用查询方式发送UDR=i;}//接收中断函数SIGNA...
//发送字符
void usart_send(uchar i)
{
while(!(UCSRA&(1<<UDRE))); //采用查询方式发送
UDR=i;
}
//接收中断函数
SIGNAL(SIG_USART_RECV)
{
Recv_Flag=1;
temp=UDR;
}
//主函数
int main(void)
{
init_devices();
Delay_1ms(40);
Recv_Flag=1;
UCSRB|=0x80;
sei();
while(1)
{
if(Recv_Flag)
{
Recv_Flag=0;
usart_send(temp);
}
}
}
编译没错误,但是PC发送了没有接收, 展开
void usart_send(uchar i)
{
while(!(UCSRA&(1<<UDRE))); //采用查询方式发送
UDR=i;
}
//接收中断函数
SIGNAL(SIG_USART_RECV)
{
Recv_Flag=1;
temp=UDR;
}
//主函数
int main(void)
{
init_devices();
Delay_1ms(40);
Recv_Flag=1;
UCSRB|=0x80;
sei();
while(1)
{
if(Recv_Flag)
{
Recv_Flag=0;
usart_send(temp);
}
}
}
编译没错误,但是PC发送了没有接收, 展开
展开全部
看样子用的AVR,你应该说一下芯片型号。不然不好回答的,这个是全部的程序吗,只看到一条UCSRB|=0x80设置串口的语句,光这个不够的,给你个参考。void intiuart(void)
{
DDRE = 0xFE;// RXD(PE0)输入,上拉有效, TXD(PE1)输出
PORTE = 0xFF;//
// USART初始化
UCSRA = 0x00;
UCSRB = (1<<RXCIE)|(1<<TXEN)|(1<<RXEN) ;// 允许RXC中断,发送允许
UCSRC = (1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0); // 8 Data, 1 Stop, No Parity
UBRRH = BAUD_H; // 设置波特率
UBRRL = BAUD_L;
}
#ifndef __UART_0_H__
#define __UART_0_H__
#define BAUD 9600 //波特率采用9600bps
#define CRYSTAL 8000000 //系统时钟8MHz
//计算和定义波特率设置参数
#define BAUD_SETTING (unsigned int)((unsigned long)CRYSTAL/(16*(unsigned long)BAUD)-1)
#define BAUD_H (unsigned char)(BAUD_SETTING>>8)
#define BAUD_L (unsigned char)(BAUD_SETTING)
// USART控制和状态寄存器的标志位定义
#define RXC 7 // UCSRA位定义
#define TXC 6
#define UDRE 5
#define FE 4
#define DOR 3
#define PE 2
#define U2X 1
#define MPCM 0
#define RXCIE 7 // UCSRB位定义
#define TXCIE 6
#define UDRIE 5
#define RXEN 4
#define TXEN 3
#define UCSZ2 2
#define RXB8 1
#define TXB8 0
#define URSEL 7 // UCSRC位定义
#define UMSEL 6
#define UPM1 5
#define UPM0 4
#define USBS 3
#define UCSZ1 2
#define UCSZ0 1
#define UCPOL 0
#define FRAMING_ERROR (1<<FE)
#define PARITY_ERROR (1<<PE)
#define DATA_OVERRUN (1<<DOR)
#define DATA_REGISTER_EMPTY (1<<UDRE)
#endif
{
DDRE = 0xFE;// RXD(PE0)输入,上拉有效, TXD(PE1)输出
PORTE = 0xFF;//
// USART初始化
UCSRA = 0x00;
UCSRB = (1<<RXCIE)|(1<<TXEN)|(1<<RXEN) ;// 允许RXC中断,发送允许
UCSRC = (1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0); // 8 Data, 1 Stop, No Parity
UBRRH = BAUD_H; // 设置波特率
UBRRL = BAUD_L;
}
#ifndef __UART_0_H__
#define __UART_0_H__
#define BAUD 9600 //波特率采用9600bps
#define CRYSTAL 8000000 //系统时钟8MHz
//计算和定义波特率设置参数
#define BAUD_SETTING (unsigned int)((unsigned long)CRYSTAL/(16*(unsigned long)BAUD)-1)
#define BAUD_H (unsigned char)(BAUD_SETTING>>8)
#define BAUD_L (unsigned char)(BAUD_SETTING)
// USART控制和状态寄存器的标志位定义
#define RXC 7 // UCSRA位定义
#define TXC 6
#define UDRE 5
#define FE 4
#define DOR 3
#define PE 2
#define U2X 1
#define MPCM 0
#define RXCIE 7 // UCSRB位定义
#define TXCIE 6
#define UDRIE 5
#define RXEN 4
#define TXEN 3
#define UCSZ2 2
#define RXB8 1
#define TXB8 0
#define URSEL 7 // UCSRC位定义
#define UMSEL 6
#define UPM1 5
#define UPM0 4
#define USBS 3
#define UCSZ1 2
#define UCSZ0 1
#define UCPOL 0
#define FRAMING_ERROR (1<<FE)
#define PARITY_ERROR (1<<PE)
#define DATA_OVERRUN (1<<DOR)
#define DATA_REGISTER_EMPTY (1<<UDRE)
#endif
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询