基于AVR单片机--Atmega16的串口通信使用
//以下程序经验正可以用,MCU:M16,晶振:8M,直接用USB转串口线上的公头(针头),
//第2针(RXD)接M16上的PD1口(15脚TXD),第3针(TXD)接M16上的PD0口(14脚RXD),
//第5针接地,此时若板上有MAX232,则需把MAX232芯片去掉,这样才能正常工作
#include<avr/io.h>
#include<avr/interrupt.h>
#define uchar unsigned char
#define uint unsigned int
#define fosc 8000000//晶振频率
#define BAUD 9600 //波特率
void USART_send(uchar date)//发送一个字节
{
while(!(UCSRA&(1<<UDRE)));//等待USART数据寄存器为空,UDRE为1说明缓冲器为空,已准备好进行数据接收或发送
UDR=date;//发送数据
}
void init()
{
DDRB=0xff;//设置PB口为输出
PORTB&=~(_BV(PB4)|_BV(PB5)|_BV(PB6)|_BV(PB7));//让高4位的LED灭
//波特率寄存器设置
UBRRH=(fosc/BAUD/16-1)/256;
UBRRL=(fosc/BAUD/16-1)%256;
//UCSRB|=_BV(RXEN)|_BV(TXEN)|_BV(RXCIE);
UCSRB|=(1<<RXEN)|(1<<TXEN)|(1<<RXCIE);//使能发送,接收,接收完成中断
sei();//开全局中断
}
int main()
{
init();
USART_send('d');//发送数据'd'
while(1);
}
volatile char date1;
SIGNAL(SIG_UART_RECV)
{
date1=UDR;//接收数据
PORTB=date1;
}。