小记:本例子是在别人的版本修改而来的,因本人没有11.0592MHz的晶振,进而采用12MHz的,经过波特率的调整发现在波特率为1200时,定时器工作在方式二,穿口工作在模式二,且SMOD=1.此时定时器的TH1=TL1=0xCC,此时调试串口没有错误。

发送例子:

#include<reg52.h>
#include<stdio.h>

void delay(unsigned int i);

char code message[]=”welcome”;
unsigned char a;
void main(void)
{
 SCON=0x50; //REN=1 ,串口工作模式2;
 TMOD=0x20; //定时器工作方式2;
 PCON=0x80;
 TH1=0xCC;
 TL1=0xCC;

 TR1=1;//启动定时器
 ES=1; //串行中断允许
 EA=1;//开总终端
 while(1)
 {
  a=0;
  while(message[a]!=\’\0\’)
  {
   SBUF=message[a];

   while(!TI)  //等待一帧数据(一个字符)发完,TI置1,

    TI=0;    //让TI为0就继续接收,直至跳出while。

    a++;    //接收下一字符

   delay(1000);

  }
 }

}
void delay(unsigned int i)
{
 unsigned char j;
 for(i;i>0;i–)
  for(j=200;j>200;j–);

}

接收例子:

#include<reg52.h>
#include<stdio.h>

sbit BEEP=P1^4;
unsigned char b;
void main(void)
{
 ……………..

 BEEP=1;
 while(1)
 {
  if(RI==1) 
//如果一帧数据接收完毕
  {
   RI=0;    //RI清零;继续接收下一帧数据

   P1=SBUF; //数据送P1口

  }
 }        
//如果P1^4为0或1,可驱动蜂鸣器发声

}         
//即发送的数据bit4为0或1

发送加接收例子:

#include<reg52.h>

bit flag;
unsigned int redata,sendata;

void main(void)
{

………………
 while(1)
 {
  if(flag==1)
  {
   SBUF=sendata; //发送数据

   while(TI==0);//等待发送完毕

   TI=0;        //发送完毕,TI=0

   flag=0;     //flag清零

  }
 }
  
}
void ser_int(void) interrupt 4  using 1
{
 if(RI==1)  //数据接收完毕
 {
  RI=0;     //等待接收下一帧数据

  redata=SBUF;
  sendata=redata; //将接收的数据发回

  flag=1; 
//flag置1,发回接收数据

 

}
}

版权声明:本文为fdggg原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/fdggg/articles/2966446.html