232串行通讯,是工程开发里面最常用的通讯方式,avr的usar非常容易控制,使用查询方式,对其初始化,然后给UDR赋值即可发送,等待接收完标志位置位,读出UDR的值就是接收。<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />
当然还可以使用中断方式,我们提供的一个模块化的程序就是用中断来接收的。
建议:使用查询方式发送,中断方式接收,这样方便进行操作,而且节省CPU时间。
<?xml:namespace prefix = v ns = "urn:schemas-microsoft-com:vml" />
// ICC-AVR application builder : 2007-5-20 17:21:25
// Target : M16
// <?xml:namespace prefix = st1 ns = "urn:schemas-microsoft-com:office:smarttags" />Crystal: 7.3728Mhz
// AVR mega16 串口测试
// AVR与虚拟仪器 http://www.avrvi.com 古欣
// 连接:电源跳线,晶振跳线(注意,一定要使用7.3728M晶振)
// 使用串口延长线把板子和PC连起来,使用chuankou.exe 串口调试助手观察程序运行结果
#include
#include
#define F_CPU 7372800
const unsigned char buffer[]="http://www.avrvi.com";
void USART_Init( unsigned int baud )
{
unsigned int tmp;
/* 设置波特率*/
tmp= F_CPU/baud/16-1;
UBRRH = (unsigned char)(tmp>>8);
UBRRL = (unsigned char)tmp;
/* 接收器与发送器使能*/
UCSRB = (1<<?XML:NAMESPACE PREFIX = RXEN)|(1<
/* 设置帧格式: 8 个数据位, 2 个停止位*/
UCSRC = (1<<?XML:NAMESPACE PREFIX = URSEL)|(1<
}
/* UMSEL 模式选择
0 异步操作
1 同步操作
USBS 停止位位数
0 1
1 2
UCSZ2 UCSZ1 UCSZ0 字符长度
0 0 0 5 位
0 0 1 6 位
0 1 0 7 位
0 1 1 8 位
1 0 0 保留
1 0 1 保留
1 1 0 保留
1 1 1 9 位
*/
// ICC 生成的初始化
//UART0 initialize
// desired baud rate: 9600
// actual: baud rate:9600 (0.0%)
// char size: 8 bit
// parity: Disabled
void uart0_init(void)
{
UCSRB = 0x00; //disable while setting baud rate
UCSRA = 0x00;
UCSRC = BIT(URSEL) | 0x06;
UBRRL = 0x2F; //set baud rate lo
UBRRH = 0x00; //set baud rate hi
UCSRB = 0x18;
}
//下面两个函数直接从数据手册上拷贝过来的
// 数据发送【发送5 到8 位数据位的帧】
void USART_Transmit( unsigned char data )
{
/* 等待发送缓冲器为空 */
while ( !( UCSRA & (1<
;
/* 将数据放入缓冲器,发送数据 */
UDR = data;
}
// 数据接收【以5到8个数据位的方式接收数据帧】
unsigned char USART_Receive( void )
{
/* 等待接收数据*/
while ( !(UCSRA & (1<
;
/* 从缓冲器中获取并返回数据*/
return UDR;
}
//连续发送字符
void USART_Transmit_2( void )
{
while ( !( UCSRA & (1<
;
UDR = 'H';
while ( !( UCSRA & (1<
;
UDR = 'e';
while ( !( UCSRA & (1<
;
UDR = 'l';
while ( !( UCSRA & (1<
;
UDR = 'l';
while ( !( UCSRA & (1<
;
UDR = 'o';
}
void main(void)
{
unsigned char i="0",tmp=0;
USART_Init(9600); //波特率9600 初始化串口
// uart0_init();
for(i=0;i<20;i++) //发送数组里面的字符串,http://www.avrvi.com
{
USART_Transmit(buffer);
}
USART_Transmit(0x0d); //发送一个回车
USART_Transmit(0x0a); //发送一个换行
while(1)
{
if(UCSRA&(1<如果接收缓存区有数据
{
tmp=USART_Receive(); //接收数据
USART_Transmit(tmp); //发送数据
if(tmp=='a') //对接收到的数据进行,如果是a,再发一个OK回来
{
USART_Transmit('O');
USART_Transmit('K');
}
if(tmp=='A') //对接收到的数据进行,如果是A,再发一个Hello回来
{
USART_Transmit_2();
}
}
}
}
)|(1<)|(1<
用户1196490 2009-2-3 15:01
用户199201 2007-6-17 12:04
用户42895 2007-3-26 21:51
用户386601 2007-3-26 15:11
用户1253546 2007-1-12 18:48
哈哈....看图片上的亮度应该没有达到...
功率可能到了一千五
用户1053025 2006-12-20 16:07
用户42895 2006-12-18 15:54
PS:我正在整理厦门Ateml研讨会的资料,估计最近两三天才能搞定。
用户1053025 2006-12-18 15:33
呵呵,期待这件事情的真相。