/********************************************************************** * 本程序在STC89C51RC单片机中进行过测试,完全正常(晶振11.0592M) * 用户可以根据晶振不同自行修改,建议用户先连接PC,通过PC的串口调试 * 助手来验证程序是否有效 * P30: RXD * P31: TXD **********************************************************************/ #include #ifndef _DG_TYPE_ #define _DG_TYPE_ typedef unsigned char uchar; typedef unsigned intuint; #endif #define CMD_LEN 75 //命令长度 #define CMD_TAG //提示符长度 VoidUartInit(); VoidUartSendChar(unsigned char ch); VoidUartSendStr(uchar *pStr); VoidUartCharPro(ucharch); VoidUartCmdPro(); ucharg_ucCmd[CMD_LEN + 1] = {0}; ucharg_ucLen = 0; // 命令长度 ucharg_ucCur = 1; // 光标位置 void main() { UartInit(); UartSendStr("#1P1500T100\r\n"); // S1号舵机在时间100ms内移动到PWM1500的位置 // UartSendStr("#1GC2\r\n"); // 执行第一个动作组,循环执行2次 while(1); } /************************************************************ * Name: UartInit * Func: * 串行通信初始化 * Para: * ucharch: 发送的字符 * Return: None ***********************************************************/ voidUartInit() { SCON = 0x50; // SCON: serail mode 1, 8-bit UART TMOD |= 0x20; // TMOD: timer 1, mode 2, 8-bit reload PCON |= 0x80; // SMOD="1"; TH1 = 0xFA; // Baud:9600fosc="11".0592MHz TL1 = 0xFA; IE |= 0x90; // 使能串行中断 TR1 = 1; // 启动TIMER1 EA = 1; } /************************************************************ * Name: UartSendChar * Func: * 向串口发送一个字符 * Para: * ucharch: 发送的字符 * Return: None ***********************************************************/ voidUartSendChar(unsigned char ch) { SBUF = ch; while(TI==0); TI=0; } /************************************************************ * Name: UartSendStr * Func: * 向串口发送以0结尾的字符串 * Para: * uchar *pStr: 发送的字符指针 * Return: None ***********************************************************/ voidUartSendStr(uchar *pStr) { while(*pStr != 0) { SBUF = *pStr++; while(TI==0); TI=0; } } voidUartSrv() interrupt 4 { unsigned char ch; ch = SBUF; if(RI) { RI = 0; //UartSendChar(ch); //P0 = ~ch; UartCharPro(ch); } } /************************************************************ * Name: UartCharPro * Func: * 字符处理过程函数。根据输入的普通字符或控制字符判断回显。 * Para: * ucharch: 判断的字符 * Return: None ***********************************************************/ voidUartCharPro(ucharch) { P0 = ~ch; switch(ch) { case '\b': // 退格键 if(g_ucCur> CMD_TAG) { UartSendChar('\b'); UartSendChar(' '); UartSendChar('\b'); if(g_ucLen) { g_ucLen--; } g_ucCur--; } break; case '\r': // 回车键 UartSendChar('\r'); UartSendChar('\n'); g_ucCmd[g_ucLen] = 0; UartSendStr(g_ucCmd); UartSendChar('\r'); UartSendChar('\n'); UartSendChar('>'); g_ucLen = 0; g_ucCur = 1; break; default: // 其他字符 UartSendChar(ch); g_ucCur++; if(g_ucLen< CMD_LEN) { g_ucCmd[g_ucLen++] = ch; } else { g_ucCmd[g_ucLen] = 0; } } }