51_串行通信

2019-04-15 14:09发布

/*三根线(同样适合单片机与单片机,单片机与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单片机**)  

热门文章