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

📄 uartapp.c

📁 我做的用lpc2119实现的变电站隔刀动作电流波形采样计算数据上传程序
💻 C
📖 第 1 页 / 共 2 页
字号:
/****************************************Copyright (c)**************************************************
**                               河南恩湃电力技术有限公司
**                                     测 控 部
**                                        
**
**
**--------------文件信息--------------------------------------------------------------------------------
**文   件   名: UARTAPP.C
**创   建   人: 
**最后修改日期: 
**描        述: 定义LPC21xx\LPC22xx中UART应用层函数
**
**--------------历史版本信息----------------------------------------------------------------------------
** 创建人: 
** 版  本: 
** 日 期: 
** 描 述: 
**

**--------------当前版本修订------------------------------------------------------------------------------
** 修改人: 
** 日 期:
** 描 述:
**
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
#define		_UART0APP_GLOBAL_

//文件引用
#include "config.h"

//#define	Fpclk  11059200
/*********************************************************************************************************
**--------------技巧说明------------------------------------------------------------------------------
** 在文件中定义了用于UART0实际应用层操作的函数
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
/*
************************************************************************************************************************
**函数原型	:  	void		Delay(UINT32 i)
**参数说明	:  	i;软件Delay
**返回	值	:	无
**说	明	:	本函数用于简单的延时
*****
*******************************************************************************************************************
*/

UINT8 rcv_bufa[20];       	// UART0数据接收缓冲区
uint8 rcv_count;
UINT8 rcv_new;   			// 接收新数据标志
uint8 uart1test;
uint8 uartstep;
extern uint8 Locoal_Addr;
extern void printstr(char *codec,uint8 com);
extern void two_send(uint8 tt,uint8 com);

/****************************************************************************
* 名称:SendByte()
* 功能:向串口UART0发送字节数据。
* 入口参数:data                要发送的数据
* 出口参数:无
****************************************************************************/
void  SendByte(UINT8 data)
{ 
	IO1CLR = LED3;
	 U0THR = data;                      	// 发送数据
		while(0 == (U0LSR &0x40));
	IO1SET = LED3;
}

/****************************************************************************
* 名称:Uart1SendByte()
* 功能:向串口UART1发送字节数据。
* 入口参数:data                要发送的数据
* 出口参数:无
****************************************************************************/
void  Uart1SendByte(UINT8 data)

{  
	IO1CLR = LED3;
	U1THR = data;                      	// 发送数据
		while(0 == (U1LSR &0x40));
	IO1SET = LED3;
}

/****************************************************************************
* 名称:ISendBuf()
* 功能:将缓冲区的数据发送回主机(使用FIFO),并等待发送完毕。
* 入口参数:无
* 出口参数:无
****************************************************************************/
void  ISendBuf(void)
{  UINT8  i;
  
   for(i=0; i<8; i++) SendByte(rcv_buf[i]);
   while( (U1LSR&0x20)==0 );         	// 等待数据发送
}               
                 
        
/****************************************************************************
* 名称:UART0_Ini()
* 功能:初始化串口0。设置其工作模式及波特率。
* 入口参数:baud                波特率
*          set          模式设置(UARTMODE数据结构)
* 出口参数:返回值为1时表示初始化成功,为0表示参数出错
****************************************************************************/
UINT8  UART0_Ini(UINT32 baud, UARTMODE set)
{  UINT32  bak;
   
   /* 参数过滤 */
   if( (0==baud)||(baud>115200) ) return(0);
   if( (set.datab<5)||(set.datab>8) ) return(0);
   if( (0==set.stopb)||(set.stopb>2) ) return(0);
   if( set.parity>4 ) return(0);

   /* 设置串口波特率 */
   U0LCR = 0x80;                        // DLAB位置1
   bak = (Fpclk>>4)/baud;
   U0DLM = bak>>8;
   U0DLL = bak&0xff;
   
   /* 设置串口模式 */
   bak = set.datab-5;                   // 设置字长度
   if(2==set.stopb) bak |= 0x04;        // 判断是否为2位停止位  
   
   if(0!=set.parity) {set.parity = set.parity-1; bak |= 0x08;}
   bak |= set.parity<<4;              	// 设置奇偶校验
      
   U0LCR = bak;
   
   return(1);
}

/***************************************************************************
* 名称:UART0_Ini()
* 功能:初始化串口0。设置其工作模式及波特率。

***************************************************************************/

