AVR mega16 与PC 串口通信问题 我想通过PC端的串口助手发送一个十六进制数据到单片机
通过PC端的串口助手发送一个十六进制数据到单片机,并且在与PORTB连接的8个二极管灯上显示出来。以下是我的程序:/****************接收一个字符*****...
通过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;
}
/*******************主程序****************************/
void main(void)
{
CLI(); //总中断禁止
init_devices();
SEI(); //总中断允许
receive();
extract();
while(1) //循环等待中断处理
{
}
}
初始化和变量定义应该都没问题,但是好像单片机无法接受数据,灯也不亮
求前辈指教!
改成PORTB=data_temp;也不行 展开
3个回答
展开全部
如楼上那位所说的,你这个程序只在开机的时候读取过一次串口,应当把这个读取和显示的程序放到循环中来,还有就是你的程序中
****************接收一个字符*******************************/
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;不会被执行
****************接收一个字符*******************************/
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;不会被执行
展开全部
不知道你用的什么编译器,AVR的中断程序不是这样写的,是有固定格式的,就跟51单片机里用Keil编程时用 interrupt 4 一样,没对应的格式,进不了中断。
SIGNAL(SIG_UART0_RECV)//中断接收
{
uchar dat;
dat = UDR0;
}
这是在AVR Studio GCC 下的写法。
SIGNAL(SIG_UART0_RECV)//中断接收
{
uchar dat;
dat = UDR0;
}
这是在AVR Studio GCC 下的写法。
本回答被网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
把receive();和extract();两个函数,放到while(1)里面去,因为你只是在进入mian时候给初始化了一下,而单片机真正运行起来,这两个函数都没有被调用。如果放进去还不行的话,只需检查串口程序和初始化设置。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询