智能车制作
标题:
求助: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