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;也不行
展开
 我来答
尚云社
2012-10-25 · TA获得超过392个赞
知道小有建树答主
回答量:229
采纳率:0%
帮助的人:282万
展开全部
如楼上那位所说的,你这个程序只在开机的时候读取过一次串口,应当把这个读取和显示的程序放到循环中来,还有就是你的程序中
****************接收一个字符*******************************/
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;不会被执行
笑谈我不言9514
2012-10-25 · TA获得超过622个赞
知道小有建树答主
回答量:522
采纳率:0%
帮助的人:317万
展开全部
不知道你用的什么编译器,AVR的中断程序不是这样写的,是有固定格式的,就跟51单片机里用Keil编程时用 interrupt 4 一样,没对应的格式,进不了中断。
SIGNAL(SIG_UART0_RECV)//中断接收
{
uchar dat;

dat = UDR0;
}

这是在AVR Studio GCC 下的写法。
本回答被网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
yfhaoa
2012-10-25 · TA获得超过1650个赞
知道小有建树答主
回答量:391
采纳率:0%
帮助的人:560万
展开全部
把receive();和extract();两个函数,放到while(1)里面去,因为你只是在进入mian时候给初始化了一下,而单片机真正运行起来,这两个函数都没有被调用。如果放进去还不行的话,只需检查串口程序和初始化设置。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式