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

📄 uart.c

📁 ucos系统
💻 C
字号:
/************************************************************************************
*  Copyright (c) 2004,西安铭朗电子科技有限责任公司
*            All rights reserved.
*
* 文件名称: uart.c
* 文件标识: none
* 适用器件: c8051f020
* 
* 摘 要: 本文件是uart0,uart1硬件驱动程序;
* 
* 当前版本:1.0
* 作 者:李林利
* 完成日期:2004年11月14日
*
* 历史版本:0.9 
* 原作者 : 李林利
* 完成日期:2004年1月1日
*************************************************************************************/

/************************************************************************************/
// 引用外部头文件
#include  "..\config\common.h"
#include  "uart.h"
/************************************************************************************/


/************************************************************************************
// 常量及全局变量定义
*************************************************************************************/



/************************************************************************************
*  Uart0 功能子程序
*************************************************************************************/

/***********************************************************************************
* 函数名称:uart0_init;
*
* 函数功能描述:uart0 初始化函数,使用定时器1作为时钟,关闭了发送和接收中断;
*              
* 输入参数:BaudRate: byte, 波特率变量,可选择以下波特率:
*          		BaudRate_1200,BaudRate_2400,BaudRate_4800,BaudRate_4800,BaudRate_9600;
* 				BaudRate_19200,BaudRate_38400,BaudRate_57600,BaudRate_115200;
*
* 返回数据:none;
*
* 注意: 定时器1资源被占用,SYSCLK = 22.1184Mhz;
************************************************************************************/
void uart0_init(INT32U BaudRate)            // Init Uart0        
{                                    
     TR1=0;         					 // Close Timer1
	 ET1=0;        					     // Disable Timer1 interrupt 
	 PT1=0;         					 // Disable Timer1 interrupt Priority
	 TMOD&= 0x0f;                        // TMOD: timer 1, mode 2, 8-bit reload 
	 TMOD|= 0x20;                        // TMOD: timer 1, mode 2, 8-bit reload 

     SCON   = 0x50;                     // SCON0: mode 1, 8-bit UART, enable RX
     PCON  |= 0x80;                      // SMOD00 = 1
	 
	 
	if (BaudRate>=9600)
	{
	 	CKCON |= 0x10;                                // Timer1 uses SYSCLK as time base
	 	TH1    = -(SYSCLK/(BaudRate*16));        // set Timer1 reload value for baudrate
	}
	else
	{
		CKCON &= ~0x10;                               // Timer1 uses SYSCLK as time base
	 	TH1    = -(SYSCLK/(BaudRate*16*12));     // set Timer1 reload value for baudrate
	}

	ES=0;             				 // Disable Uart0 Interrupt 
	PS0=0;             				 // Disable Uart0 Interrupt Priority 

	TI  = 1;                        // Indicate TX0 ready
    RI  = 0;                        // Indicate RX0 ready 

    TR1=1;
 }


/***********************************************************************************
* 函数名称:Uart0_ChangeBaudRate;
*
* 函数功能描述:重新设置uart0波特率;
*              
* 输入参数:BaudRate: byte, 波特率变量,可选择以下波特率:
*          		BaudRate_1200,BaudRate_2400,BaudRate_4800,BaudRate_4800,BaudRate_9600;
* 				BaudRate_19200,BaudRate_38400,BaudRate_57600,BaudRate_115200;
*
* 返回数据:none;
*
* 注意: 定时器1资源被占用,SYSCLK = 22.1184Mhz;
************************************************************************************/
void Uart0_ChangeBaudRate(INT32U BaudRate)
{
	
	TR1=0;         									  // Close Timer1

	if (BaudRate>=9600)
	{
	 	CKCON |= 0x10;                                // Timer1 uses SYSCLK as time base
	 	TH1    = -(SYSCLK/(BaudRate*16));        // set Timer1 reload value for baudrate
	}
	else
	{
		CKCON &= ~0x10;                               // Timer1 uses SYSCLK as time base
	 	TH1    = -(SYSCLK/(BaudRate*16*12));     // set Timer1 reload value for baudrate
	}
     
    TR1=1;
}

/***********************************************************************************
* 函数名称:Uart0_Enable;
*
* 函数功能描述:uart0使能函数,打开或关闭uart0;
*              
* 输入参数:Flag: bool, uart0使能变量; 
*			Flag: true,打开uart0;  Flag: false,关闭uart0;
*
* 返回数据:none;
*
* 注意: none;
************************************************************************************/
void Uart0_Enable(bool Flag)
{
	if (Flag)
		TR1=1;   			// Open Uart0
	else
        TR1=0;   			// Close Uart0
}


