您好,欢迎访问三七文档
当前位置:首页 > 电子/通信 > 综合/其它 > 51单片机之间的通信程序
以下程序通过实践检测完全可以放心使用不过注意硬件电路的连接单片机的串口通信主要理解SCON的状态控制寄存器的用法波特率的设定1两个单片机一个为主机一个为从机,又主机控制从机的LED灯得简单程序入手注意硬件的连线将单片机串口的第二引脚与另一单片机串口的第三引脚相连同时另一单片机的第二串口引脚也与前一个单片机的第三引脚相连123456789J2DConnector9主机部分的程序设计//主机程序发送控制信号的#includereg52.h#defineucharunsignedchar#defineuintunsignedintsbitKEY=P3^0;//按键sbitledA=P1^1;//定义了三个灯来指示发送的字符是什么sbitledB=P1^3;sbitledC=P1^5;sbitledstop=P1^6;ucharKEY_number=0;//按键计数voiddelay(unsignedintz)//延时函数{unsignedintx,y;for(x=z;x0;x--)for(y=240;y0;y--);}voidinit(){SCON=0x40;//主机串口工作方式1REN=0之允许发送不能接收TMOD=0x20;PCON=0x00;TH1=0xfd;TL1=0xfd;T1=RI=0;//必须要做来保证可以顺利进入终端TR1=1;EA=1;ES=1;}voidPut_charToSBUF(ucharc)//把一个字符写入SBUF{SBUF=c;while(TI==0);//巧妙的等待处理等带发送完毕TI=0;}voidmain(){init();while(1){if(KEY==0){delay(5);if(KEY==0){P1=0xff;while(!KEY);KEY_number++;if(KEY_number==4)KEY_number=0;}}switch(KEY_number){case0:ledstop=0;break;case1:ledA=~ledA;Put_charToSBUF('A');break;case2:ledB=~ledB;Put_charToSBUF('B');break;case3:ledC=~ledC;Put_charToSBUF('C');break;}delay(100);}}从机部分的程序#includereg52.h#defineucharunsignedchar#defineuintunsignedintsbitd1=P1^0;sbitd2=P1^1;sbitd3=P1^2;voiddelay(unsignedintz)//延时函数{unsignedintx,y;for(x=z;x0;x--)for(y=240;y0;y--);}voidinit(){SCON=0x50;//允许串口接收TMOD=0x20;PCON=0x00;TH1=0xfd;TL1=0xfd;RI=0;TR1=1;EA=1;ES=1;}voidmain(){init();while(1){if(RI){RI=0;switch(SBUF){case'A':d1=~d1;break;case'B':d1=1;d2=~d2;break;case'C':d2=1;d3=~d3;break;}}elsed1=d2=d3=1;delay(100);}}上面的程序是一主一从单片机之间也可以建立一个双向的通信过程//甲机程序发送控制信号的同时接收乙机发来的串口信息并//且显示在数码管上#includereg52.h#defineucharunsignedchar#defineuintunsignedintsbitKEY=P3^0;sbitledA=P1^1;sbitledB=P1^3;sbitledC=P1^5;sbitledstop=P1^6;unsignedcharcodeduan[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};ucharKEY_number=0;voiddelay(unsignedintz)//延时函数{unsignedintx,y;for(x=z;x0;x--)for(y=240;y0;y--);}voidinit(){P2=0;P0=0;SCON=0x50;TMOD=0x20;PCON=0x00;TH1=0xfd;TL1=0xfd;T1=RI=0;TR1=1;EA=1;ES=1;}voidPut_charToSBUF(ucharc){SBUF=c;while(TI==0);TI=0;}voidmain(){init();while(1){if(KEY==0){delay(5);if(KEY==0){P1=0xff;while(!KEY);KEY_number++;if(KEY_number==4)KEY_number=0;}}switch(KEY_number){case0:ledstop=0;break;case1:ledA=~ledA;Put_charToSBUF('A');break;case2:ledB=~ledB;Put_charToSBUF('B');break;case3:ledC=~ledC;Put_charToSBUF('C');break;}delay(100);}}voidseral_int()interrupt4{if(RI){RI=0;if(SBUF=0&&SBUF=9)P0=duan[SBUF];elseP0=0x00;}}乙机部分车程序主要接收甲的串口信息同时发送字符给甲。#includereg52.h#defineucharunsignedchar#defineuintunsignedintsbitd1=P1^0;sbitd2=P1^1;sbitd3=P1^2;sbitkey=P3^0;ucharnumber;voiddelay(unsignedintz)//延时函数{unsignedintx,y;for(x=z;x0;x--)for(y=240;y0;y--);}voidinit(){P0=0x00;SCON=0x50;TMOD=0x20;PCON=0x00;TH1=0xfd;TL1=0xfd;RI=TI=0;TR1=1;EA=1;ES=1;}voidmain(){init();while(1){if(key==0){delay(5);if(key==0){while(!key);SBUF=number;while(TI==0);TI=0;number++;if(number==11)number=0;}}delay(100);d1=d2=d3=1;}}voidserial_int()interrupt4{if(RI){RI=0;switch(SBUF){case'A':d1=~d1;break;case'B':d1=1;d2=~d2;break;case'C':d2=1;d3=~d3;break;}}}比较上面的程序可以知道接收部分都在串口中断里进行发送部分在MAIN函数里完成
本文标题:51单片机之间的通信程序
链接地址:https://www.777doc.com/doc-4313995 .html