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