void  UART1_Ini(UINT32 baud)
{  UINT16 Fdiv;

   U1LCR = 0x83;		            // DLAB = 1,可设置波特率
   Fdiv = (Fpclk / 16) / baud;  // 设置波特率
   U1DLM = Fdiv / 256;							
   U1DLL = Fdiv % 256;						
   U1LCR = 0x03;
}  

/***************************************************************************
* 名称:UART1sentbyte
* 功能:发送一字节数据

***************************************************************************/

void  UART1_SendByte(UINT8 data)
{  U1THR = data;				    // 发送数据

   while( (U1LSR&0x40)==0 );	    // 等待数据发送完毕
}      

/****************************************************************************
* 名称:HC595_SendDat()
* 功能:向74HC595发送一字节数据
* 入口参数:dat		要发送的数据
* 出口参数:无
* 说明:发送数据时,高位先发送。
****************************************************************************/
/*void  HC595_SendDat(UINT8 dat)
{  UINT8  i;

   IO0CLR = SPI_CS;			    		// SPI_CS = 0
   for(i=0; i<8; i++)					// 发送8位数据
   {  IO0CLR = SPI_CLK;					// SPI_CLK = 0*/
      /* 设置SPI_DATA输出值 */
   /*   if( (dat&0x80)!=0 ) IO0SET = SPI_DATA;
        else IO0CLR = SPI_DATA;
      dat <<= 1;
      IO0SET = SPI_CLK;					// SPI_CLK = 1
   }
   
   IO0SET = SPI_CS;			    		// SPI_CS = 1,输出显示数据
}*/
                        

/* 数码管显示字模表(0-F) */


/****************************************************************************
* 名称:IRQ_UART0()
* 功能:串口UART0接收中断。
* 入口参数:无
* 出口参数:无
****************************************************************************/
/*
void   __irq IRQ_UART0(void)
{  //uint8  i;
     
	if( 0x04==(U0IIR&0x0F) ) 
	{
		IO1CLR = LED3;
		rcv_bufa[rcv_count] = U0RBR;
		if(uart1test==0xdd)
			Uart1SendByte(rcv_bufa[rcv_count]);
		if(rcv_count < 20)
			rcv_count++;
		else
			rcv_count=0;
		rcv_new = 1;// 设置接收到新的数据标志
		IO1SET = LED3;
	}


   VICVectAddr = 0x00;              	// 中断处理结束
}  
*/
void   __irq IRQ_UART0(void)
{  
	uint8  i;
     
	if( 0x04==(U0IIR&0x0F) ) 
	{
		IO1CLR = LED3;
		
		i = U0RBR;
		//two_send(i,2);
		//Uart1SendByte(',');
		
		switch(uartstep)
		{
			case 0:	if(i==0xfb)
					{
						uartstep=1;
						//rcv_count=0;
					}
					
					rcv_count=0;
					break;
			case 1:	if(i==0x91)
					{
						uartstep=2;
					}
					else
					{
						uartstep=0;
					}
					rcv_count=0;
					break;
			case 2:	if(i==0xfb)
					{
						uartstep=3;
					}
					else
					{
						uartstep=0;
					}
					break;
			case 3:	if(i==0x91)
					{
						uartstep=4;
					}
					else
					{
						uartstep=0;
					}
					break;
			case 4:	if(i==0xfb)
					{
						uartstep=5;
					}
					else
					{
						uartstep=0;
					}
					break;
			case 5:	if(i==0x91)
					{
						uartstep=6;
						
					}
					else
					{
						uartstep=0;
					}
					rcv_count=0;
					break;
			case 6:	rcv_bufa[rcv_count] = i;
					rcv_count++;
					//two_send(rcv_count,2);
					//Uart1SendByte(',');
					if(rcv_count>=10)
					{
						if(rcv_bufa[1]==Locoal_Addr)
						{
							rcv_new = 1;// 设置接收到新的数据标志
							rcv_count=0;
							uartstep=0;
						}
						else
						{
							rcv_count=0;
							uartstep=0;
						}
					}
					break;
			default:
					rcv_count=0;
					uartstep=0;
					break;
		}
		
		if(uart1test==0xdd)
			Uart1SendByte(rcv_bufa[rcv_count]);
		
		
		IO1SET = LED3;
	}


   VICVectAddr = 0x00;              	// 中断处理结束
}  

uint8 uart1count=0;
uint8 uart1buf[10];
void   __irq IRQ_UART1(void)
{  
	//UINT8  i;
    if( 0x04==(U1IIR&0x0F) )
   	{	
   		IO1CLR = LED3;
   		uart1buf[uart1count]=U1RBR;
   		if(uart1buf[uart1count]==0x0d)
   		{

⌨️ 快捷键说明

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