📄 uart.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 + -