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

📄 uart.c

📁 单片机实现消息队列的例子
💻 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 "define.h"
#include "message.h"
#include "uart.h"
#include "string.h"
#include "system.h"
#include "rtc.h"
#include "led.h"
#ifdef UART_RX
byte idata g_strUartBuffer[0x10];	/*r定义串口命令堆栈(数组),数组中元素为明码形式的字符串型命令的每个字符的ASCII码字*/
byte*  g_pCurUartPos;


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

	/*用户命令*/
	
};

#define UART_CMD 	sizeof(UartCmdString)
#endif

/***********************串口&Timer1初始化****************/
extern void UartInit(void)
{
	/*TMOD:0020xxxx*/
	RESETBIT(TMOD,7);
	RESETBIT(TMOD,6);
	SETBIT(TMOD,5);
	RESETBIT(TMOD,4);
	/*TH1=0xfd******/
	/*11.0592MHZ----->9600*****/
	TH1=0xFD;
	TR1=1;
	ET1=0;
	/********SCON***********/
	/*
	#ifdef UART_RX
	SCON=0x50;
	#else
	SCON=0x60;
	#endif
	*/
	SCON=0x50;
	RESETBIT(PCON,7);
	#ifdef UART_RX
	g_pCurUartPos=g_strUartBuffer;
	#endif
	ES=1;
	PS=0;
}

/******************************************************************************************
*函数名:		UartInterruptServer
*参数:			无
*返回值:		无
*描述:			串口中断服务子程序
*编写:			王绍伟
*版本信息:		V1.0			2003年8月15日
******************************************************************************************/
#ifdef UART_RX
void UartInterruptServer(void) interrupt 4
{
	if(RI)
	{
		ES = 0;
		RI = 0;
		//if(SBUF!=0xff) 
		//	{
		*g_pCurUartPos = SBUF;
		if(*g_pCurUartPos == 0x0D)		/*回车*/
		{
			*g_pCurUartPos = 0;			/*字符串最后一位为NULL*/
			g_pCurUartPos = g_strUartBuffer;	
			MsgQueueIn(MSG_UART, NONE);
			return;
		}
		else
		{
			g_pCurUartPos++;
		}
		//	}
		ES=1;
	}
}


/******************************************************************************************
*函数名:		UartCommand
*参数:			无
*返回值:		无
*描述:			串口消息处理/执行程序
*编写:			王绍伟
*版本信息:		V1.0			2003年8月15日
******************************************************************************************/
static void UartCmdProcess(UartCommand nUartCommand,byte * pData)
{
	switch(nUartCommand)
	{
		case UART_TIME:	
			RtcSetTime(*pData,*(pData+1),*(pData+2));
			break;
	}
}








/******************************************************************************************
*函数名:		UartProcess
*参数:			无
*返回值:		无
*描述:			串口处理程序,
*编写:			王绍伟
*版本信息:		V1.0			2003年8月15日
******************************************************************************************/
extern void UartProcess(void)
{
	byte i,j;
	for(i = 0; i < UART_CMD; i++)
	{
		j=strlen(UartCmdString[i]);
		if(!strncmp(g_strUartBuffer, UartCmdString[i],j))
		{
			UartCmdProcess(i,g_strUartBuffer+j);						/*对命令进行处理*/
			break;
		}
	}
	
	ES = 1;								/*设置完命令标识后允许串口中断*/
}
#endif
/******************************************************************************************
*函数名:		uart_send_data
*参数:			pData
*返回值:		g_nCurUartLen
*描述:			以串口发送以pData为首地址,len长度的字节数据
*编写:			王绍伟
*版本信息:		V1.0			2003年8月15日
******************************************************************************************/
#ifdef UART_TX
extern void UartSend(byte* pData, byte len)
{
	bool bES;
	byte data i;
	bES = ES;		/*禁止串口产生中断,而以查询的方式发送数据*/
	ES = 0;
	for(i=0;i<len;i++)
	{
		SBUF = *pData;
		pData++;
		while(!TI);
		TI = 0;
	}
	ES = bES;
}
#endif

⌨️ 快捷键说明

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