|
USART与PC通信例子 下面是一个利用ATmega88的串口USART0向PC单向发送数据的例子,PC的上位机程序可以用BASCOM-AVR自带的超级终端功能,也可以用windows自带的超级终端(推荐)。windows的超级终端默认的波特率是9600,8个数据位,无奇偶校验,1个停止位。本例子就以这个数据作为参考,注意ATmega88芯片的时钟不同,那么它产生的波特率误差也有所不同,在8M下波特率为9600时的误差为0.2%(这个误差可以说很小了)。在编写程序时请注意要和这些数据一一对应。 否则就有通信失败的可能。 BASCOM-AVR的源程序如下: $regfile = "m88def.dat" $crystal = 8000000 $baud = 9600 Dim X As Byte X = 0 Do Print "ATmega88与PC串口通信试验" Print X X = X + 1 Waitms 500 Loop End CVAVR的源程序如下: #include <mega88.h> #include <delay.h> flash unsigned char data[]="ATmega88与PC串口通信试验"; void main(void) { //USART0初始化,波特率9600Hz,8个数据位,1个停止位,无奇偶校验,无中断使能 UCSR0A=0x00; UCSR0B=0x08; UCSR0C=0x06; UBRR0H=0x00; UBRR0L=0x33;
while (1) { unsigned char i,x,bytes[7];//局部变量,请注意初值的变化 for(i=0;i<24;i++) //发送"ATmega88与PC串口通信试验" { UDR0=data[i]; //缓冲器UDR0一旦被成功赋值,这个数据就自动的由串口发送出去 while(UCSR0A^=0b00100000); //位5是忙的标致,=1就循环等待,=0就下一步 }; bytes[0]=13; //13就是回车键的ASC2值 bytes[1]=10; //10就是换行 bytes[2]=x/100+48; //求变量x的"百位数"字符 bytes[3]=x/10%10+48; //求变量x的"十位数"字符 bytes[4]=x%10+48; //求变量x的"个位数"字符 bytes[5]=13; bytes[6]=10; for(i=0;i<7;i++)//发送回车/换行/变量x { UDR0=bytes[i]; while(UCSR0A^=0b00100000); }; x++; delay_ms(1000); }; } 通过上面的例子可以看出,利用USART串口可是十分方便的,比操作1602LCD简单方便多了,它还可以随心所欲的输出各种文字字符等,如果是AVR单方面输出数据的话只要用一个TXD端口就可以了,RXD可以作为普通IO口使用。一般的双向通讯用TXD、RXD两个端口 就基本满足要求了。所以请大家在以后的学习试验中如果可以的话就尽量的利用USART串口、PC为作输出显示功能吧。 
AVR串口USART与PC的串口通信必须通过RS232电平转换,常用的转换IC有MAX232等,因为电脑串口输出的信号电平是标准的RS232电平信号,信号电压是±5~15V,而且RS232协议的“1”电平是 -5~15V,“0”电平是 +5~15V,所以没有电平转换电路的话AVR与PC是很难直接通信的。 下面是MAX232标准的电路图,图中的5个电容建议全部用1uF的独石电容。

|