/*******************************************
文件:UART.C
环境:编译为ICC AVR6.31A,仿真为AVR Studio4.10
硬件:ATMEGA16芯片
日期:2008年8月8日
功能:实现MEGA16的异步串口与PC机通信
备注:参考《AVR系列单片机C语言编程与应用实例》(清华大学出版社)
/******************************************/
#include "iom16v.h"
#include "macros.h"
#include <AVR_HJ-2G.h> //包含自定义常量头文件
//波特率,晶振
#define BAUD 9600
#define FXTAL 12000000
//串口接收完毕中断触发声明
#pragma interrupt_handler USART_Received_Ir:12
//变量定义:接收缓冲变量,接收标志位
unsigned char RX_Buffer=0x00,RX_Flag=0;
//函数声明
void USART_Send(unsigned char);
//串口IO初始化函数
void USART_IO_Init()
{
DDRD|=BIT(PD1); //PD1:TX为输出状态
}
//串口初始化函数
void USART_Init()
{
unsigned int Temp;
USART_IO_Init(); //串口IO初始化函数调用
UCSRA=0x00; //串口控制器A清零
UCSRB=0x00; //串口控制器B清零
UCSRC|=BIT(URSEL)|BIT(UCSZ1)|BIT(UCSZ0); //选择USCRC,异步操作,禁止检验危,1个停止位,八位数据
Temp=(FXTAL/BAUD/16)-1; //求出9600波特率的赋值
UBRRH=((Temp>>8)&0x00ff); //波特率寄存器高八位赋值
UBRRL=(Temp&0x00ff); //波特率寄存器低八位赋值
//UBRR=71; //从手册中直接取得赋值,9600kbps
UCSRB|=BIT(TXEN)|BIT(RXEN)|BIT(RXCIE); //发送使能,接收使能,接收完毕中断使能
SREG|=BIT(7); //全局中断使能
}
//主函数
void main()
{
USART_Init();
while(1)
{
if(RX_Flag)
{
RX_Flag=0;
USART_Send(RX_Buffer);
}
}
}
//串口发送函数
void USART_Send(unsigned char Data)
{
while(!(UCSRA&(BIT(UDRE)))); //数据寄存器UDR是否为空?
UDR=Data; //UDR赋值
while(!(UCSRA&(BIT(TXC)))); //数据是否已经发送完毕?
UCSRA|=BIT(TXC); //清除发送完毕标志位
}
//串口接收完毕中断函数
void USART_Received_Ir()
{
UCSRB&=~BIT(RXCIE); //接收完毕中断不使能
RX_Buffer=UDR; //读取UDR的数据
RX_Flag=1; //接收标志位置一
UCSRB|=BIT(RXCIE); //接收完毕中断使能
}