51单片机的之间地通信程序.docx
《51单片机的之间地通信程序.docx》由会员分享,可在线阅读,更多相关《51单片机的之间地通信程序.docx(9页珍藏版)》请在冰豆网上搜索。
![51单片机的之间地通信程序.docx](https://file1.bdocx.com/fileroot1/2022-11/28/6fd327fd-57cf-4bfb-bc92-68b6cb6cbf6c/6fd327fd-57cf-4bfb-bc92-68b6cb6cbf6c1.gif)
51单片机的之间地通信程序
以下程序通过实践检测完全可以放心使用不过注意硬件电路的连接
单片机的串口通信
主要理解SCON的状态控制寄存器的用法
波特率的设定
1两个单片机一个为主机一个为从机,又主机控制从机的LED灯得简单程序入手
注意硬件的连线将单片机串口的第二引脚与另一单片机串口的第三引脚相连同时另一单片机的第二串口引脚也与前一个单片机的第三引脚相连
主机部分的程序设计
//主机程序发送控制信号的
#include
#defineucharunsignedchar
#defineuintunsignedint
sbitKEY=P3^0;//按键
sbitledA=P1^1;//定义了三个灯来指示发送的字符是什么
sbitledB=P1^3;
sbitledC=P1^5;
sbitledstop=P1^6;
ucharKEY_number=0;//按键计数
voiddelay(unsignedintz)//延时函数
{
unsignedintx,y;
for(x=z;x>0;x--)
for(y=240;y>0;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);
}
}
从机部分的程序
#include
#defineucharunsignedchar
#defineuintunsignedint
sbitd1=P1^0;
sbitd2=P1^1;
sbitd3=P1^2;
voiddelay(unsignedintz)//延时函数
{
unsignedintx,y;
for(x=z;x>0;x--)
for(y=240;y>0;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);
}
}
上面的程序是一主一从单片机之间也可以建立一个双向的通信过程
//甲机程序发送控制信号的同时接收乙机发来的串口信息并
//且显示在数码管上
#include
#defineucharunsignedchar
#defineuintunsignedint
sbitKEY=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;x>0;x--)
for(y=240;y>0;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;
}
}
乙机部分车程序主要接收甲的串口信息同时发送字符给甲。
#include
#defineucharunsignedchar
#defineuintunsignedint
sbitd1=P1^0;
sbitd2=P1^1;
sbitd3=P1^2;
sbitkey=P3^0;
ucharnumber;
voiddelay(unsignedintz)//延时函数
{
unsignedintx,y;
for(x=z;x>0;x--)
for(y=240;y>0;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函数里完成