1.Proteus 8
2.Kile c51
发送端
#include<reg51.h>
#include<stdio.h>
#define uint unsigned int
#define uchar unsigned char
uint code num[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e}; //数码管的数字0-f共阳
uchar code mum[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//共阴 1-f不带小数点
uchar code mum1[]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef};//共阴 1-9带小数点
uchar code kk[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};// 控制第几个数码管1-8
sbit p=PSW^0; //p定为pws寄存器的第0位 ,即奇偶效验位
void det() //延时函数
{
uint i=0;
TMOD=0x02; //方式2 T0
TH0=0x06;
TL0=0x06;
TR0=1;
while(1)
{
while(TF0==1)
{
i++;
if(i==40) //1s 250*4000=1000000us=1s
{
break;
}
}
}
}
void chaxun() ///判断1-16键 确定位置
{
uchar a,b,c;
P1=0xf0;
a=P1;
P1=0x0f;
b=P1;
a=a|b;
if(a==0xee)
{
P2=mum[0];
c=P2;
TB8=p;
SBUF=c;
while(TI==0);
;
TI=0;
}
else if(a==0xde)
{
P2=mum[1];
c=P2;
TB8=p;
SBUF=c;
while(TI==0);
;
TI=0;
}
else if(a==0xbe)
{
P2=mum[2];
c=P2;
TB8=p;
SBUF=c;
while(TI==0);
;
TI=0;
}
else if(a==0x7e)
{
P2=mum[3];
c=P2;
TB8=p;
SBUF=c;
while(TI==0);
;
TI=0;
}
else if(a==0xed)
{
P2=mum[4];
c=P2;
TB8=p;
SBUF=c;
while(TI==0);
;
TI=0;
}
else if(a==0xdd)
{
P2=mum[5];
c=P2;
TB8=p;
SBUF=c;
while(TI==0);
;
TI=0;
}
else if(a==0xbd)
{
P2=mum[6];
c=P2;
TB8=p;
SBUF=c;
while(TI==0);
;
TI=0;
}
else if(a==0x7d)
{
P2=mum[7];
c=P2;
TB8=p;
SBUF=c;
while(TI==0);
;
TI=0;
}
else if(a==0xeb)
{
P2=mum[8];
c=P2;
TB8=p;
SBUF=c;
while(TI==0);
;
TI=0;
}
else if(a==0xdb)
{
P2=mum[9];
c=P2;
TB8=p;
SBUF=c;
while(TI==0);
;
TI=0;
}
else if(a==0xbb)
{
P2=mum[10];
c=P2;
TB8=p;
SBUF=c;
while(TI==0);
;
TI=0;
}
else if(a==0x7b)
{
P2=mum[11];
c=P2;
TB8=p;
SBUF=c;
while(TI==0);
;
TI=0;
}
else if(a==0xe7)
{
P2=mum[12];
c=P2;
TB8=p;
SBUF=c;
while(TI==0);
;
TI=0;
}
else if(a==0xd7)
{
P2=mum[13];
c=P2;
TB8=p;
SBUF=c;
while(TI==0);
;
TI=0;
}
else if(a==0xb7)
{
P2=mum[14];
c=P2;
TB8=p;
SBUF=c;
while(TI==0);
;
TI=0;
}
else if(a==0x77)
{
P2=mum[15];
c=P2;
TB8=p;
SBUF=c;
while(TI==0);
;
TI=0;
}
}
void recive()
{
uint a,b,c;
while(RI==0);
RI=0;
a=SBUF;
if(a==0x00)
{
}
}
void main()
{
uint i,j;
SCON=0xd0; //串行口初始化为 方式3
ES=1; //允许串行口中断
EA=1; //允许全局中断
PCON=0x00; /// SMOD=0;
TMOD=0x20; //T1 工作在方式2
TH1=0xf4; //初值定义
TL1=0xf4;
TR1=1; //开始计时
while(1)
{
chaxun();
recive();
}
}
接收端
#include<reg51.h>
#include<stdio.h>
#define uint unsigned int
#define uchar unsigned char
uint code num[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e}; //数码管的数字0-f共阳
uchar code mum[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//共阴 1-f不带小数点
uchar code mum1[]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef};//共阴 1-9带小数点
uchar code kk[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};// 控制第几个数码管1-8
sbit p=PSW^0;
void det() //延时函数
{
uint i=0;
TMOD=0x02; //方式2 T0
TH0=0x06;
TL0=0x06;
TR0=1;
while(1)
{
while(TF0==1)
{
i++;
if(i==40) //1s 250*4000=1000000us=1s
{
break;
}
}
}
}
uchar receive()
{
uchar a,c;
while(RI==0);
;
RI=0;
ACC=SBUF;
if(RB8==p)
{
c=ACC;
///
a=0x00;
TB8=p;
SBUF=a;
while(TI==0);
TI=0;
//
return c;
}
/*
else
{
c=ACC;
return c;
}
*/
}
int main()
{
uint i,j,c;
SCON=0xd0; //串行口初始化为 方式3
ES=1; //允许串行口中断
EA=1; //允许全局中断
PCON=0x00; /// SMOD=0;
TMOD=0x20; //T1 工作在方式2
TH1=0xf4; //初值定义
TL1=0xf4;
TR1=1; //开始计时
REN=1;
while(1)
{
P2=receive();
}
}
知识在书上都有!