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

2008-6-3 15:08 12284 5 6 分类: MCU/ 嵌入式

这是一个关于单片机与PC机串口通信程序。


想要实现的功能就是,通过PC的串口调试工具,将发送给单片机的字符又发回PC并显示在串口终端上,单片机程序能识别特殊功能键如退格、回车等,其中退格可以修改输入的字符,回车确认。确认后,将刚才输入的字符串整体送回PC串口终端显示出来。


程序运行效果如下:


8F3OYUU.png


下面就是程序原文。


/************************************************************
 * 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


PARTNER CONTENT

文章评论1条评论)

登录后参与讨论

用户223951 2009-6-25 08:11

eee
相关推荐阅读
用户151196 2008-06-03 19:01
DG100 51单片机ISP下载软件(共享)
DONG 51WR是专门为DG100系统板设计的一款ISP下载软件。本软件可对AT89S系列单片机进行编程,包括擦除、写入、读取、校验、加密等,还能对板载的AT24CXX E2PROM进行擦除、写入、...
用户151196 2008-06-02 12:24
8位数码管动态扫描显示
在这个程序里,让我们来看看如何对8位的数码管进行动态扫描显示。首先了解下电路原理:DG100 51单片机系统板中两个高亮的4位数码管是共阳的,位选信号由P2口控制,段码信号由P0口控制。写程序时,我的...
EE直播间
更多
我要评论
1
5
关闭 站长推荐上一条 /3 下一条