1、以下程序通过实践检测完全可以放心使用 不过注意硬件电路的连接单片机的串口通信主要理解 SCON 的状态控制寄存器的用法波特率的设定1 两个单片机一个为主机一个为从机,又主机控制从机的 LED灯得简单程序入手 注意硬件的连线 将单片机串口的第二引脚与另一单片机串口的第三引脚相连同时另一单片机的第二串口引脚也与前一个单片机的第三引脚相连 23456789JDConectr主机部分的程序设计/主机程序 发送控制信号的 #include#define uchar unsigned char#define uint unsigned int sbit KEY=P30;/按键sbit ledA=P11;/
2、定义了三个灯来指示发送的字符是什么sbit ledB=P13;sbit ledC=P15;sbit ledstop=P16;uchar KEY_number=0;/按键计数void delay(unsigned int z)/延时函数unsigned int x,y;for(x=z;x0;x-)for(y=240;y0;y-);void init()SCON=0x40;/主机串口工作方式 1 REN=0 之允许发送不能接收TMOD=0x20;PCON=0x00;TH1=0xfd;TL1=0xfd;T1=RI=0;/必须要做来保证可以顺利进入终端 TR1=1;EA=1;ES=1;void Put
3、_charToSBUF(uchar c) /把一个字符写入 SBUFSBUF=c;while(TI=0); /巧妙的等待处理 等带发送完毕 TI=0;void main()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)case 0: ledstop=0; break;case 1: ledA=ledA; Put_charToSBUF(A);break;case 2: ledB=ledB; Pu
4、t_charToSBUF(B); break;case 3: ledC=ledC; Put_charToSBUF(C);break;delay(100) ;从机部分的程序#include#define uchar unsigned char#define uint unsigned int sbit d1=P10;sbit d2=P11;sbit d3=P12;void delay(unsigned int z)/延时函数unsigned int x,y;for(x=z;x0;x-)for(y=240;y0;y-);void init()SCON=0x50;/允许串口接收 TMOD=0x20;
5、PCON=0x00;TH1=0xfd;TL1=0xfd;RI=0;TR1=1;EA=1;ES=1;void main()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;else d1=d2=d3=1;delay(100) ;上面的程序是一主一从 单片机之间也可以建立一个双向的通信过程/甲机程序 发送控制信号的 同时接收乙机发来的串口信息并/且显示在数码管上 #include#define uchar unsigned ch
6、ar#define uint unsigned int sbit KEY=P30;sbit ledA=P11;sbit ledB=P13;sbit ledC=P15;sbit ledstop=P16;unsigned char code duan=0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f;uchar KEY_number=0;void delay(unsigned int z)/延时函数unsigned int x,y;for(x=z;x0;x-)for(y=240;y0;y-);void init() P2=0;P0=0;SCON=0
7、x50;TMOD=0x20;PCON=0x00;TH1=0xfd;TL1=0xfd;T1=RI=0;TR1=1;EA=1;ES=1;void Put_charToSBUF(uchar c) SBUF=c;while(TI=0);TI=0;void main()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)case 0: ledstop=0; break;case 1: ledA=ledA; P
8、ut_charToSBUF(A);break;case 2: ledB=ledB; Put_charToSBUF(B); break;case 3: ledC=ledC; Put_charToSBUF(C);break;delay(100) ;void seral_int() interrupt 4if(RI)RI=0;if(SBUF=0sbit d2=P11;sbit d3=P12;sbit key=P30;uchar number;void delay(unsigned int z)/延时函数unsigned int x,y;for(x=z;x0;x-)for(y=240;y0;y-);v
9、oid init() P0=0x00;SCON=0x50;TMOD=0x20;PCON=0x00;TH1=0xfd;TL1=0xfd;RI=TI=0;TR1=1;EA=1;ES=1;void main()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;void serial_int() interrupt 4if(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 函数里完成