/***********************************************************************************
* 函数名称:Uart0_ISR_Enable;
*
* 函数功能描述:uart0中断使能函数;
*              
* 输入参数:Flag: bool, uart0中断使能变量; 
*			Flag: true,允许uart0中断;  Flag: false,关闭uart0中断;
*
* 返回数据:none;
*
* 注意: none;
************************************************************************************/
void Uart0_ISR_Enable(bool Flag)
{

	if (Flag)
		ES=1;    			// Enable Uart0 Interrupt 
	else
        ES=0;  			// Disable Uart0 Interrupt 	
		
}


/***********************************************************************************
* 函数名称:Uart0_ISR;
*
* 函数功能描述:uart0中断函数;
*              
* 输入参数:none;
*
* 返回数据:none;
*
* 注意: 在中断程序内处理尽可能少的事情;
************************************************************************************/
void Uart0_ISR(void) interrupt 4
{
	   
}


/***********************************************************************************
* 函数名称:Uart0_SendByte;
*
* 函数功能描述:通过uart0发送一个字节数据;
*              
* 输入参数:value:unsigned char, 要发送的数据变量;
*
* 返回数据:none;
*
* 注意: 发送完数据要清除中断标志;
************************************************************************************/
void Uart0_SendByte(unsigned char value)
{
	while(!TI);                     // Wait send 1 byte data finish
    SBUF=value;                     // Send the data to uart0
	TI=0;  						 // Clear interrupt flag
}

/***********************************************************************************
* 函数名称:Uart0_SendString;
*
* 函数功能描述:通过uart0发送一个字符串数据;
*              
* 输入参数:pt: unsigned char xdata *, 要发送的字符串数据变量的指针;
*
* 返回数据:none;
*
* 注意: 字符串数据要以零为结束符;
************************************************************************************/
void Uart0_SendString(unsigned char code *pt)
{
    while(*pt)
	Uart0_SendByte(*pt++);
}


/***********************************************************************************
* 函数名称:Uart0_ReceiveData;
*
* 函数功能描述:通过uart0接收一个字节数据;
*              
* 输入参数:none;
*
* 返回数据:SBUF0: unsigned char, 一个字节;
*
* 注意: 接收完数据要清除中断标志;
************************************************************************************/
unsigned char Uart0_ReceiveData(void)
{
	while(!RI);   		// Wait receive data finished
	RI=0;     			// Clear RI0 Flag

	return SBUF;
}





/************************************************************************************
*  Uart1 功能子程序
*************************************************************************************/

/***********************************************************************************
* 函数名称:uart1_init;
*
* 函数功能描述:uart1 初始化函数,使用定时器4作为时钟,关闭了发送和接收中断;
*              
* 输入参数:BaudRate: byte, 波特率变量,可选择以下波特率:
*          		BaudRate_1200,BaudRate_2400,BaudRate_4800,BaudRate_4800,BaudRate_9600;
* 				BaudRate_19200,BaudRate_38400,BaudRate_57600,BaudRate_115200;
*
* 返回数据:none;
*
* 注意: 定时器4资源被占用,SYSCLK = 22.1184Mhz;
************************************************************************************/
void Uart1_Init(INT32U BaudRate)                           // Init Uart0                        
        
{   
	 T4CON&=~0x04;       		// Close Timer4
	 EIE2&=~0x04;         		// Disable Timer4 interrupt 
	 EIP2&=~0x04;         		// Disable Timer4 interrupt Priority
	 
	 T4CON=0x30; 				// Mode 2: TX,RX Raut Rate Mode
	 
	 PCON|=0x10;           		// Power Control Registe, SMOD=1,BaudRate  	
	 SCON1=0x52;				// SCON0: mode 1, 8-bit UART, enable RX, TI1=1,RI1=0
	
	 CKCON |= 0x40;             // Uart1 uses SYSCLK/2 as time base
	 
	 RCAP4H =(65536-(SYSCLK/(BaudRate*32)))/256;
	 RCAP4L =(65536-(SYSCLK/(BaudRate*32)))%256;     // set Timer4 reload value for baudrate, Uart1_CLK=SYSCLK/2
	
	

	EIE2&=~0x40;          	// Disable Uart1 Interrupt 
	EIP2&=~0x40;         	// Disable Uart1 Interrupt Priority 
	
    T4CON|=0x04;         	// Enable Uart1

}



