397379140 发表于 2009-9-2 23:18:20

马老师你好,对照书上第十三章的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);
   
   }
}

397379140 发表于 2009-9-3 01:04:34

问题找到了,呵呵,if(status&(FRAMING_ERROR|PARITY_ERROR|DATA_OVERRUN)==0) 这句有问题呀。。。原来里面要加括号,否则会选判断测试等于0再与。晕,基本功不扎实啊,以后要多练啊!打扰马老师了,不好意思。。

qzf368 发表于 2009-9-3 22:28:09

跟我犯得错误一样啊 自己能检查出来 很不容易啊

hetiger 发表于 2009-9-5 20:00:54

抄书和传承区别就在于是否理解了。。。
页: [1]
查看完整版本: 马老师你好,对照书上第十三章的USART的程序, MEGA 16 USART接收不到,请帮我看看,谢谢了!