甲乙AB二个单片机相互通信控制LED灯
/*两片8051单片机串口都工作在模式1,甲机对乙机完成以下4项控制:
1.甲机发送“A”,控制乙机LED1闪烁;
2.甲机发送“B”,控制乙机LED2闪烁;
3.甲机发送“C”,控制乙机LED1,LED2同时闪烁:
4.甲机停止发送任何命令字符,则乙机的两只LED均停止闪烁。

///////
1.设置串口模式(SCON):
2.设置定时器1的工作方式(TMOD);
3.计算定时器1的初值(TH1/TL1);
4.启动定时器1(TR1);
5.如果串口工作在中断方式,还必须设置IE允许ES中断,并编写中断例程。
本例甲机程序中设SCON=0x40(即01000000),乙机程序则设SCON=0x50(即01010000),
两者都将串口设为模式1,但后者还将REN(允许接收)位设为1,因为乙机要接收串口数据,
而甲机不需要接收数据,当然,两者都设SCON为0x50也不会影响程序运行*/
#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
sbit LED1=P2^0;
sbit LED2=P2^1;
sbit an_jian=P1^0;
//延时
void yan_shi(uint ms)
{
uchar i;
while(ms--)for(i=0;i<120;i++);
}
//串口发送字符
void chuankou_fusong(char c)
{
SBUF=c;
while(TI==0);//等待发送完成
TI=0;
}
//主程序
//pcon寄存器指功率控制寄存器,其包含SMOD,SMOD0,LVDF,POF,GF1,GF0,PD,IDL等控制位,
//SMOD :波特率加倍位。SMOD=1时,串行口波特率加倍;SMOD=0时,波特率正常。
//SMOD0:帧错误检测有效控制位。当SMOD0=1,SCON寄存器中的SM0/FE位用于FE(帧错误检测)功能;
//当SMOD0=0,SCON寄存器中的SM0/FE位用于SM0功能,和SM1一起指定串行口的工作方式。复位时SMOD0=0
//·PD:掉电模式设定位。PD=1时,单片机进入掉电模式;PD=0时,单片机正常工作。
//·IDL:空闲模式设定位。IDL=1时,单片机进入空闲模式;IDL=0时,单片机正常工作。
void main()
{
uchar op=0;
SCON=0X40;//10位异步收发,波特率由定时器控制;
TMOD=0X20;//TR1:定时器T1的运行控制位
PCON=0X00;//波特率不倍增
TH1=0XFD;//波特率9600
TL1=0XFD;
TI=0;
TR1=1;//TR1:定时器T1的运行控制位
while(1)
{
if(an_jian==0)
{
while(an_jian==0);
op=(op+1)%4;
}
switch (op)
{
case 0:LED1=LED2=1;break;
case 1:chuankou_fusong('A');
LED1=~LED1;LED2=1;break;
case 2:chuankou_fusong('B');
LED2=~LED2;LED1=1;break;
case 3:chuankou_fusong('C');
LED1=~LED1; LED2=LED1;break;
}
yan_shi(100);
}
}
//////////////////////////////////
//B机程序接收到A发送字符完成相应的动作
//B机接收到A机发送的信号,根据相应信号控制LED完成不同的闪烁动动
#includeinclude<reg51.h>
#define uchar unsigned char
#define uint unsigned int
sbit LED1=P2^0;
sbit LED2=P2^1;
//延时程序
void yan_shi(uint ms)
{
uchar i,j;
for(i=0;i
}
//主程序
void main()
{
SCON=0X50;// SM0 SM1=01,模式2,REN(位4):接收使能控制位,1允许接
TMOD=0X20;// TR1:定时器T1的运行控制位
TH1=0XFD;//波特率9600
TL1=0XFD;
RI=0;//TI(位1):发送完成中断标志,1表示发送完成需软件清零
TR1=1;//启动定时器T1
LED1=LED2=1;
while(1)
{
if(RI)//判断是否收到数据
{
RI=0;//收完收据后,RI需要手动清零
switch (SBUF)
{
case 'A':LED1=~LED1;LED2=1;break;
case 'B':LED2=~LED2;LED1=1;break;
case 'C':LED1=~LED1;LED2=LED1;
}
}
else LED1=LED2=1;//没接收到,LED灯关闭
yan_shi(100);
}
}
通过网盘分享的文件:甲乙单片机想到控制LED灯
链接: https://pan.baidu.com/s/16RhCFYKOBGLy_2uc4rL1lg 提取码: 36r4








最新发布