|
我做過類似的實(shí)驗(yàn),但只是雙機(jī)。看了你的程序和接線照片,我認(rèn)為有兩點(diǎn):
第一:程序中,主機(jī)的按鍵程序不對。按鍵這種器件,是需要消抖的,你好像有消抖的語句,但是不對嘛。
你用while是消不了抖的。你想。喊聪骆I,出現(xiàn)抖動,key1=0,但這個結(jié)果,可以有好多次的(抖動。,所以,while是不能消抖的,應(yīng)該用延時。
第二:硬件接線。應(yīng)該去掉從機(jī)的USB線,這根線會占用串口,我做實(shí)驗(yàn)時就是這樣的。應(yīng)該用四根杜邦線連接VCC、GND、P30、P31。我的板子和你一模一樣——普中的HC6800-ES-V2.0,下面是我的雙機(jī)實(shí)驗(yàn)程序,你可以試試。雙機(jī)實(shí)驗(yàn)比你的三機(jī)實(shí)驗(yàn)要簡單很多。
/*
串口實(shí)驗(yàn):單片機(jī)與單片機(jī)之間的通訊,這是主機(jī)程序
*/
#include<reg51.h>
#define LED P2
#define JP P1
unsigned char JZ;
bit AJ;
void UsartConfiguration();
void Delay10ms(unsigned int c);
void KeyDown(void);
void main()//主函數(shù)
{
UsartConfiguration();//設(shè)置串口
Delay10ms(10);
while(1)
{
KeyDown();
if (AJ==1)
{
AJ=0;
SBUF = JZ;
while (!TI);
TI = 0;
}
}
}
void UsartConfiguration()
{
SCON=0X50;
TMOD=0X20;
PCON=0X80;
TH1=0XF3;//波特率是4800的
TL1=0XF3;
TR1=1;
EA=1;
ES=1;
}
void Delay10ms(unsigned int c)//延時10ms
{
unsigned char a, b;
for (;c>0;c--)
{
for (b=38;b>0;b--)
{
for (a=130;a>0;a--);
}
}
}
void KeyDown(void)
{
unsigned char a=0;
JP=0x0f;
if(JP!=0x0f)
{
Delay10ms(1);//此處按鍵消抖
if(JP!=0x0f)
{
AJ=1;
switch(JP)
{
case(0X07): JZ=0;break;
case(0X0b): JZ=1;break;
case(0X0d): JZ=2;break;
case(0X0e): JZ=3;break;
}
JP=0Xf0;
switch(JP)
{
case(0X70): JZ=JZ;break;
case(0Xb0): JZ=JZ+4;break;
case(0Xd0): JZ=JZ+8;break;
case(0Xe0): JZ=JZ+12;break;
}
for (a=0;(a<50)&&(JP!=0xf0);a++)//松手消抖
{
Delay10ms(1);
}
}
}
}
void FSSZ(void) interrupt 4
{
RI=0;
LED=~SBUF;
Delay10ms(1);
}
/*
串口實(shí)驗(yàn):實(shí)驗(yàn)單片機(jī)與單片機(jī)通訊,此為從機(jī)程序
*/
#include<reg51.h>
#define SMG P0//數(shù)碼管
unsigned char k;
unsigned char code XSM[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,
0x77,0x7c,0x39,0x5e,0x79,0x71};//0、1、2、3、4、5、6、7、8、9、A、b、C、d、E、F的顯示碼
void UsartConfiguration();
void Delay10ms(unsigned int c);
void main()
{
UsartConfiguration();
Delay10ms(10);
while(1)
{
}
}
void UsartConfiguration()
{
SCON=0X50;
TMOD=0X20;
PCON=0X80;
TH1=0XF3;//波特率是4800的
TL1=0XF3;
TR1=1;
ES=1;
EA=1;
}
void Delay10ms(unsigned int c)//延時10ms
{
unsigned char a, b;
for (;c>0;c--)
{
for (b=38;b>0;b--)
{
for (a=130;a>0;a--);
}
}
}
void CKTX() interrupt 4
{
RI=0;
k=SBUF;
SMG=XSM[k];
SBUF=k;
while (!TI);
TI = 0;
}
程序功能是這樣的:主機(jī)通過按下矩陣鍵盤,將鍵值發(fā)給從機(jī),從機(jī)接收到后,數(shù)碼管顯示鍵值,并將鍵值發(fā)回主機(jī),主機(jī)根據(jù)這個值以二進(jìn)制方式顯示LED燈。
|
|