1.实验内容与要求
抢答器是一种应用十分广泛的设备,在各种竞赛、抢答场合中,它能迅速、客观地分辨出最先获得发言权的选手。本设计采用矩阵键盘节省输入的I/O口,带有奇偶校验的双单片通信,确保发送的正确接收,参考电路如下:
2.设计要求:
- 用矩阵键盘代表16个参赛者的按键。
- 当按下按键后LED1显示是哪位参赛者抢答成功。
- 同时发送给接收机,接收机也显示出收到抢答者编号。
- 接收方有奇偶校验,若校验出错,指示灯亮,提醒接收出错。
2.1系统组成
两个AT89C51单片机,十六个按键分别对应0~F,表示十六个用户。LED灯表示传送的数据是否有误;
3.模块功能及代码
3.1发送端单片机代码
#include<reg51.h>
#define uchar unsigned char
char code map[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,0x58,0x5e,0x79,0x71};
char buf[]={0xee,0xde,0xbe,0x7e,0xed,0xdd,0xbd,0x7d,0xeb,0xdb,0xbb,0x7b,0xe7,0xd7,0xb7,0x77};
void delay(unsigned int time){
uchar i;
for(;time>0;time--)
for(i=0;i<125;i++);
}
char getkey(){
char scan[]={0xef,0xdf,0xbf,0x7f};
char i=0,j=0;
for(i=0;i<4;i++){
P1=scan[i];
for(j=0;j<16;j++){
if(buf[j] == P1){
return j;
}
}
}
return -1;
}
void main(void)
{
uchar key=0;
PCON=0X80;
SCON=0X90;
while(1)
{
ACC=key;
TB8=P;
key=getkey();
SBUF=key;
while(TI==0);
TI=0;
while(RI==0);
RI=0;
if(RB8==0)
{
P2=map[key];
if(++key>9)
key=0;
delay(500);
}
}
}
3.2接收端单片机代码
#include<reg51.h>
#define uchar unsigned char
sbit P1_0=P1^0;
char code map[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,0x58,0x5e,0x79,0x71};
void delay(unsigned int time){
uchar j;
for(;time>0;time--)
for(j=0;j<125;j++);
}
void main(void)
{
uchar re;
PCON=0X80;
SCON=0X90;
while(1)
{
while(RI==1){
RI=0;
re=SBUF;
ACC=re;
if(RB8==P)
TB8=0;
else
TB8=1;
SBUF=re;
while(TI==0);
TI=0;
P2=map[re];
}
if(re<=9||re>16){
P1_0=1;
}else if(re>9&&re<=16){
P1_0=0;
}
}
}
4.运行效果
4.1 按0
4.2 按1
4.3 按2
现象以此类推。