各位大虾:我是刚学AVR单片机的。 现在用到AVR的串行中断问题。我的本意是想在电脑上通过COM软件向AVR单片机输入什么字节,然后单片机就反馈相同的字节回到电脑。 我现在碰到的问题是我在电脑上输入的是0x55但单片机却返回的是0xC0.我一直是以为波特率的问题。但我算了在算波特率还是这个。并根据资料上的说明也是这个波特率。我电脑上的软件的波特率设置是没问题的。我现在有点怀疑是不是我的学习板的硬件上有问题了。我的程序如下。请各位大虾们分析下。我的软件是否有问题。 #include<iom16v.h> #include<macros.h>
#define uchar unsigned char #define uint unsigned int #pragma interrupt_handler Receive_data:12 //#pragma interrupt_handler Tran_data:14 uchar tran_complete, received_complete,receive_data; void Delayms(uint time) { uint i; for(;time>0;time--) {for(i=0;i<124;i++);} } void Tran_data(uchar data1) { while(!(UCSRA&(1<<UDRE))); UDR=data1; //发送完成标志 } void Receive_data() { receive_data=UDR; Tran_data(receive_data); PORTB=0x7f; }
void Ini_sysm() { DDRB=0xff;//B口全部用作输出控制LED PORTB=0xff;//全部灯灭
/*************初始化串行口********/ tran_complete=0x55; received_complete=0x55; receive_data=0x00; UCSRB=0x00; UCSRA=0x00; UCSRC=BIT(URSEL)|0x06;//(1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0);//选择异步通信模式、禁止奇偶校验、一个 //停止位、8位数据位 UBRRL=0x2f; UBRRH=0x00;//设置波特率为9600 UCSRB=0x98;//(1<<RXEN)|(1<<TXEN);//允许接收、发送完成中断 //UCSRA=0x00; //允许接收发送 }
void main() { CLI(); Ini_sysm(); MCUCR=0x00; GICR=0x00; TIMSK=0x00; SEI(); while(1) { PORTB=0xfe; Delayms(500); PORTB=0xff; Delayms(500); } } |