找回密码
 立即注册

QQ登录

只需一步,快速开始

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

51单片机抢答器设计 MAX7219程序Proteus仿真图

[复制链接]
跳转到指定楼层
楼主
以单片机为核心,设计一个8位竞赛抢答器:同时供8名选手或8个代表队比赛,分别用8个按钮S0-S7表示。
设置一个系统清除和抢答控制按钮,由主持人控制。
抢答器具有锁存与显示功能。即选手按按钮,锁存相应编号,并在优先抢答选手的编号一直保持到主持人将系统清零。
抢答器具有定时抢答功能,且一次抢答的时间由主持人设定。
当主持人启动“开始”键后,定时器进行减计时,同时扬声器发出短暂的声响,声响持续的时间为0.5s左右。
参赛选手在设定时间内进行抢答,抢答有效,定时器停止工作,显示器上显示选手的编号和抢答时间,并保持到主持人将系统清除为止。
如果定时时间已到,无人抢答,本次抢答无效,系统报警并禁止抢答,定时显示器上显示00.
通过按键改变抢答时间。



单片机源程序如下:
  1. #include "reg51.h"
  2. #include "max7219.h"
  3. sbit beep=P3^7;//蜂鸣器
  4. sbit k1=P2^0;//清零/设置
  5. sbit k2=P2^1;//开始

  6. uint beep_time=0;//蜂鸣器延时
  7. uchar mode=0;//模式,0复位,1开始,2设置,3停止,4超时错误
  8. uchar sec=0,miao=10,miao_set=10;//倒计时
  9. uchar num=0;

  10. void main()
  11. {
  12.         TMOD|=0X01;
  13.         TH0=0X3C;
  14.         TL0=0XB0;
  15.         TH1=0XFC;
  16.         TL1=0X18;
  17.         ET1=1;        
  18.         ET0=1;//打开定时器0中断允许
  19.         EA=1;//打开总中断
  20.         TR0=1;//打开定时器
  21.         TR1=1;
  22.         max_init(4);
  23.         max_send_byte(1,miao/10);//初始化显示
  24.         max_send_byte(2,miao%10);
  25.         max_send_byte(3,num/10);
  26.         max_send_byte(4,num%10);
  27.         while(1)
  28.         {
  29.                 if(mode>2)//开始模式
  30.                 {
  31.                         if(!k1)//复位
  32.                         {
  33.                                 mode=0;//复位模式
  34.                                 miao=miao_set;//复位倒计时
  35.                                 num=0;
  36.                                 max_send_byte(1,miao/10);//显示
  37.                                 max_send_byte(2,miao%10);
  38.                                 max_send_byte(3,num/10);
  39.                                 max_send_byte(4,num%10);
  40.                                 while(!k1);
  41.                         }
  42.                 }
  43.                 if(mode==0)//复位状态
  44.                 {
  45.                         if(!k2)//开始
  46.                         {
  47.                                 mode=1;//开始模式
  48.                                 miao=miao_set;
  49.                                 beep_time=500;//启动蜂鸣器
  50.                                 while(!k2);
  51.                         }
  52.                         if(!k1)//设置时间
  53.                         {
  54.                                 if(miao_set<30)
  55.                                         miao_set++;
  56.                                 else
  57.                                         miao_set=0;
  58.                                 max_send_byte(1,miao_set/10);//显示
  59.                                 max_send_byte(2,miao_set%10);
  60.                                 while(!k1);
  61.                         }
  62.                 }
  63.                 if(mode==1)//抢答模式
  64.                 {
  65.                         switch(P1)
  66.                         {
  67.                                 case 0xfe:mode=3;num=1;//选手1
  68.                                         max_send_byte(3,num/10);//显示
  69.                                         max_send_byte(4,num%10);
  70.                                         beep_time=3000;//启动蜂鸣器
  71.                                         break;
  72.                                 case 0xfd:mode=3;num=2;//选手2
  73.                                         max_send_byte(3,num/10);//显示
  74.                                         max_send_byte(4,num%10);
  75.                                         beep_time=3000;//启动蜂鸣器
  76.                                         break;
  77.                                 case 0xfb:mode=3;num=3;//选手3
  78.                                         max_send_byte(3,num/10);//显示
  79.                                         max_send_byte(4,num%10);
  80.                                         beep_time=3000;//启动蜂鸣器
  81.                                         break;
  82.                                 case 0xf7:mode=3;num=4;//选手4
  83.                                         max_send_byte(3,num/10);//显示
  84.                                         max_send_byte(4,num%10);
  85.                                         beep_time=3000;//启动蜂鸣器
  86.                                         break;
  87.                                 case 0xef:mode=3;num=5;//选手5
  88.                                         max_send_byte(3,num/10);//显示
  89.                                         max_send_byte(4,num%10);
  90.                                         beep_time=3000;//启动蜂鸣器
  91.                                         break;
  92.                                 case 0xdf:mode=3;num=6;//选手6
  93.                                         max_send_byte(3,num/10);//显示
  94.                                         max_send_byte(4,num%10);
  95.                                         beep_time=3000;//启动蜂鸣器
  96.                                         break;
  97.                                 case 0xbf:mode=3;num=7;//选手7
  98.                                         max_send_byte(3,num/10);//显示
  99.                                         max_send_byte(4,num%10);
  100.                                         beep_time=3000;//启动蜂鸣器
  101.                                         break;
  102.                                 case 0x7f:mode=3;num=8;//选手8
  103.                                         max_send_byte(3,num/10);//显示
  104.                                         max_send_byte(4,num%10);
  105.                                         beep_time=3000;//启动蜂鸣器
  106.                         }
  107.                 }
  108.         }
  109. }
  110. void Timer0() interrupt 1//定时器中断
  111. {
  112.         TH0=0X3C;//重装50ms
  113.         TL0=0XB0;
  114.         if(mode==1)//开始模式
  115.         {
  116.                 if(sec<20) //计时1s
  117.                         sec++;
  118.                 else
  119.                 {
  120.                         sec=0;
  121.                         if(miao>0)//倒计时
  122.                         {
  123.                                 miao--;
  124.                                 max_send_byte(1,miao/10);//显示
  125.                                 max_send_byte(2,miao%10);
  126.                         }
  127.                         else
  128.                         {
  129.                                 mode=4;//超时
  130.                                 num=0;
  131.                                 beep_time=3000;
  132.                                 max_send_byte(1,miao/10);//显示
  133.                                 max_send_byte(2,miao%10);
  134.                                 max_send_byte(3,num/10);//显示
  135.                                 max_send_byte(4,num%10);
  136.                         }
  137.                 }
  138.         }
  139. }

  140. void Timer1() interrupt 3//定时器1中断
  141. {
  142.         TH1=0XFC;           //重装定时器
  143.         TL1=0X18;
  144.         if(beep_time>0)//蜂鸣器响
  145.         {
  146.                 beep_time--;//蜂鸣器计时减一
  147.                 beep=!beep;        //蜂鸣器取反,产生500HZ频率
  148.         }
  149.         else
  150.                 beep=1;                //关闭蜂鸣器
  151. }
