EDN首页   博客首页

日志档案

发表于 2008-6-3 15:08:43

2

标签: 单片机  UART  串口通信  超级终端  C51  

51单片机与PC串口通信程序

这是一个关于单片机与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

系统分类: 单片机   |   用户分类: 无分类   |   来源: 原创   |   【推荐给朋友】   |   【添加到收藏夹】

    阅读(1716)    回复(0)  

投一票您将和博主都有获奖机会!