AVR mega16 与PC 串口通信问题 我想通过PC端的串口助手发送一个十六进制数据到单片机

通过PC端的串口助手发送一个十六进制数据到单片机,并且在与PORTB连接的8个二极管灯上显示出来。

以下是我的程序:
/****************接收一个字符*******************************/
uchar receive(void)
{
while(!(UCSRA&(1<<RXC)));
return UDR;
data_temp=UDR;
}

/*********************二极管显示**************************/

void extract(void)
{
DDRB=0xFF; //设PD口为输出
PORTB=UDR;

}

/*******************主程序****************************/
void main(void)
{

CLI(); //总中断禁止
init_devices();
SEI(); //总中断允许

receive();

extract();

while(1) //循环等待中断处理
{

}
}

初始化和变量定义应该都没问题,但是好像单片机无法接受数据,灯也不亮
求前辈指教!
改成PORTB=data_temp;也不行

如楼上那位所说的,你这个程序只在开机的时候读取过一次串口,应当把这个读取和显示的程序放到循环中来,还有就是你的程序中
****************接收一个字符*******************************/
uchar receive(void)
{
while(!(UCSRA&(1<<RXC)));
return UDR;
data_temp=UDR;
}

/*********************二极管显示**************************/

void extract(void)
{
DDRB=0xFF; //设PD口为输出
PORTB=UDR;
}
ATMEGA16单片机的UDR只能读取1次,所以接收时应该放入一个变量中,输出显示的时候将这个变量输出到PORTB端口。还有就是你这个data_temp在uchar receive(void)函数中根本就不会被赋值,在它前一条指令return UDR已经返回,data_temp=UDR;不会被执行
温馨提示:内容为网友见解,仅供参考
第1个回答  2012-10-25
不知道你用的什么编译器,AVR的中断程序不是这样写的,是有固定格式的,就跟51单片机里用Keil编程时用 interrupt 4 一样,没对应的格式,进不了中断。
SIGNAL(SIG_UART0_RECV)//中断接收
{
uchar dat;

dat = UDR0;
}

这是在AVR Studio GCC 下的写法。本回答被网友采纳
第2个回答  2012-10-25
把receive();和extract();两个函数,放到while(1)里面去,因为你只是在进入mian时候给初始化了一下,而单片机真正运行起来,这两个函数都没有被调用。如果放进去还不行的话,只需检查串口程序和初始化设置。
相似回答