📄 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 "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 + -