原创 使用Atmega48V的USART0

2008-8-27 15:18 4633 11 11 分类: MCU/ 嵌入式

在学校的时候总是用Atmega16的,总是听朋友说Atmega48V的种种优点:低功耗,价格便宜等等,总之就是性价比很高的一款单片机。最近想对Atmega48V学习学习,可是刚开始调试USART0就调试不通,整整忙活了两天。在网上也找了很多例子,但是大部分都是关于Atmega16的,改了很多次就是不成功,不管发送什么数据,串口调试助手接受的都是十六进制数80。


郁闷了好长时间,今天在调试的时候,我发现Atmega48的熔丝配置里的最上面有一个系统始终8分频的选项(Divide clock by internally),不选中,重新编译下载程序。居然成功了!


仔细想想,当熔丝配置成8M的时候其实系统只有1M,而我的波特率一直是以8M计算的,所以串口发送和接受数据不成功。接着我又选中系统始终8分频的选项,波特率按1M计算,发送依然成功,以前很少注意到这个选项的。下面是我的程序:


//------------------------------------- ATMega48V-8MHz --------------------------------------------------
//用途:基于ATMega48V的USART0测试程序
//
//开发软件:GCCAVR 20080512
//
//开发人员: Farmer
//
//版本:2008年8月27日
//
//说明:
//--------------------------------------------------------------------------------------------------------------
#include <avr/io.h>
unsigned int data;
int main(void)
{


  UBRR0H=0;
  UBRR0L=51; //9600
  //特别说明:当Divide clock by internally被选中的时候   是  6
  //          当Divide clock by internally未被选中的时候 是  51
  UCSR0C=(0<<UMSEL01)|(0<<UMSEL00)|(1<<UCSZ01)|(1<<UCSZ00);
  //8位数据位和1位STOP位
  UCSR0B=(1<<RXEN0)|(1<<TXEN0);   //允许发送和接收
 
  while(1)
  {
   
    while(!(UCSR0A&(1<<RXC0)));  //RXC为1,表示USART接受完成
    data="UDR0";
 while(!(UCSR0A&(1<<UDRE0)));  //该位为1,表示数据发送已准备好
    UDR0=data;
 
 
  }
}


//用途:基于ATMega48V的USART0测试程序
//
//开发软件:ICCAVR
//
//开发人员: Farmer
//
//版本:2008年8月27日


#include <iom48v.h>
unsigned int data;
void com_init()
{


  UBRR0H=0;
  UBRR0L=6; //9600 bps  Divide clock by internally被选中
  UCSR0C=(0<<UMSEL01)|(0<<UMSEL00)|(1<<UCSZ01)|(1<<UCSZ00);
  //8位数据位和1位STOP位
  UCSR0B=(1<<RXEN0)|(1<<TXEN0);   //允许发送和接收
                
}
void main(void)
{
com_init();


while(1)
  {
  while(!(UCSR0A&(1<<RXC0)));  //RXC为1,表示USART接受完成
    data="UDR0";
 while(!(UCSR0A&(1<<UDRE0)));  //该位为1,表示数据发送已准备好
    UDR0=data;
  } 
}

PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
我要评论
0
11
关闭 站长推荐上一条 /3 下一条