单片机实验——十六路抢答器 ,抢答器是一种应用十分广泛的设备,在各种竞赛、抢答场合中,它能迅速、客观地分辨出最先获得发言权的选手。本设计采用矩阵键盘节省输入的I/O口,带有奇偶校验的双单片通信。

1.实验内容与要求

抢答器是一种应用十分广泛的设备,在各种竞赛、抢答场合中,它能迅速、客观地分辨出最先获得发言权的选手。本设计采用矩阵键盘节省输入的I/O口,带有奇偶校验的双单片通信,确保发送的正确接收,参考电路如下:

2.设计要求:

  1. 用矩阵键盘代表16个参赛者的按键。
  2. 当按下按键后LED1显示是哪位参赛者抢答成功。
  3. 同时发送给接收机,接收机也显示出收到抢答者编号。
  4. 接收方有奇偶校验,若校验出错,指示灯亮,提醒接收出错。

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

现象以此类推。

  • 2
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

杪商柒

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值