⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 uart.c.bak.bak.bak

📁 AVR16源代码 ICC编译器
💻 BAK
字号:
#include	<iom128v.h>
#include	"Uart.h"
#include	"Crc.h"

//============================================================
//计算和设置128的波特率参数	chenzuan 2006-03-16
#define   BAUD 		19200
#define   CRYSTAL 	7372800
#define   BAUD_SETTING 	(unsigned char)((unsigned long)CRYSTAL/(16*(unsigned long)BAUD)-1)
#define   BAUD_H 	(unsigned char)(BAUD_SETTING>>8)
#define   BAUD_L 	(unsigned char)BAUD_SETTING

//============================================================
//函	数:void Init_Com(void)
//功	能:初始化串口设置
//入口参数:无 
//返 回 值:无  
//设 计 者:陈祖安 
//创作时间:2006-03-16
//修改时间:
//修改目的:
//============================================================
void Init_Com(void)
{
	UBRR0H = BAUD_H;
	UBRR0L = BAUD_L;
	UCSR0B = 0x18;
	UCSR0C = 0x0E;
	OCR0  = 0xEA;
	TCCR0 = 0x0F;
}
		   		 
//============================================================
//函	数:void Uart_PutChar(unsigned char Data)
//功	能:发送一个字符
//入口参数:发送的字符数据  
//返 回 值:无 
//设 计 者:陈祖安 
//创作时间:2006-03-16
//修改时间:
//修改目的:
//============================================================
void Uart_PutChar(unsigned char Data)
{
  	while(!(UCSR0A & 0x20));
  	UDR0 = Data; 
}

//============================================================
//函	数:int Uart_GetChar(void)
//功	能:接收一个字符
//入口参数:无  
//返 回 值:返回-1接受数据错误,否则为接收到的一个字符数据 
//设 计 者:陈祖安 
//创作时间:2006-03-16
//修改时间:
//修改目的:
//============================================================
int Uart_GetChar(void)
{
	unsigned char 	status,res;
	
  	if(!(UCSR0A&0x80))
  		return -1;
  	status = UCSR0A;
  	res = UDR0;
  	if(status & 0x1c) 
  		return -1;
  	else
  		return res;
} 

//============================================================
//函	数:void Uart_Send_Frame(unsigned char *Frame, int Len)
//功	能:发送一个字符串
//入口参数:*Frame发送一个字符串数据,Len发送的长度  
//返 回 值:无
//设 计 者:陈祖安 
//创作时间:2006-03-16
//修改时间:
//修改目的:
//============================================================
void Uart_Send_Frame(unsigned char *Frame, int Len)
{
	while(Len > 0)
	{
	 	Uart_PutChar(*Frame);
	 	Frame ++;
	 	Len --;
	}
}

//============================================================
//函	数:unsigned char Uart_Receive_Frame(unsigned char *Frame,
//					     int OverTime)
//功	能:接收一个字符串
//入口参数:*Frame接收一个字符串数据存放地址,OverTime超时时间  
//返 回 值:无
//设 计 者:陈祖安 
//创作时间:2006-03-16
//修改时间:
//修改目的:
//============================================================
unsigned char Uart_Receive_Frame(unsigned char *Frame,int OverTime)
{
	int 	ByteData;
	int	TimerCount = 0;
	int	ReceiveLen = 0;
	int	Len = 255;
  
	while(ReceiveLen < Len)
	{	
  		while((ByteData = Uart_GetChar()) == -1)
       		{
       			if(TIFR& 0x02)
          		{
          			if(++TimerCount > OverTime) 
	       				return 0;//等待超时如果还没接收到数据,则返回数据长度0
	       			TIFR=TIFR|0x02;
	      		}	 
		}  
  		Frame[ReceiveLen] = (unsigned char)ByteData;
  		if(ReceiveLen == 0x04)
  			Len = Frame[ReceiveLen] + 0x02;
  		ReceiveLen ++; 
  		TimerCount = 0;
 	}
	return ReceiveLen;
}

//============================================================
//函	数:void PC_Send_Err(unsigned char Ret,unsigned char *SendBuf)
//功	能:向PC返回执行结果
//入口参数:结果代码,发送缓冲区
//返 回 值:无
//设 计 者:陈祖安 
//创作时间:2006-03-16
//修改时间:
//修改目的:
//============================================================
void PC_Send_Err(unsigned char Err_Ret,unsigned char *SendBuf)
{
	unsigned short 	Crc_Data;
	
	SendBuf[0] = 0x45;
 	SendBuf[1] = 0x52;
 	SendBuf[2] = 0x00;
 	SendBuf[3] = 0x05;
 	SendBuf[4] = Err_Ret;	       
 	Crc_Data = CRC16(SendBuf,5);
 	SendBuf[5] = Crc_Data / 0x100;
 	SendBuf[6] = (unsigned char)Crc_Data;	
 	Uart_Send_Frame(SendBuf, 7);
}

//============================================================
//函	数:void PC_Send_Ok(unsigned char *Ok_Frame,unsigned char Ok_Coad,
//				unsigned char *SendBuf,int Len)
//功	能:向PC返回执行结果
//入口参数:发送数据,结果代码,发送缓冲区,发送数据长度
//返 回 值:无
//设 计 者:陈祖安 
//创作时间:2006-03-16
//修改时间:
//修改目的:
//============================================================
void PC_Send_Ok(unsigned char *Ok_Frame,unsigned char Ok_Coad,unsigned char *SendBuf,int Len)
{
	int		i;
	unsigned short 	Crc_Data;
	
	SendBuf[0] = 0x4F;
 	SendBuf[1] = 0x4B;
 	SendBuf[2] = 0x00;			//包序号
 	SendBuf[3] = 0x04 + Len;       		//数据长度
 	if(Len == 1)
 		SendBuf[4] = Ok_Coad;
 	else if(Len > 1)
 	{
 		for(i = 0;i < Len;i ++)
 			SendBuf[4+i] = Ok_Frame[i];
 	}
 	else
 		SendBuf[4] = 0;
  	Crc_Data = CRC16(SendBuf,4+Len);
 	SendBuf[Len+4] = Crc_Data / 0x100;
 	SendBuf[Len+5] = (unsigned char)Crc_Data;	
 	Uart_Send_Frame(SendBuf, Len+6);
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -