|
楼主 |
发表于 2006-2-6 22:28:18
|
显示全部楼层
Uart.c主程序
#include <avr/io.h>
#include <avr/delay.h>
#include "../Common/UartCom/UartCom.h" //Uart串口异步通信处理头文件
int main(void)
{
unsigned char TmpData;
Usart_InitDef(4800);
Usart_PutStr("Hello");
while(1)
{
TmpData=Usart_GetChar();
Usart_PutChar(TmpData);
}
}
/*************** UartCom.h 文件*******************************/
#ifndef _UART_COM_H_
#define _UART_COM_H_
/*****************************
Uart串口异步通信处理头文件
****************************/
//定义8位数据类型 BYTE
#define BYTE unsigned char
//校验位
#define VERIFY_TYPE_NONE 0 //无校验
#define VERIFY_TYPE_EVEN 2 //偶校验
#define VERIFY_TYPE_ODD 3 //奇校验
//数据位个数(推测)
#define DATA_BIT_5 0
#define DATA_BIT_6 1
#define DATA_BIT_7 2
#define DATA_BIT_8 3
#define DATA_BIT_9 4
//停止位
#define STOP_BIT_1 0 //1位停止位
#define STOP_BIT_2 1 //2位停止位
#define Usart_InitDef(iBaudRate) \
Usart_Init(iBaudRate,VERIFY_TYPE_NONE,DATA_BIT_8,STOP_BIT_1)
//初始化Uart(设置:波特率,检验位,数据位,停止位)
void Usart_Init(int iBaudRate,BYTE iVerifyType,
BYTE iDataBitType,
BYTE iStopBitType);
//发送1个字符
void Usart_PutChar(BYTE iData);
//接收1个字符
BYTE Usart_GetChar(void);
//发送一串字符
void Usart_PutStr(char* pStr);
#endif
/*************** UartCom.c 文件*******************************/
#include "UartCom.h"
#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/signal.h>
#include <avr/delay.h>
//USART寄存器介绍*******************
/*
1.USART数据寄存器 UDR
RXB
TXB
*/
/*
2.USART控制和状态寄存器A -- UCSRA
7 - RXC : USART接收完成
6 - TXC : USART发送完成
5 - UDRE : USART数据寄存器空
4 - FE : 接收帧出错
3 - DOR : 接收数据溢出出错
2 - PE : 校验错误
1 - U2X : USART传输速率倍速
0 - MPCM : 多机通信模式允许
*/
/*
3.USART控制和状态寄存器B -- UCSRB
7 - RXCIE : RX 接收完成中断允许
6 - TXCIE : TX 发送完成中断允许
5 - UDRIE : USART数据寄存器空中断允许
4 - RXEN : 数据接收允许
3 - TXEN : 发送数据允许
2 - UCSZ2 : 数据位数大小
1 - RXB8 : 接收数据的第8位
0 - TXB8 : 发送数据的第8位
*/
/*
4.USART控制和状态寄存器C -- UCSRC
7 - URSEL : 寄存器选择
6 - UMSEL : USART工作模式选择
5 - UPM1 : 5..4校验方式
4 - UPM0 : 5..4校验方式
3 - USBS : 停止位选择
2 - UCSZ1 : 2..1创送或接收字符长度
1 - UCSZ0 : 2..1创送或接收字符长度
0 - UCPOL : 时钟极性
*/
/*
5.波特率寄存器 -- UBRRL和 UBRRH
15 - URSEL : 寄存器选择
14,13,12 -- 保留 = 设为0
11....0 USART波特率设置寄存器
*/
/*
//数据位
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位
*/
//USART需要发送的数据是否准备好
#define USART_DATA_IS_READY (UCSRA & (1<<UDRE))
//USART数据接收是否完成
#define USART_DATA_RECV_IS_OK (UCSRA & (1<<RXC))
//初始化Uart(设置:波特率,检验位,数据位,停止位)
void Usart_Init(int iBaudRate,BYTE iVerifyType,
BYTE iDataBitType,BYTE iStopBitType)
{//Uart初始化
//清除状态
UCSRA=0x00;
//处理波特率,此时URSEL = 0;
UBRRL= (F_CPU/iBaudRate/16-1)%256;
UBRRH= (F_CPU/iBaudRate/16-1)/256;
//设置USCRB
UCSRB = _BV(RXCIE)|_BV(TXCIE)|_BV(RXEN)|_BV(TXEN);
//设置校验位
UCSRC&=~_BV(UMSEL);//异步模式
UCSRC&=~_BV(UCPOL);//XCK下降沿
switch(iVerifyType)
{
case VERIFY_TYPE_NONE://无校验
UCSRC &= ~_BV(UPM0);
UCSRC &= ~_BV(UPM1);
break;
case VERIFY_TYPE_EVEN://偶校验
UCSRC &= ~_BV(UPM0);
UCSRC |= _BV(UPM1);
break;
case VERIFY_TYPE_ODD://奇校验
UCSRC |= _BV(UPM0);
UCSRC |= _BV(UPM1);
break;
default:
UCSRC &= ~_BV(UPM0);
UCSRC &= ~_BV(UPM1);
}
/********************************
//该段注释了
//数据位
switch(iDataBitType)
{
case DATA_BIT_5:
UCSRC &= ~_BV(UCSZ0);
UCSRC &= ~_BV(UCSZ1);
break;
case DATA_BIT_6://
UCSRC |= _BV(UCSZ0);
UCSRC &= ~_BV(UCSZ1);
break;
case DATA_BIT_7://
UCSRC &= ~_BV(UCSZ0);
UCSRC |= _BV(UCSZ1);
break;
case DATA_BIT_8://
UCSRC |= _BV(UCSZ0); //UCSZ0位置 1
UCSRC |= _BV(UCSZ1); //UCSZ1位置 1
break;
case DATA_BIT_9://
UCSRC &= ~_BV(UCSZ0);
UCSRC &= ~_BV(UCSZ1);
UCSRB |= _BV(UCSZ2);
break;
default:
UCSRC |= _BV(UCSZ0);
UCSRC |= _BV(UCSZ1);
}
*******************************/
//停止位
if(iStopBitType == STOP_BIT_2)
UCSRC |= _BV(USBS);
else
UCSRC &=~_BV(USBS);
//sei();//总中断允许
_delay_ms(20);
}
//发送1个字符
void Usart_PutChar(BYTE iData)
{
while( !USART_DATA_IS_READY ); //数据如果没有准备好,则等待
UDR=iData;
}
//接收1个字符
BYTE Usart_GetChar(void)
{
BYTE RetData;
while( !USART_DATA_RECV_IS_OK );
RetData = UDR;
return RetData;
}
//发送一串字符
void Usart_PutStr(char* pStr)
{
while(*pStr)
{
Usart_PutChar(*pStr);
pStr++;
}
} |
|