介绍
多机通信
独立按键选择从机
矩阵按键发送值,数码管进行显示
Proeus仿真运行图
源程序
main.c(主机)
#include<reg51.h>
#include "mine.h"
uchar LedMode[16]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x58,0x5e,0x79,0x71};
void Delaytms(uchar t)
{
uchar i,j;
for(i=0;i<130;i++)
for(j=0;j<t;j++);
}
/*串口初始化,含参可自己设定波特率*/
void UartInit(uchar baud)
{
SCON=0xd0;
TMOD=0x20;
TH1=TL1=baud;
TR1=1;
}
void Proc_key(uchar SlaveAddr)
{
Delaytms(10);
TB8=1;
SBUF=SlaveAddr;
while(TI==0);
TI=0;
TB8=0;
SBUF=GetKey();
while(TI==0);
TI=0;
}
main()
{
UartInit(0xfd);
while(1)
{
P2=0;
switch(P0)
{
case 0xfe: P2=LedMode[1];Proc_key(1);break;
case 0xfd: P2=LedMode[2];Proc_key(2);break;
case 0xfb: P2=LedMode[3];Proc_key(3);break;
default:Proc_key(0); break;
}
}
}
按键扫描(主机)
#include<reg51.h>
#include "mine.h"
uchar KeyValue=0;
uchar KeyShaoMiao[]={0xef,0xdf,0xbf,0x7f};
uchar KeyMode[]=
{
0xee,0xde,0xbe,0x7e,
0xed,0xdd,0xbd,0x7d,
0xeb,0xdb,0xbb,0x7b,
0xe7,0xd7,0xb7,0x77,
};
uchar GetKey()
{
uchar i,j;
P1=0x0f;
for(i=0;i<4;i++)
{
P1=KeyShaoMiao[i];
Delaytms(10);
if((P1&0x0f)!=0x0f)
{
for (j=0;j<16;j++)
{
if(KeyMode[j]==P1)
{
KeyValue=j;
return KeyValue;
}
}
}
}
return -1;
}
mine.h
#ifndef MINE_H
#define MINE_H
#define uchar unsigned char
#define uint unsigned int
void Delaytms(uchar t);
extern uchar GetKey();
#endif
main.c(从机)
#include<reg51.h>
#define uchar unsigned char
sbit LED=P2^3;
uchar SlaveAddr,RecvAddr;
uchar LedMode[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
void UartInit(uchar baud)
{
SCON=0xf0;
TMOD=0x20;
TH1=TL1=baud;
TR1=1;
ES=1;
EA=1;
}
main()
{
UartInit(0xfd);
P0=0x00;
P1=0xff;
SlaveAddr=~P1;
P0=LedMode[SlaveAddr];
while(1);
}
void Recv() interrupt 4
{
RI=0;
if(RB8==1)
{
RecvAddr=SBUF;
if(SlaveAddr==RecvAddr)
{
SM2=0;
LED=0;
}
else
{
LED=1;
P0=LedMode[SlaveAddr];
}
return;
}
if(SBUF!=0xff)
P0=LedMode[SBUF];
else
SM2=1;
}
Tips
创建两个工程分别编写程序,主机hex放到主机中从机hex放到从机中