复制代码
  1. #include "max7219.h"
  2. #include "intrins.h"
  3. //数码管地址从1到8
  4. void max_send_byte(uchar addr,uchar i) //发送i到addr
  5. {
  6.         uchar k=0;
  7.         uchar a;
  8.         a=addr;
  9.         max_load=0;
  10.         for(k=0;k<8;k++)
  11.         {
  12.                 if((a & 0x80)>0)
  13.                         max_din=1;
  14.                 else
  15.                         max_din=0;
  16.                 a<<=1;
  17.                 max_clk=0;
  18.                 _nop_();
  19.                 max_clk=1;
  20.         }
  21.         a=i;
  22.         for(k=0;k<8;k++)
  23.         {
  24.                 if((a & 0x80)>0)
  25.                         max_din=1;
  26.                 else
  27.                         max_din=0;
  28.                 a<<=1;
  29.                 max_clk=0;
  30.                 _nop_();
  31.                 max_clk=1;
  32.         }
  33.         max_load=1;
  34. }
  35. //初始化
  36. //i设置数码管个数
  37. void max_init(uchar i)
  38. {
  39.         max_send_byte(0x0b,i);//设置个数
  40.     max_send_byte(0x09,0xff);//译码方式
  41.         max_send_byte(0x0a,0x0f);//最亮
  42.         max_send_byte(0x0c,0x01);//开启显示
  43.         max_send_byte(0x00,0x00);//关闭测试功能
  44. }

复制代码

仿真程序:
资料.7z (2.96 MB, 下载次数: 0)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

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

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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