马老师你好,对照书上第十三章的USART的程序, MEGA 16 USART接收不到,请帮我看看,谢谢了!
我使用的是ICCAVR6。25,对照书上例子,将TXC与RXC两个脚直接连接起来,程序发送0-15,RX接收后显示,可是结果只显示0,我看了好几天了,不明白,马老师能帮我看看指点一下吗?谢谢你了!按理说没有问题啊。。。
#include<iom16v.h>
#include<macros.h>
#define uchar unsigned char
#define uint unsigned int
#define ulong unsigned long
#define BAUD 9600
#define CRYSTAL4000000
#define FRAMING_ERROR (1<<FE) //接收帧错
#define PARITY_ERROR (1<<PE)//校验错误
#define DATA_OVERRUN (1<<DOR) //接收数据溢出错
#define DATA_REGISTER_EMPTY (1<<UDRE) //数据寄存器空
#pragma data:code
consttable_duan[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d, 0x07,
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0};
consttable_wei[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
#pragma interrupt_handler USART_RXC:12//RX接收中断涵数
void USART_RXC()
{
uchar status,data;
UCSRB&=~BIT(RXCIE);//RXCIE
status=UCSRA;
data=UDR;
if(status&(FRAMING_ERROR|PARITY_ERROR|DATA_OVERRUN)==0)
PORTC=table_duan;
UCSRB|=BIT(RXCIE);
}
void USTART_TXC(uchar data) //数据发送
{
while(!(UCSRA&DATA_REGISTER_EMPTY));
UDR=data;
}
void init_usart()//初始化
{
PORTD=0X03;
DDRD=0X02;
UCSRA=0X00;
UCSRB=(1<<RXCIE)|(1<<RXEN)|(1<<TXEN);//10011000
UCSRC=(1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0);
UBRRH=0;// 晶振使用4M,波特率9600
UBRRL=25;//
}
void delay(uint z) //延时函数
{
uint x,y;
for(x=0;x<z;x++)
for(y=0;y<5;y++);
}
void main()
{
uchar i=0;
DDRA=0X0f;
PORTA=table_wei; //数码管位选
DDRC=0xff;
PORTC=table_duan; //数码管段选
init_usart();
SEI();
while(1)
{
if(i++==15)i=0;
USTART_TXC(i);
delay(5000);
}
} 问题找到了,呵呵,if(status&(FRAMING_ERROR|PARITY_ERROR|DATA_OVERRUN)==0) 这句有问题呀。。。原来里面要加括号,否则会选判断测试等于0再与。晕,基本功不扎实啊,以后要多练啊!打扰马老师了,不好意思。。 跟我犯得错误一样啊 自己能检查出来 很不容易啊 抄书和传承区别就在于是否理解了。。。
页:
[1]