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

📄 uart.c

📁 C8051F020单片机的AD测试程序
💻 C
字号:
/********************************Copyright (c)*********************************
**                         西安铭朗电子科技有限公司
**                             技    术    部
**                                         
**                           http://www.mlarm.com
**
***********************************文件信息************************************
** File:Uart.c
** 描述: 串口0、1测试程序
** 功能:Uart驱动程序,包括初始化、波特率设置,单字节发送接收、字符串发送接受等。
         程序运行时向PC机发送"WWW.MLARM.COM";接收到PC机的数据后,再将该数据发送
		 回PC机。
** 说明:将跳线器JP7、JP11短接。
**	     使用外部22.1184MHz晶振。
******************************************************************************/
//-----------------------------------------------------------------------------
// 包含文件
//-----------------------------------------------------------------------------
#include <c8051F020.h>
#include <uart.h>
//-----------------------------------------------------------------------------
// 全局变量
//-----------------------------------------------------------------------------
unsigned char data Timer_1s_Count;
unsigned char data Uart0_BaudRate,Uart1_BaudRate;
//-----------------------------------------------------------------------------
// Uart0子程序
//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
// Uart0_Init
//-----------------------------------------------------------------------------
void Uart0_Init(unsigned char BaudRate) //Uart0初始化        
{
    Uart0_BaudRate=0;

	TR1=0;                              // 关闭定时器Timer1
	ET1=0;                              // 关闭定时器Timer1中断 
	PT1=0;                              // 关闭定时器Timer1中断优先权
	TMOD&= 0x0f;                        // TMOD: 定时器1, 模式2, 8位重载 
	TMOD|= 0x20;                        // TMOD: 定时器1, 模式2, 8位重载 

    SCON0  = 0x50;                      // SCON0: 模式1, 8位UART, 使能RX
    PCON  |= 0x80;                      // SMOD00 = 1
	 
	if (BaudRate>=BaudRate_4800)
	{
	 	CKCON |= 0x10;                             // 定时器Timer1使用系统时钟作为时间基准
	 	TH1    = -(SYSCLK/1200/(BaudRate*16));     // 设置定时器Timer1重载值
	}
	else
	{
		CKCON &= ~0x10;                               // 定时器Timer1使用系统时钟作为时间基准
	 	TH1    = -(SYSCLK/1200/(BaudRate*16*12));     // 设置定时器Timer1重载值
	}

	ES0=0;             				 // 关闭串口Uart0中断
	PS0=0;             				 // 关闭串口Uart0中断优先权

	TI0  = 1;                        // Indicate TX0 ready
    RI0  = 0;                        // Indicate RX0 ready

    TR1=1;							 // 打开串口Uart0
 }
//-----------------------------------------------------------------------------
// Uart0_Enable
//-----------------------------------------------------------------------------
void Uart0_Enable(bool Flag)
{
	if (Flag)
		TR1=1;   // 打开串口Uart0
	else
        TR1=0;   // 关闭串口Uart0
}
//-----------------------------------------------------------------------------
// Uart0_SendString
//-----------------------------------------------------------------------------
void Uart0_SendString(unsigned char  *pt)
{
 	WDT_CLR;   

	while(*pt)
	{
		WDT_CLR;
		Uart0_SendByte(*pt++);
	}
}
//-----------------------------------------------------------------------------
// Uart0_SendByte
//-----------------------------------------------------------------------------
void Uart0_SendByte(unsigned char value)
{
	while(!TI0);            // Wait send 1 byte data finish
    SBUF0=value;            // Send the data to uart0
	TI0=0;  				// Clear interrupt flag
}
//-----------------------------------------------------------------------------
// Uart0_ReceiveData
//-----------------------------------------------------------------------------
unsigned char Uart0_ReceiveData(void)
{
	Timer_1s_Count=0;
	while(!RI0)
	{
		WDT_CLR;
  		if (Timer_1s_Count>=5)
			return 0xff;
	}		   // Wait receive data finished
	RI0=0;     // Clear RI0 Flag
	return SBUF0;
}

//-----------------------------------------------------------------------------
// Uart1子程序
//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
// Uart1_Init
//-----------------------------------------------------------------------------
void Uart1_Init(unsigned char BaudRate)    //Init Uart0                             
{   
	 Uart1_BaudRate=0;

	 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/1200/(BaudRate*32)))/256;
	 RCAP4L =(65536-(SYSCLK/1200/(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_Enable
//-----------------------------------------------------------------------------
void Uart1_Enable(bool Flag)
{
	if (Flag)
		T4CON|=0x04;      // Enable Uart1
	else
        T4CON&=~0x04;     // Disable Uart1
}

//-----------------------------------------------------------------------------
// Uart1_SendString
//-----------------------------------------------------------------------------
void Uart1_SendString(unsigned char *pt)
{
	WDT_CLR;   

	while(*pt)
	{
		WDT_CLR;
		Uart1_SendByte(*pt++);
	}
}

//-----------------------------------------------------------------------------
// Uart1_SendByte
//-----------------------------------------------------------------------------
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_ReceiveData
//-----------------------------------------------------------------------------
unsigned char Uart1_ReceiveData(void)
{
	Timer_1s_Count=0;
	while(!(RI1))
	{
		WDT_CLR;
		if (Timer_1s_Count>=5)
				return 0xff;
	}				// Wait receive data finished
	SCON1&=~0x01;   // Clear RI1 Flag
	return SBUF1;
}

//---------------------------------End-----------------------------------------

⌨️ 快捷键说明

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