专注电子技术学习与研究
当前位置:单片机教程网 >> MCU设计实例 >> 浏览文章

51单片机串口通信例子

作者:佚名   来源:不详   点击数:  更新时间:2014年08月17日   【字体:

     小记:本例子是在别人的版本修改而来的,因本人没有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,发回接收数据
 
 }
}
关闭窗口