/***********************************************************************************
* 函数名称:Uart1_ChangeBaudRate;
*
* 函数功能描述:重新设置uart1波特率;
*              
* 输入参数:BaudRate: byte, 波特率变量,可选择以下波特率:
*          		BaudRate_1200,BaudRate_2400,BaudRate_4800,BaudRate_4800,BaudRate_9600;
* 				BaudRate_19200,BaudRate_38400,BaudRate_57600,BaudRate_115200;
*
* 返回数据:none;
*
* 注意: 定时器4资源被占用,SYSCLK = 22.1184Mhz;
************************************************************************************/
void Uart1_ChangeBaudRate(INT32U BaudRate)
{
	
	T4CON&=~0x04;       								// Close Timer4
	RCAP4H =(65536-(SYSCLK/(BaudRate*32)))/256;
	RCAP4L =(65536-(SYSCLK/(BaudRate*32)))%256;    // set Timer4 reload value for baudrate, Uart1_CLK=SYSCLK/2
	

    T4CON|=0x04;         								// Enable Uart1
}

/***********************************************************************************
* 函数名称:Uart1_Enable;
*
* 函数功能描述:uart1使能函数,打开或关闭uart0;
*              
* 输入参数:Flag: bool, uart1使能变量; 
*			Flag: true,打开uart1;  Flag: false,关闭uart1;
*
* 返回数据:none;
*
* 注意: none;
************************************************************************************/
void Uart1_Enable(bool Flag)
{
	if (Flag)
		T4CON|=0x04;     // Enable Uart1
	else
        T4CON&=~0x04;    // Disable Uart1
}

/***********************************************************************************
* 函数名称:Uart1_ISR_Enable;
*
* 函数功能描述:uart1中断使能函数;
*              
* 输入参数:Flag: bool, uart1中断使能变量; 
*			Flag: true,允许uart1中断;  Flag: false,关闭uart1中断;
*
* 返回数据:none;
*
* 注意: none;
************************************************************************************/
void Uart1_ISR_Enable(bool Flag)
{

	if (Flag)
		EIE2|=0x40;    // Enable Uart1 Interrupt 
	else
        EIE2&=~0x40;   // Disable Uart1 Interrupt 

}


/***********************************************************************************
* 函数名称:Uart1_ISR;
*
* 函数功能描述:uart1中断函数;
*              
* 输入参数:none;
*
* 返回数据:none;
*
* 注意: 在中断程序内处理尽可能少的事情;
************************************************************************************/
void Uart1_ISR(void) interrupt 20
{

}



/***********************************************************************************
* 函数名称:Uart1_SendByte;
*
* 函数功能描述:通过uart1发送一个字节数据;
*              
* 输入参数:value:unsigned char, 要发送的数据变量;
*
* 返回数据:none;
*
* 注意: 发送完数据要清除中断标志;
************************************************************************************/
void Uart1_SendByte(unsigned char value)
{
	 while(!(TI1));				// Wait send data finished
	 SBUF1=value;  				// Send the data to uart1
     SCON1&=~0x02;              // Clear interrupt flag
}

/***********************************************************************************
* 函数名称:Uart1_SendString;
*
* 函数功能描述:通过uart1发送一个字符串数据;
*              
* 输入参数:pt: unsigned char xdata *, 要发送的字符串数据变量的指针;
*
* 返回数据:none;
*
* 注意: 字符串数据要以零为结束符;
************************************************************************************/
void Uart1_SendString(unsigned char *pt)
{
	while(*pt)
		Uart1_SendByte(*pt++);
}


/***********************************************************************************
* 函数名称:Uart1_ReceiveData;
*
* 函数功能描述:通过uart1接收一个字节数据;
*              
* 输入参数:none;
*
* 返回数据:SBUF1: unsigned char, 一个字节;
*
* 注意: 接收完数据要清除中断标志;
************************************************************************************/
unsigned char Uart1_ReceiveData(void)
{
	while(!(RI1));   	// Wait receive data finished
	SCON1&=~0x01;       // Clear RI1 Flag

	return SBUF1;
}


/***********************************************************************************/
// 文件结束
/***********************************************************************************/

⌨️ 快捷键说明

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