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