|
现做两单片机之间的串行通信仿真实验,当我用共阴极LED时,其显示发生错误,但是当我换成共阳极LED时,其显示正确。用共阴极或共阳极时,其显示段码也换成相应的显示段码。段码应该没有错,因为我用它做LED静态或动态显示时是正确的。
代码如下:
发送程序:
#include
#include
#define uchar unsigned char;
//uchar code collect[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71}; //共阴极显示段码
uchar code collect[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E}; //共阳极显示段码
uchar pf;
void delay();
void initial();
void sendd();
void main()
{
initial();
while(1)
{
sendd();
}
}
//延时子程序
void delay()
{
long k;
for(k=0;k<10000;k++)
{
}
}
//串行口初始化
void initial()
{
TMOD=0x20; //定时器工作于方式2
TH1=0xE8;
TL1=0xE8;
TR1=1; //启动T1
PCON=0x00;
SCON=0x50; //串行口工作在方式1,允许串行接收
}
//发送数据
void sendd()
{
int i;
do //建立串行通信之间连接
{
SBUF=0xaa; //发送联络信号
while(TI==0); //等待发送数据
TI=0;
while(RI==0); //等待对方应答
RI=0;
}while((SBUF^0xbb)!=0);
do
{
pf=0; //校验和初始化
for(i=0;i<16;i++) //连续发送一数组
{
SBUF=collect;
P0=collect; //显示需要发送的数据
pf=pf+collect; //求校验和
while(TI==0);
TI=0;
delay();
}
SBUF=pf;
while(TI==0); //发送校验信息
TI=0;
while(RI==0); //接收反馈信息
RI=0;
}while(SBUF!=0x00);
}
接收程序:
#include
#include
#define uchar unsigned char;
uchar pf;
void initial()
{
TMOD=0x20; //定时器工作于方式2
TH1=0xE8;
TL1=0xE8;
TR1=1; //启动T1
PCON=0x00;
SCON=0x50; //串行口工作在方式1,允许串行接收
}
void main()
{
int i;
initial();
do
{
while(RI==0); //接收字符
RI=0;
}while((SBUF^0xaa)!=0);
SBUF=0xbb;
while(TI==0); //发送确认字符
TI=0;
while(1) //循环接收
{
pf=0;
for(i=0;i<16;i++) //连续接收10个字符
{
while(RI==0);
RI=0;
P0=SBUF; //显示接收到的字符
pf=pf+SBUF; //求校验和
}
while(RI==0); //接收校验和
RI=0;
if((SBUF^pf)==0)
{
SBUF=0x00; //校验正确发送“0x00”
while(TI==0);
TI=0;
}
else
{
SBUF=0xff;
while(TI==0);
TI=0;
}
}
}
原理图如下:
|
|