/*******************************************
文件:UART.C
环境:编译为ICC AVR6.25A,仿真为AVR Studio4.10
硬件:ATMEGA16芯片
日期:2006年12月10日
功能:实现MEGA16的异步串口与PC机通信
备注:参考《AVR系列单片机C语言编程与应用实例》(清华大学出版社)
/******************************************/
#include <iom16v.h> //包含型号头文件
#include <macros.h> //包含"位"操作头文件
#include <stdio.h> //标准输入输出头文件
#include <AVR_PQ1A.h> //包含自定义常量头文件
#pragma interrupt_handler Uart_RX:12 //串口接收中断函数声明
uchar RFLAG,NUM,RDATA[20];
/*******************************************
函数名称: Uart_init
功 能: 异步串口初始化
参 数: baud--设置的波特率
返回值 : 无
/********************************************/
void Uart_init(uint baud)
{
baud=MCLK/16/baud-1; //波特率最大为65K
UCSRB=0x00;
UCSRA=0x00; //控制寄存器清零
UCSRC=(1<<URSEL)|(0<<UPM0)|(3<<UCSZ0); //选择UCSRC,异步模式,禁止校验,1位停止位,8位数据位
UBRRL=baud;
UBRRH=baud>>8; //设置波特率
UCSRB=(1<<TXEN)|(1<<RXEN)|(1<<RXCIE); //接收、发送使能,接收中断使能
SREG=(1<<7); //全局中断开放
DDRD|=0X02; //配置TX为输出(很重要)
}
/*******************************************
函数名称: Uart_sendB
功 能: 异步串口发送一个字节
参 数: sendB--发送的字节数据
返回值 : 无
/********************************************/
void Uart_sendB(uchar sendB)
{
while(!(UCSRA&(1<<UDRE))); //等待发送缓冲区为空
UDR=sendB; //发送数据
while(!(UCSRA&(1<<TXC))); //等待发送完毕
UCSRA|=1<<TXC; //清除发送完毕状态位
}
/*******************************************
函数名称: Uart_sentstr
功 能: 异步串口发送一个字符串
参 数: sendpt--发送的数组指针
返回值 : 无
/********************************************/
void Uart_sentstr(uchar *sendpt)
{
while(*sendpt) //字符串未结束则继续发送
{
Uart_sendB(*sendpt++);
}
}
/*******************************************
函数名称: Uart_RX
功 能: 异步串口接收
参 数: 无
返回值 : 无
/********************************************/
void Uart_RX(void)
{
UCSRB&=~BIT(RXCIE); //关闭接收中断
RDATA[NUM++]=UDR; //将接收到的数据存入全局数组
RFLAG=TRUE; //接收到新数据标志置位
UCSRB|=BIT(RXCIE); //使能接收中断
}
/*******************************************
函数名称: main
功 能: 完成异步串口接收数据,并返回给PC机(用串口调试助手)
参 数: 无
返回值 : 无
/********************************************/
void main(void)
{
uchar i;
Board_init( ); //初始化开发板
Uart_init(19200); //初始化串口,设置波特率
while(1)
{
Delayms(10); //延时,等待串口将数据全部接收完毕
if(RFLAG) //如果接收到新的数据
{
Uart_sentstr("\r\n你发送的字符串是:");//发送字符串
Uart_sentstr(RDATA); //发送接收到的数据
for(i=0;i<10;i++) //清空全局数组
{
RDATA[i]='\0';
}
RFLAG=FALSE; //清收到新数据标志位
NUM=0; //数组下标变量归零
}
}
}
评论0