本程序是模拟串口硬件机制写的,使用时可设一定时中断,时间间隔为1/4波特率,每中断一次调用一次接收函数, 每中断4次调用一次发送函数,不过.对单片机来说时钟并须要快.要知道9600的波特率的每个BIT的时间间隔是104us.而单片机中断一次压栈出栈一次的时间是20us左右(标准的51核12M晶体)这样处理时间就要考虑清楚了.呵呵.以下程序是放在定时器中断程序函数内的
//接收部分 
sbit JieShou_D=   ;//定义接收端口 
uint8 DingShiJiShu,JieShou_h;//定时计数,接收缓冲器 
uint16 JieShou_T;//接收临时寄存器    
bit KaiShi,JieShou_b;//开始接收标准,接收完成标志 
void JieShou(void)  //接收函数,每4次调用接收一位 
{ 
   if((KaiShi==0) && (JieShou_D==0))  //串行开始位到来 
      { 
          DingShiJiShu=0;     //开始定时计数 
          KaiShi=1; 
          JieShou_T=0xffff;   //接收临时寄存器置全1 
      } 
   else if((KaiShi==1) && (DingShiJiShu==1))  //第2次调用,串行数据采样时间到来 
      { 
         JieShou_T >>= 1; 
         if(JieShou_D) JieShou_T |=0x8000; 
      } 
   else if(JieShou_T & 0x807f ==0x803f)  //接收完成 JieShou_T=1xxx_xxxx_x011_1111 
      { 
         KaiShi=0; 
         DingShiJiShu=0; 
         JieShou_h = JieShou_T >> 7; //右移7位得到串行数据 
         JieShou_b=1; 
      }   
   if(KaiShi) 
      { 
         DingShiJiShu++;          //只在开始接收时定时计数+1 
         DingShiJiShu &=0x03;     //每4次调用接收一位 
      } 
}
//发送部分 
sbit FaSong_D=   ;//定义发送端口 
uint16 FaSong_h;   //发送缓冲区 
bit FaSong_b;    //发送完成标志
void KaiShiFaSong(uint8 fs) //设置发送数据,开始发送 
{ 
   FaSong_h = fs;     
   FaSong_h <<= 1; 
   FaSong_h |= 0x0200;  //FaSong_h=0000_001x_xxxx_xxx_0 
   FaSong_b=0;  //发送标志=0 表示正在发送中 
}
void FaSong(void) //发送函数,每调用一次发一位 
{ 
  if(FaSong_h)  //发送未完成 
   { 
       if(FaSong_h & 0x0001) 
              FaSong_D=1; 
       else   FaSong_D=0;
       FaSong_h >>= 1; 
    } 
   else 
     FaSong_b =1;  //发送完成标志=1 表示发送完成 
}