OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 13268|回复: 11

很早很早的时候做的一个8路遥控抢答器,用51做的

[复制链接]

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165309
金钱
165309
注册时间
2010-12-1
在线时间
2108 小时
发表于 2011-1-9 15:10:28 | 显示全部楼层 |阅读模式
     大二刚刚学51的时候,帮兄弟学院做了一个8路抢答器,用了一个超大的数码管(4寸),有遥控控制,比较简单。
    上图:









    最后,放源码:
#include <reg51.h>    
#define LED P2  //宏定义,使用LED代替P3口(相当于LED=P3)
#define uchar unsigned char //用uchar代替unsigned char方便操作
#define uint unsigned int
sbit beep=P2^7;//蜂鸣器
sbit BG=P3^7;//指示灯
sbit key4=P1^0;//按键D
sbit key2=P1^1;//按键B
sbit key1=P1^2;//按键A
sbit key3=P1^3;//按键C
bit time_over=0;//倒计时结束标记         
bit WARNING=0;//倒数十秒控制变量
bit INT_ON=0;//中断标记
bit key_down=0;//键盘辅助变量
uchar RIGHT=0xff;//按键暂存器   
uchar CONT=0;  //定时器辅助变量
uchar res_time=0;//时间
uchar set_time=30;
uchar leds[17]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,
    0x90,0x88,0x83,0xa7,0xa1,0x86,0x8e,0xff};
/*------------------time ms延时函数-----------------*/
void delay_ms(uint time)
{
 uchar tres;
 for(;time>0;time--)
 {
  tres=150;
  while(tres--);
 }

//外部中断1初始化程序
void Init_Sys() //中断初始化函数
{
 TCON=0x00; //外部中断1低电平触发
 TMOD=0X01;   //定时器0方式1    
 IE=0x86; //开启外部中断1,定时器中断0,及总中断 10000110B
 IP=0X04; //外部中断优先级高于定时器
 CONT=0;  //时间清零
 res_time=0; 
}  
//外部中断1处理程序
void  exint1_int() interrupt 2 using 0
{   
 uchar t=200;            
 EA=0;//关中断
 TR0=0;//关定时器
 WARNING=0;//关警告
 while(t--)beep=0;//软件延时,消除抖动
 RIGHT=P0; //获得按键值  
 INT_ON=1; //标记中断   
}
//定时器0中断处理程序
void count_int() interrupt 1 using 1

 TH0=0X4C;//重新装载
 TL0=0X00; 
 CONT++;
 if(CONT==20)
 {
  CONT=0;
  if(res_time==0)time_over=1;
  res_time--;    
 }
}    
//遥控按键扫描程序
uchar key_scan(void)
{     
 1=0xff;
 if(key1==1||key2==1||key3==1||key4==1)
 {
  if(!key_down)
  { 
   delay_ms(10);  //延时
   key_down=1;   //限制
   if(key1==1)return 1;//按键A
   if(key2==1)return 2;//按键B
   if(key3==1)return 3;//按键C
   if(key4==1)return 4;//按键D
  }
  else return 0;    
 }
 else if(key_down)key_down=0;//消除限制 
 return 0; //未获得任何按键 
}  
uchar juder(void)
{     
 switch(RIGHT)
 {
  case 0xff:return 0;
  case 0xfe:return 1;
  case 0xfd:return 2;
  case 0xfb:return 3;
  case 0xf7:return 4; 
  case 0xef:return 5;
  case 0xdf:return 6;
  case 0xbf:return 7;
  case 0x7f:return 8;
  default:return 14;//E,错误 
 }
}
//显示答案
void show_answer(void)
{
 uchar ti=0;
 uchar key=0;
 while(1)
 {
  key=key_scan();
  if(ti==100){BG=!BG;ti=0;}
  if(key!=0)
  {
   LED=leds[key+9];//显示答案
   BG=1;//灭灯
   break;
  }
  ti++;
  delay_ms(1);
 }
}
void BELL(uchar times)
{
 while(times--)
 {
  beep=0;
  delay_ms(100);
  beep=1;
  delay_ms(100);
 }
}
//清除显示
void clear(void)
{
 EA=0;   //关掉计时器
 beep=0;   //开蜂鸣器
 WARNING=0; //清警告标记
 time_over=0;//清溢出标记   
 TR0=0;   //关定时器 
 INT_ON=0;//清除中断标记
 TL0=0X00;//初始值设置
 TH0=0X4C;
 CONT=0;
 res_time=set_time;//赋初始值
 delay_ms(100);
 LED=leds[16];//清屏,同时关蜂鸣器 
 BG=1;//关灯
}
void debug(void)//处理犯规队,显示犯规队队号
{     
 RIGHT=P0;//获得犯规队的地址
 LED=leds[juder()];//显示队号
 BELL(4); 
}
//开启抢答器
//1普通模式
//0倒计时模式
void start(uchar type)
{
 bit alarm=1;//提示音      
 uchar key=0;   
 res_time=set_time;//获取初始值
 while(1)
 { 
  key=key_scan();//扫描键盘
  if(key!=0)
  {       
   switch(key)
   {
    case 1://显示答案
    {
     clear();//清除
     show_answer();
     break;
    }
    case 2://开始抢答
    {         
     if(P0!=0XFF)
     {
      debug();//处理犯规
      break;
     }   
     if(!type)TR0=1; //倒计时方式 
     else    //普通方式
     {
      clear();
      BG=0;//开灯指示
     }
     EA=1;//使能中断   
     break;
    }
    case 3:clear();break;//清除
    case 4:return;//返回
   }   
  }
  if(TR0==1)//倒计时
  {         
   if(CONT==0&&BG)
   {    
    if(res_time>=10)LED=leds[res_time/10];        
    BG=0;//每秒钟闪烁一次
    if(WARNING)alarm=0;//最后十秒  
   }
   if(CONT==10&&!BG)
   {   
    BG=1;      
    if(WARNING)alarm=1;//最后十秒
    else LED=leds[res_time%10];//显示个位数据;
   }           
   if(res_time<10)//最后十秒标记
   {
    WARNING=1;
    LED=leds[res_time];
   } 
   beep=alarm;
   delay_ms(5);     
  }
  if(time_over) //倒计时结束处理
  {
   clear();
   LED=leds[0];
   time_over=0;
   BELL(3);
  } 
  if(INT_ON)//有选手按下
  {
   TR0=0;//关定时器 
   beep=0;//开提示音
   BG=1;//关灯
   delay_ms(100);
   INT_ON=0;
   LED=leds[juder()];//显示选手号
  }        
 }
}         
void main()
{  
 bit set=0;//设置状态标记
 bit model=1; //模式标记
 uchar key;
 Init_Sys();//初始化外部中断 1 捕获按键输入
 0=0XFF;
 TR0=1;//开启定时器0    
  while(1)//死循环
 {  
  key=key_scan();
  if(key!=0)
  { 
   if(!model)switch(key)
   {
    case 1:
    {    
     set=1;
     set_time+=10;
     if(set_time>90)set_time=10;
     break;
    }
    case 3:
    {
     set=1;
     if(set_time>10)set_time-=10;//范围限制
     else set_time=90;
     break;
    }  
   }
   if(key==2)
   {
    start(model);//开始抢答
    set=0;//非设置状态
   }
   if(key==4)
   {
    model=!model;//模式切换
    set=0;   //非设置状态
   }
  }
  if(model)LED=leds[14];
  else
  {
   if(set)LED=leds[set_time/10];//显示设置时间
   else LED=leds[15];
  }             
 }
}
    详细说明文档见附件。
 


 






