51_串行通信

来源:互联网 发布:淘宝卖家数据谁有账号 编辑:程序博客网 时间:2024/05/22 09:06

/*三根线(同样适合单片机与单片机,单片机与PC,单片机与其他的收发设备)

*P3^0连接另一单片机的P3^1

*P3^1连接另一单片机的P3^0

*地连接另一单片机地

*/

/////////////////////////////////////////////////////////////

/*GATE   C / T      M1        M0     GATE  C / T      M1        M0*/

TMOD=0x20; ////定时器T1工作在方式2,

/* SCON:      SM0     SM1     SM2     REN      TB8      RB8       TI         R1  */

 SCON=0x50;//  串行口工作在方式1,既可以发送数据,也可以接收数据,波特率可变 ,8位,也可以这样写:SM0=0;   SM1=1;REN=1;  //允许接收数据   0101_0000

 PCON=0x00;       //主要是为了SMOD为1或者0,0为波特率不加倍

 TH1=0xfd;     // 赋值9600的波特率
 TL1=0xfd;

 RI=0;        //RI,TI:串行口收/发数据申请中断标志位
 TI=0;

 TR1=1;        //启动定时器1,用定时器1作为波特率发生器

/*IE:  EA —  ET2  ES  ET1  EX1 ET0  EX0*/   //ES:串行中断允许控制位

 IE=0x90;       //串行口总中断打开 使能串行中断

////////////////////串口中断函数///////////////////////////////////////////////

void recieve() interrupt 4
{

 if(RI==1)
 {
  RI=0;
  shuju[i]=SBUF;
  i++; 

 if(i==8)//前面定义了uchar shuju[8];
  {

i=0;


write_str(0x88, "接收到的数据:");

 write_lcd12864(1,shuju[0]);

 write_lcd12864(1,shuju[1]);

 write_lcd12864(1,shuju[2]);

     }
 
 }
  
}

/////////////////////////////////发送函数/////////////////////////////////////////////

void transfer(uchar c)
{
 SBUF=c;
 while(TI==0);
 TI=0;
}

//////////////////////////////////////end///////////////////////////////////////////////

注意:如果是9600的波特率要11.0592的晶振,初值TH1=0xfd; TL1=0xfd;如果接收发送不正常多数是波特率不对!

如果调试的时候出错,可以先用单片机跟PC的串口调试软件调试发送跟接收看是否正常!!

初值x=2^8    -     2^0(SMOD) * 11.0592*10^6 (晶振)    /    (32*波特率*12)


(**51单片机**)