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

📄 uart.c

📁 C51学习书
💻 C
字号:
/*************************************************/

/**************串行口控制********************/

/*************2003年1月24日*********************/

/************WROTE BY WANGSW********************/

/*
UART所需的定时器由T1或T2提供,而不是T0

	SCON:串行口控制寄存器
	SM0(9F),SM1(9E)
		SM0,SM1|工作方式|        说明 			|所用波特率 
        	   0,0     |  方式0       |同步移位寄存器|       Fosc/12                 
      		   0,1     |  方式1       | 10位异步收发       |由定时器控制 
       	   1,0     |  方式2       | 11位异步收发       |Fosc/32或Fosc/64     
       	   1,1     |  方式3       | 11位异步收发       |由定时器控制
       SM2(9D)		多机通信0:单机,1:多机
       REN(9C)		接收控制0:禁止接收,1:允许接收    
       TB8	(9B)		发送数据第九位
       RB8	(9A)		接收数据第九位
       TI	(99)		发送中断标记
       RI	(98)		接收中断标志
*/

#include "reg52x2.h"
#include <stdlib.h>
#include <stdio.h>

#include "define.h"

#include "uart.h"

#include "lcd.h"
#include "timer.h"
#include "string.h"



bool bDC = FALSE;
byte len = 0;
byte idata UartCommandPool[0x10];	/*r定义串口命令堆栈(数组),数组中元素为明码形式的字符串型命令的每个字符的ASCII码字*/
byte idata UartDataPool[3];
byte*  pUartCommandPool;
byte*  pUartDataPool;

UartSign eUartSign;

static byte code *UartCmdString[] =
{
	/*系统命令*/	
	"DEBUG START",
	"DEBUG END"

	/*用户命令*/
	
};

#define UART_CMD 	sizeof(UartCmdString) / 2

static void UartInterruptServer(void);

static void UartCmdProcess(void);

static void UartDataProcess(void);



/******************************************************************************************
*函数名:		UartInterruptServer
*参数:			无
*返回值:		无
*描述:			串口中断服务子程序
*编写:			王绍伟
*版本信息:		V1.0			2003年8月15日
******************************************************************************************/
static void UartInterruptServer(void) interrupt 4
{
	ES = 0;
	RI = 0;

	if(bDC == FALSE)				/*命令即字符串*/
	{
		*pUartCommandPool = SBUF;
		if(*pUartCommandPool == 0x0D)		/*回车*/
		{
			*pUartCommandPool = 0;			/*字符串最后一位为NULL*/
			pUartCommandPool = UartCommandPool;	
			msg_queue_in(MSG_UART, NONE);
			return;
		}
		else
		{
			pUartCommandPool++;
		}
	}
	else
	{
		*(pUartDataPool++) =SBUF;		/*r如果是数据,则存放于数据堆栈*/
		if(!(--len))
		{
			*pUartDataPool = '\0';
			pUartDataPool = UartDataPool;
			msg_queue_in(MSG_UART, NONE);
			return;
		}
	}
	ES=1;
}


/******************************************************************************************
*函数名:		UartCommand
*参数:			无
*返回值:		无
*描述:			串口消息处理/执行程序
*编写:			王绍伟
*版本信息:		V1.0			2003年8月15日
******************************************************************************************/
static void UartCmdProcess()
{
	switch(eUartSign)
	{
		case DEBUG_START:		
			bDC = 0;	
			break;
		case DEBUG_END:
			bDC=0;
			break;
	}
}


/******************************************************************************************
*函数名:		UartData
*参数:			无
*返回值:		无
*描述:	
*编写:			王绍伟
*版本信息:		V1.0			2003年8月15日
******************************************************************************************/
static void UartDataProcess()
{
	switch(eUartSign)
	{
		case UART_SETUP:
			bDC = 0;
			break;
	}
	/*命令处理程序*/
}



/******************************************************************************************
*函数名:		uart_init
*参数:			eBaudRate
*返回值:		无
*描述:			串口初始化程序,主要设定了波特率以及T1作为波特率产生
				器的工作方式等,并且指定了串口数据以及命令存放堆栈
*编写:			王绍伟
*版本信息:		V1.0			2003年8月15日
******************************************************************************************/
extern void uart_init(UartBaudrate eBaudRate)
{
	ES = 0;			/*关串行口中断*/	
	
#ifdef SPEEDUP
	RESETBIT(PCON, 7);   /*SMOD=1			波特率加速位*/
#else
	SETBIT(PCON, 7);
#endif
	
	TMOD &= 0x0F;
	TMOD |= 0x20;
	ET1 = 0;				/*中断无效*/
	TH1 = eBaudRate;
	TL1 = eBaudRate;
	TR1 = 1;				/*定时器开启*/
	SCON = 0x50;
	pUartDataPool = UartDataPool;
	pUartCommandPool = UartCommandPool;
	ES = 1;				/*串行口中断printf需要串口关闭*/
}


/******************************************************************************************
*函数名:		uart_send_data
*参数:			pData
*返回值:		len
*描述:			以串口发送以pData为首地址,len长度的字节数据
*编写:			王绍伟
*版本信息:		V1.0			2003年8月15日
******************************************************************************************/
extern void uart_send(byte* pData, byte len)
{
	bool bES;
	byte data i;
	bES = ES;		/*禁止串口产生中断,而以查询的方式发送数据*/
	ES = 0;
	if(!len)
	{
		i = len;
	}
	else
	{
		i = strlen(pData);
	}
	while(i--)
	{
		SBUF = *pData++;
		while(!TI);
		TI = 0;
	}
	ES = bES;
}


/******************************************************************************************
*函数名:		uart_process
*参数:			无
*返回值:		无
*描述:			串口处理程序,
*编写:			王绍伟
*版本信息:		V1.0			2003年8月15日
******************************************************************************************/
extern void uart_process(void)
{
	byte i;
	if(bDC == FALSE)					/*若是命令,则比较命令字符串,设置串口命令标识*/
	{

		for(i = 0; i < UART_CMD; i++)
		{
			if(!strcmp(UartCommandPool, UartCmdString[i]))
			{
				eUartSign = i;
				ES = 1;	
				UartCmdProcess();						/*对命令进行处理*/
				break;
			}
		}
		
		ES = 1;								/*设置完命令标识后允许串口中断*/
	}
	else									
	{
		UartDataProcess();							
	}
}

⌨️ 快捷键说明

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