用的是ICCAVR的编译器,型号为Atmega128A,熔丝位没有选M103,编译器单片机选ATmega128,下面的程序如果单独发送数据是没有什么大问题,但是加上了查询接收函数,发送就错误了,求解!
程序如下:
#include<iom128v.h>
#include<macros.h>
#define u8 unsigned char
#define u16 unsigned int
#define fosc 11059200
const table[8]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
u8 receive=0;
u8 flag=0;
void delay_ms(u16 n);//11059200
void USART_Init(u16 baud);
void USART_SendData(u8 dat);
u8 USART_GetData(void);
void USART_SendChar(char *s);
void delay_ms(u16 n)
{
u16 i,j;
for(i=1579;i>0;i--)//8-->1142;1.8432-->264
{
for(j=n;j>0;j--);
}
}
void USART_Init(u16 baud)
{
UCSR0B=0x00;//控制状态寄存器B各个标志位清零
UCSR0A=0x00;//控制状态寄存器A各个标志位清零
UCSR0C=0x06;//选择UCSRC,异步模式,禁止校验,1位停止位,8位数据位
//波特率最小为11059200/256/16=2700;最大为345600
UBRR0L=((fosc/16/baud)-1)%256;//设置波特率寄存器低8位
UBRR0H=((fosc/16/baud)-1)/256;//设置波特率寄存器高8位
UCSR0B=(1<<TXEN0)|(1<<RXEN0);//|(1<<RXCIE0);==0x18--->1:接收使能;8:发送使能
//接收、发送使能,接收中断使能
SREG|=BIT(7);//全局中断开放
PORTE = 0xFF; //设置RXD0和TXD0
DDRE|=0X02;//配置TX为输出(很重要)TXD0=PE1
}
void USART_SendData(u8 dat)
{
while(!(UCSR0A&(1<<UDRE0)));//UDREn为1 说明缓冲器为空
UDR0=dat;
// while(!(UCSR0A&BIT(TXC0)));//发送缓冲为空时,该位为1,写1清零
}
u8 USART_GetData(void)
{
// UCSR0B=0x10;//发送失能///////////////////////////////
while(!(UCSR0A&(1<<RXC0)));////Bit 7 –RXCn:USART有数据要接收-->接收缓冲器中有未读出的数据时RXCn 置位,否则清零。
receive=UDR0;
// UCSR0B=0x18;//发送失能//////////////////////////////
return receive;
}
void USART_SendChar(char *s)
{
while(*s)
{
USART_SendData(*s);
s++;
}
USART_SendData(0x0a);//回车
USART_SendData(0x0d);//换行
}
void main(void)
{
u8 count;
USART_Init(9600);
DDRC=0xff;
PORTC=0xff;
USART_SendChar("HELLO !");
while(1)
{
USART_GetData();
PORTC=~table[receive];
// USART_SendChar("收到数据:");
USART_SendData(receive);
// USART_SendChar(" ");
// USART_SendChar("Test Send OK !");
}
} |