这是一个关于单片机与PC机串口通信程序。
想要实现的功能就是,通过PC的串口调试工具,将发送给单片机的字符又发回PC并显示在串口终端上,单片机程序能识别特殊功能键如退格、回车等,其中退格可以修改输入的字符,回车确认。确认后,将刚才输入的字符串整体送回PC串口终端显示出来。
程序运行效果如下:
下面就是程序原文。
/************************************************************
* Uart Program
* Donald, DONG ELECT. LAB.
* 2008.5.13 [complete]
* --------------------------------------------------
* 在PC上通过超级终端或者其它串口调试工具,将键盘按下的值显示
* 在终端上,并将输入的字符串再次输出到终端上。
*
* P30: RXD
* P31: TXD
***********************************************************/
#include <reg52.h>
#ifndef _DG_TYPE_
#define _DG_TYPE_
typedef unsigned char uchar;
typedef unsigned int uint;
#endif
#define CMD_LEN 75 // 命令长度
#define CMD_TAG 1 // 提示符长度
void UartInit();
void UartSendChar(unsigned char ch);
void UartSendStr(uchar *pStr);
void UartCharPro(uchar ch);
void UartCmdPro();
uchar g_ucCmd[CMD_LEN + 1] = {0};
uchar g_ucLen = 0; // 命令长度
uchar g_ucCur = 1; // 光标位置
void main()
{
UartInit();
UartSendStr("\r\n");
UartSendStr(" DDDDDDD DDDDDDDDDDDDDD\r\n");
UartSendStr(" DDDDDD DDDDDDDDDDDDD\r\n");
UartSendStr(" DDDDDD DDDDDDDDDDD\r\n");
UartSendStr(" DDDDD DDDDDDDDDD\r\n");
UartSendStr(" DDDDD DDDDDDDD\r\n");
UartSendStr(" DDDD DDDDDDDDDDD\r\n");
UartSendStr(" DDD DDDDDDDDDDDDDDD\r\n\r\n");
UartSendStr(" -- DG100 UART TEST PROGRAM -- \r\n");
UartSendStr(" by Donald\r\n\r\n>");
while(1);
}
/************************************************************
* Name: UartInit
* Func:
* 串行通信初始化
* Para:
* uchar ch: 发送的字符
* Return: None
***********************************************************/
void UartInit()
{
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:9600 fosc="11".0592MHz
TL1 = 0xFA;
IE |= 0x90; // 使能串行中断
TR1 = 1; // 启动TIMER1
EA = 1;
}
/************************************************************
* Name: UartSendChar
* Func:
* 向串口发送一个字符
* Para:
* uchar ch: 发送的字符
* Return: None
***********************************************************/
void UartSendChar(unsigned char ch)
{
SBUF = ch;
while(TI==0);
TI="0";
}
/************************************************************
* Name: UartSendStr
* Func:
* 向串口发送以0结尾的字符串
* Para:
* uchar *pStr: 发送的字符指针
* Return: None
***********************************************************/
void UartSendStr(uchar *pStr)
{
while(*pStr != 0) {
SBUF = *pStr++;
while(TI==0);
TI=0;
}
}
void UartSrv() interrupt 4
{
unsigned char ch;
ch = SBUF;
if(RI)
{
RI = 0;
//UartSendChar(ch);
//P0 = ~ch;
UartCharPro(ch);
}
}
/************************************************************
* Name: UartCharPro
* Func:
* 字符处理过程函数。根据输入的普通字符或控制字符判断回显。
* Para:
* uchar ch: 判断的字符
* Return: None
***********************************************************/
void UartCharPro(uchar ch)
{
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;
}
}
}
已经加了必要注释,相信很容易读懂。
(原创,转载注明出处:Author: Donald Email: Support.Dong[AT]gmail.com)
用户223951 2009-6-25 08:11