智能车制作

标题: 求助:AVR Mega16单片机的串口通信初始化程序? [打印本页]

作者: 王鹏    时间: 2013-5-10 22:07
标题: 求助:AVR Mega16单片机的串口通信初始化程序?
求助
作者: 1006110218    时间: 2013-5-10 22:24
//******串口通信的设置步骤*****///
/*一般情况下我们发使用查询法、而接受使用中断、数据寄存器为空一般不用

其中我们会用到数据缓存器寄存器UDR即类似于51中的SBUF寄存器,其中的发送数据缓存器与接受数据缓存器占相同的地址

第一步:设置USART的控制与状态寄存器:UCSRA含有一些中断的标志位和是否倍速模式,在默认的情况下可以不用设置此寄存器
                                                                   :UCSRB包含一些中断的使能位和接受与发送使能
                                                                   :UCSRC与UBRRH(波特率设置寄存器的高8位)共用同一个IO口地址,当其第七位URSEL为1时选择了UCRSC寄存器,当其为0时选择了UBRRH
                                                                   :UCSRC包含了寄存器选择、同步或异步模式的选择、发送数据位数的选择、以及奇偶校验位的选择和停止位的个数

第二步:波特率的设置,即给UBRRH与UBRRl的赋值,低8位加上高寄存器中的低4位共12位

第三步:串口中断函数初始化(主要是接受中断函数)

第四步:开总中断sei();

void USART_intial()
{
   UCSRA&=~(1<<U2X);//设置普通的模式,还可以用来设置倍速模式
   UCSRB=0x98;//使能了接收中断的使能位,而发送与数据寄存器为空中断没有使能,开了发送和接受使能,       
   UCSRC|=(1<<URSEL);//选择为控制寄存器
   UCSRC=0x96;//设置为异步无奇偶校验,停止位为1和8位数据位
   UBRRH=0;
   UBRRL=51;//为波特率为9600,有0.2%的误差,晶振为8MHZ,其实可以通过公式去计算波特率,UBRR=[Fosc/(16*BAUD)]-1;
   sei();

}

void USRAT_send(uchar date)
{
  while(!(UCSRA&(1<<UDRE)));//判断数据寄存器UDR是否为空,不空则等待,空则发送
  UDR=date;
  while(!(UCSRA&(1<<TXC)));//发送完成则TXC置位,否则等待
  UCSRA&=~(1<<TXC);//由于在中断函数中发送标志位会自动清零,但由于我们没有用发送中断函数所以我们要软件清零
  
}
作者: 王鹏    时间: 2013-5-11 09:23
非常感谢
作者: 严鸿雁    时间: 2013-5-11 11:20
准备参加国晒





欢迎光临 智能车制作 (http://dns.znczz.com/) Powered by Discuz! X3.2