抢答器.rar

1.01 MB, 下载次数: 1557

我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

7

主题

17

帖子

0

精华

初级会员

Rank: 2

积分
81
金钱
81
注册时间
2011-3-23
在线时间
3 小时
发表于 2011-9-2 10:02:22 | 显示全部楼层
厉害,你可不是在做实验呀,是在产品呢
穷毕生之精力,兴中华之科技
回复 支持 反对

使用道具 举报

11

主题

94

帖子

0

精华

初级会员

Rank: 2

积分
158
金钱
158
注册时间
2012-9-25
在线时间
0 小时
发表于 2013-1-14 16:10:44 | 显示全部楼层
顶一个。
回复 支持 反对

使用道具 举报

0

主题

5

帖子

0

精华

新手上路

积分
25
金钱
25
注册时间
2013-1-21
在线时间
0 小时
发表于 2013-1-21 20:13:43 | 显示全部楼层
支持~
回复 支持 反对

使用道具 举报

0

主题

23

帖子

0

精华

新手上路

积分
43
金钱
43
注册时间
2013-3-3
在线时间
0 小时
发表于 2013-3-5 16:44:13 | 显示全部楼层
顶一个,楼主强大,菜鸟学习一下!
选择了就不要后悔!
回复 支持 反对

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
21
金钱
21
注册时间
2013-5-5
在线时间
0 小时
发表于 2013-5-5 20:16:33 | 显示全部楼层
佩服!
回复 支持 反对

使用道具 举报

3

主题

62

帖子

0

精华

初级会员

Rank: 2

积分
95
金钱
95
注册时间
2013-7-18
在线时间
0 小时
发表于 2013-8-29 18:48:03 | 显示全部楼层
不错
回复 支持 反对

使用道具 举报

2

主题

17

帖子

0

精华

新手上路

积分
45
金钱
45
注册时间
2013-9-7
在线时间
0 小时
发表于 2013-9-7 08:54:51 | 显示全部楼层
刚学51,下来看看吧,谢谢
回复 支持 反对

使用道具 举报

10

主题

28

帖子

0

精华

初级会员

Rank: 2

积分
88
金钱
88
注册时间
2014-1-14
在线时间
0 小时
发表于 2014-2-15 16:27:53 | 显示全部楼层
原子哥你好,想问你几个问题想向您请教:1.你的4寸的数码管是用多少伏电压供电的,51能直接驱动么?
                                                         2.如果不是用单片机直接驱动,那你的驱动电路能否分享一下?
                                                          3.你的抢答器的外部原件:按键,线,和那个插头学名是什么,在网上买的还是在电子市场买的?
                                                         4.你用来包装数码管的盒子上哪能购买到,谢谢?、
                            我现在也是大二,我们协会也让我做抢答器,嘻嘻
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165309
金钱
165309
注册时间
2010-12-1
在线时间
2108 小时
 楼主| 发表于 2014-2-15 21:19:32 | 显示全部楼层
回复【9楼】 pc__小强 :
---------------------------------
1,不记得了,你得买个实物测试下.
2,电路见附件.
3,这都是直接去电子市场找的.学名我也没...
4,电子市场.

抢答器.rar

63.77 KB, 下载次数: 526

我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

0

主题

25

帖子

0

精华

初级会员

Rank: 2

积分
103
金钱
103
注册时间
2014-4-29
在线时间
18 小时
发表于 2014-8-4 10:38:36 | 显示全部楼层
好厉害哦,,
回复 支持 反对

使用道具 举报

0

主题

3

帖子

0

精华

新手入门

积分
23
金钱
23
注册时间
2013-3-20
在线时间
0 小时
发表于 2014-9-1 09:33:20 | 显示全部楼层
很棒,顶一个
相信自己的付出,会得到相应的回报
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-22 16:47

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表