AVR atmega16单片机串口通信 30
照着教程编写的单片机串口发送程序,通信没反应。单单发送字符’A‘,串口助手显示800080,?想了老半天了,求大神帮忙啊!感激不尽!想知道问题出在哪里了?以下是完整程序#...
照着教程编写的单片机串口发送程序,通信没反应。单单发送字符’A‘,串口助手显示80 00 80,?想了老半天了,求大神帮忙啊!感激不尽!想知道问题出在哪里了?以下是完整程序
#include <iom16v.h>
#include <macros.h>
#define uchar unsigned char
#define uint unsigned int
//#define BIT(n) (1<<n)
#pragma interrupt_handler uart_recdata:12
#define mcuclk 8000000
uchar rdata;
uchar flag=0;
void delay(uint n) //10ms延时
{
uint i,j;
for(i=0;i<n;i++)
for(j=0;j<1543;j++)
;
}
void uart_init(uint baud) //串口控制状态寄存器初始化,波特率设置
{
UCSRB=0x00;
UCSRA=0x00; //控制寄存器清零
UCSRC=(1<<URSEL)|(0<<UPM0)|(3<<UCSZ0); //选择UCSRC,异步模式,禁止
// 校验,1位停止位,8位数据位
baud=mcuclk/16/baud-1 ; //波特率
UBRRL=baud;
UBRRH=baud>>8; //设置波特率
UCSRB=(1<<TXEN)|(1<<RXEN)|(1<<RXCIE); //接收、发送使能,接收中断使能
SREG=BIT(7); //全局中断开放
DDRD|=0x02; //配置TX为输出(很重要)
}
void uart_senddata(uchar data)
{
while(!(UCSRA&(BIT(UDRE)))); //第五位UDRE为高,数据寄存器空,发数据至UDR
UDR=data;
while(!(UCSRA&(BIT(TXC)))); //第六位TXC高, 发送结束
UCSRA|=BIT(TXC); //置位TXC
}
void uart_recdata()
{
UCSRB&=~BIT(RXCIE);
rdata=UDR;
flag=1;
UCSRB|=BIT(RXCIE);
}
void main()
{
// uchar i='A';
// uchar j=4;
uart_init(19200);
while(1)
{
if(flag)
{
uart_senddata(rdata);
flag=0;
}
}
}
教程上照抄的程序,结果还出错,求解释! 展开
#include <iom16v.h>
#include <macros.h>
#define uchar unsigned char
#define uint unsigned int
//#define BIT(n) (1<<n)
#pragma interrupt_handler uart_recdata:12
#define mcuclk 8000000
uchar rdata;
uchar flag=0;
void delay(uint n) //10ms延时
{
uint i,j;
for(i=0;i<n;i++)
for(j=0;j<1543;j++)
;
}
void uart_init(uint baud) //串口控制状态寄存器初始化,波特率设置
{
UCSRB=0x00;
UCSRA=0x00; //控制寄存器清零
UCSRC=(1<<URSEL)|(0<<UPM0)|(3<<UCSZ0); //选择UCSRC,异步模式,禁止
// 校验,1位停止位,8位数据位
baud=mcuclk/16/baud-1 ; //波特率
UBRRL=baud;
UBRRH=baud>>8; //设置波特率
UCSRB=(1<<TXEN)|(1<<RXEN)|(1<<RXCIE); //接收、发送使能,接收中断使能
SREG=BIT(7); //全局中断开放
DDRD|=0x02; //配置TX为输出(很重要)
}
void uart_senddata(uchar data)
{
while(!(UCSRA&(BIT(UDRE)))); //第五位UDRE为高,数据寄存器空,发数据至UDR
UDR=data;
while(!(UCSRA&(BIT(TXC)))); //第六位TXC高, 发送结束
UCSRA|=BIT(TXC); //置位TXC
}
void uart_recdata()
{
UCSRB&=~BIT(RXCIE);
rdata=UDR;
flag=1;
UCSRB|=BIT(RXCIE);
}
void main()
{
// uchar i='A';
// uchar j=4;
uart_init(19200);
while(1)
{
if(flag)
{
uart_senddata(rdata);
flag=0;
}
}
}
教程上照抄的程序,结果还出错,求解释! 展开
2个回答
2014-06-02
展开全部
“单单发送字符’A‘,串口助手显示80 00 80,”
很明显是波特率不正确。。。检查串口助手设置的波特率与你程序设定的波特率是否一致。。
很明显是波特率不正确。。。检查串口助手设置的波特率与你程序设定的波特率是否一致。。
追问
一致啊,都是19200的
追答
下位机发一个字符A,上位机的串口会收到3个字节,除了波特率不对,俺想不出来还有啥原因。如果是干扰的话,不会总是这3个字节。
这样试试?
仿真,看下寄存器的设置是否符合你这个波特率的要求。。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询