原先发布在这个博客 
http://hi.baidu.com/%B5%FB%CF%FE ... b898c07a89476b.html 
一个很简单的程序,主要实现: 
用串口调试助手工具,发送“!a1”,只有LED灯P1.1亮,并返回“!a1ok”,并且发送“!b1”,p1.1灯灭,返回“!b1ok";以此类推,发送“!a2”,只有LED灯p1.2亮,并返回“!a2ok”,并且发送“!b2”,p1.2亮灭,返回“!b2ok") 
 
// by蝶晓梦,串行通信演示  
// 2010-7-10 2:06:26 调试通过  
#include <REG52.H>  
#include <math.h>//数学库  
 
unsigned char power2(unsigned char x) // 计算2的x次幂  
{  
  return((unsigned char)exp(x * log(2)));  
}  
 
void main(void) {  
 
  SCON = 0x50; // 模式 1, 8-bit UART, 使能接收  
  TMOD |= 0x20; // timer 1, mode 2, 8-bit reload  
  TH1 = 0xF3; // 2400 波特率 @ 12MHz  
  TL1 = 0xF3; // 如果不用12MHz改用11.0592MHz删除这行,TH1    = 0xFD;  
  TR1 = 1; // timer 1启动  
  EA = 1; // 打开总中断  
  ES = 1; // 打开串口中断  
 
  while (1) // 主循环  
  {  
    P1 &= 0xFE; // P1.0低电平亮灯  
  }  
}  
 
void UART_SER(void)interrupt 4 // 串行中断服务程序  
{  
  static unsigned char Cache[2], i = 0; // 定义缓存  
  unsigned char Temp; // 定义临时变量  
 
  if (RI) // 判断是接收中断产生  
  {  
    RI = 0; // 标志位清零  
    Temp = SBUF; // 读入缓冲区的值  
    if (Temp != '!') {  
      Cache = Temp;  
      i++;  
      if (i > 1) {  
        if ((Cache[0] == 'a') || (Cache[0] == 'b')) {  
          if (Cache[0] == 'a')  
            P1 &= 0xFF - power2(Cache[1] - '0');  
          else  
            P1 |= power2(Cache[1] - '0');  
 
          SBUF = '!'; // 发回电脑端  
          while (!TI); // 等待数据传完  
          TI = 0; // 发送标志位清零  
          SBUF = Cache[0]; // 发回电脑端  
          while (!TI); // 等待数据传完  
          TI = 0; // 发送标志位清零  
          SBUF = Cache[1]; // 发回电脑端  
          while (!TI); // 等待数据传完  
          TI = 0; // 发送标志位清零  
          SBUF = 'O'; // 发回电脑端  
          while (!TI); // 等待数据传完  
          TI = 0; // 发送标志位清零  
          SBUF = 'K'; // 发回电脑端  
          while (!TI); // 等待数据传完  
          TI = 0; // 发送标志位清零  
        }  
 
        i = 0;  
 
      }  
    }  
    else  
      i = 0;  
    if (i > 1)  
      i = 0;  
 
  }  
  if (TI)  
    TI = 0; // 发送标志位清零  
}  
 
 
  
  
  
好吧,全都写到一块了 |  
  
 |