51串口通信

/*
*单片机接收主机的数据,然后将数据传送到P2口,
*当按下K1=P1.4 时, 单片机发送字符串 给主机 
*/ 
#include <reg51.h>
#include <intrins.h>

unsigned char key_s, key_v, tmp;
char code str1[] = "123 ";
char code str2[] = "abc ";
char code str3[] = "666 ";
void send_str();
bit scan_key();
void proc_key();
void delayms(unsigned char ms);
void send_char(unsigned char txd);
sbit K1 = P1^4;

main()
{
  SCON=0X50;  //设置为工作方式1
  TMOD=0X20;  //设置计数器工作方式2
  PCON=0X80;  //波特率加倍
  TH1=0XF3; //计数器初始值设置,注意波特率是4800的
  TL1=0XF3;
  TR1 = 1; //启动定时器1
  IE = 0x0; //禁止任何中断
  while(1)
  {
    if(scan_key()) // 扫描按键
    {
      delayms(10); // 延时去抖动
      if(scan_key()) // 再次扫描
      {
        key_v = key_s; // 保存键值
        proc_key(); // 键处理
      }
    }
    if(RI) // 是否有数据到来
    {
      RI = 0;
      tmp = SBUF; // 暂存接收到的数据
      P2 = tmp; // 数据传送到P0口
      send_char(tmp); // 回传接收到的数据
    } 
  }
}

bit scan_key()
{
  key_s = 0x00;
  key_s |= K1;
  return(key_s ^ key_v);
}

void proc_key()
{
  if((key_v & 0x01) == 0)
  { // K1按下
    send_str(); // 传送字串"welcome!...
  }
}

void send_char(unsigned char txd)
{
  SBUF = txd;
  while(!TI); // 等特数据传送
  TI = 0; // 清除数据传送标志
}

void send_str()
{
  unsigned char i = 0;
  while(str1[i] != '')
  {
    SBUF = str1[i];
    while(!TI); // 等特数据传送
    TI = 0; // 清除数据传送标志
    i++; // 下一个字符
  }
  i = 0;
  while(str2[i] != '')
  {
    SBUF = str2[i];
    while(!TI); // 等特数据传送
    TI = 0; // 清除数据传送标志
    i++; // 下一个字符
  }
  i = 0;
  while(str3[i] != '')
  {
    SBUF = str3[i];
    while(!TI); // 等特数据传送
    TI = 0; // 清除数据传送标志
    i++; // 下一个字符
  }
}

void delayms(unsigned char ms)
{ 
  unsigned char i;
  while(ms--)
  {
    for(i = 0; i < 120; i++);
  }
}
原文地址:https://www.cnblogs.com/wangxuehao/p/7073551.html