找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3484|回复: 0
打印 上一主题 下一主题
收起左侧

单片机八路抢答器设计pcb源文件与源码等设计资料

[复制链接]
跳转到指定楼层
楼主
本产品模拟竞赛中抢答环节赛事,八组选手同时按下按钮只有一组通过的设计。



Altium Designer画的原理图和PCB图如下:(51hei附件中可下载工程文件)


单片机源程序如下:

  1. //八路抢答器说明:P2.7口为显示个位数码管的位选线;P2.6口为显示十位数码管的位选线        ;抢答或倒计时结束后按复位键进行下一次抢答.
  2. #include<reg52.h>
  3. #define uchar unsigned char        //宏定义
  4. #define uint  unsigned int
  5. uchar code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};        //共阳数码管段码表
  6. sbit beep=P2^4;        //蜂鸣器控制位
  7. uchar num,t1,shu,temp,shi,ge;//声明变量
  8. uint i;
  9. //延时子程序
  10. void delay(uint z)
  11. {
  12.         uint x,y;
  13.         for(x=0;x<z;x++)
  14.         for(y=0;y<110;y++);
  15. }
  16. //初始化子程序
  17. void init()
  18. {
  19.         P0=0xff;//消隐
  20.         P2=0xff;
  21.         P1=0xff;//保证抢答前P1口全为高电平(单片机检测低电平认为抢答)
  22.         temp=P1;
  23.         TMOD=0x01;        //选择定时器0为工作方式
  24.         TH0=(65536-50000)/256;//定时器装初值
  25.         TL0=(65536-50000)%256;
  26.         
  27.         EA=1;   //开总中断
  28.         ET0=1; //开定时器0
  29.         TR0=1; //启动定时器0
  30.         num=30;        //倒计时数为30
  31. }
  32. void display()//抢答倒计时显示子函数
  33. {
  34.                  shi=num/10;
  35.                 ge=num%10;
  36.                 P0=table[shi]; //显示十位        送段码
  37.                 P2=0xfe;            //送位码
  38.                 delay(2);           //延时

  39.                 P0=table[ge]; //显示个位 ,送段码
  40.                 P2=0xfd;          //送位码
  41.                 delay(2);          //延时

  42. }

  43. //主程序
  44. void main()
  45. {

  46.         init();        //调初始化
  47.         //大循环
  48.         while(1)
  49.         {
  50.                 //倒计时显示程序
  51.                 while(temp==0xff)
  52.                 {
  53.                                  
  54.                         display(); //抢答倒计时显示函数
  55.                 temp=P1;//判断之前,先把P1口的数据送给temp;
  56.                         while(temp!=0xff) //判断
  57.                                    break;
  58.                 }
  59.         
  60.                 //独立键盘扫描程序
  61.                 while(temp!=0xff)//有键按下
  62.                 {
  63.                         delay(5);//软件延时消抖
  64.                         temp=P1; //重读按键
  65.                         while(temp!=0xff)//再次确认有键按下
  66.                         {
  67.                                 temp=P1;
  68.                                 switch(temp)//判断哪个键按下
  69.                                 {
  70.                                         case 0xfe : shu=1;         //1号选手抢答成功
  71.                                             break;
  72.                                         case 0xfd : shu=2;         //2号选手抢答成功
  73.                                             break;
  74.                                         case 0xfb : shu=3;         //3号选手抢答成功
  75.                                             break;
  76.                                         case 0xf7 : shu=4;   //4号选手抢答成功
  77.                                             break;
  78.                                         case 0xef : shu=5;         //5号选手抢答成功
  79.                                             break;
  80.                                         case 0xdf : shu=6;         //6号选手抢答成功
  81.                                             break;
  82.                                         case 0xbf : shu=7;         //7号选手抢答成功
  83.                                             break;
  84.                                         case 0x7f : shu=8;         //8号选手抢答成功
  85.                                             break;
  86.                                 }
  87.                                 P0=table[shu];//显示所按下的键        ,送段码
  88.                                 P2=0xfd;        //送位码
  89.                                 beep=0;           //开蜂鸣器
  90.                                 delay(500);//有键按下时蜂鸣器响500ms
  91.                                 beep=1;                //关闭蜂鸣器
  92.                                 while(1);//进入死循环,将所按下的键显示并定格,防止有键再按下时将其覆盖;
  93.                         }
  94.                 }
  95.          }
  96. }        

  97. //定时器T0中断子函数
  98. void timer0() interrupt 1
  99. {
  100.         TH0=(65536-50000)/256;        //重赋初值,定时时间为50ms
  101.         TL0=(65536-50000)%256;
  102.         t1++;
  103.         if(t1==20)           //50ms*20=1s,1秒到
  104.         {
  105.                 t1=0;                //定时计数清0
  106.                 num--;//30秒倒计时
  107.                 if(num==0)
  108.                 {                        
  109.                         TR0=0;  //关断定时器0
  110.                         beep=0;        //开蜂鸣器
  111.                         while(1)//进入死循环防止超时抢答
  112.                         {
  113.                                 for(i=0;i<600;i++)//循环调用显示延时,同时刷新显示
  114.                                  {
  115.                                         display();   //抢答倒计时显示函数
  116.                      }
  117.                                 beep=1;          //关断蜂鸣器
  118.                         }
  119.                 }
  120.         }
  121.          
  122. }


复制代码

所有资料51hei提供下载:
8路抢答器.zip (1.96 MB, 下载次数: 52)




分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

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

本版积分规则

小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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