小記:本例子是在別人的版本修改而來的,因本人沒有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,發回接收數據
}
}