找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 59|回復(fù): 0
打印 上一主題 下一主題
收起左側(cè)

51單片機搶答器設(shè)計 MAX7219程序Proteus仿真圖

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:1152888 發(fā)表于 2025-6-28 14:19 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式
以單片機為核心,設(shè)計一個8位競賽搶答器:同時供8名選手或8個代表隊比賽,分別用8個按鈕S0-S7表示。
設(shè)置一個系統(tǒng)清除和搶答控制按鈕,由主持人控制。
搶答器具有鎖存與顯示功能。即選手按按鈕,鎖存相應(yīng)編號,并在優(yōu)先搶答選手的編號一直保持到主持人將系統(tǒng)清零。
搶答器具有定時搶答功能,且一次搶答的時間由主持人設(shè)定。
當主持人啟動“開始”鍵后,定時器進行減計時,同時揚聲器發(fā)出短暫的聲響,聲響持續(xù)的時間為0.5s左右。
參賽選手在設(shè)定時間內(nèi)進行搶答,搶答有效,定時器停止工作,顯示器上顯示選手的編號和搶答時間,并保持到主持人將系統(tǒng)清除為止。
如果定時時間已到,無人搶答,本次搶答無效,系統(tǒng)報警并禁止搶答,定時顯示器上顯示00.
通過按鍵改變搶答時間。



單片機源程序如下:
  1. #include "reg51.h"
  2. #include "max7219.h"
  3. sbit beep=P3^7;//蜂鳴器
  4. sbit k1=P2^0;//清零/設(shè)置
  5. sbit k2=P2^1;//開始

  6. uint beep_time=0;//蜂鳴器延時
  7. uchar mode=0;//模式,0復(fù)位,1開始,2設(shè)置,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)//復(fù)位
  32.                         {
  33.                                 mode=0;//復(fù)位模式
  34.                                 miao=miao_set;//復(fù)位倒計時
  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)//復(fù)位狀態(tài)
  44.                 {
  45.                         if(!k2)//開始
  46.                         {
  47.                                 mode=1;//開始模式
  48.                                 miao=miao_set;
  49.                                 beep_time=500;//啟動蜂鳴器
  50.                                 while(!k2);
  51.                         }
  52.                         if(!k1)//設(shè)置時間
  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;        //蜂鳴器取反,產(chǎn)生500HZ頻率
  148.         }
  149.         else
  150.                 beep=1;                //關(guān)閉蜂鳴器
  151. }
復(fù)制代碼
  1. #include "max7219.h"
  2. #include "intrins.h"
  3. //數(shù)碼管地址從1到8
  4. void max_send_byte(uchar addr,uchar i) //發(fā)送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設(shè)置數(shù)碼管個數(shù)
  37. void max_init(uchar i)
  38. {
  39.         max_send_byte(0x0b,i);//設(shè)置個數(shù)
  40.     max_send_byte(0x09,0xff);//譯碼方式
  41.         max_send_byte(0x0a,0x0f);//最亮
  42.         max_send_byte(0x0c,0x01);//開啟顯示
  43.         max_send_byte(0x00,0x00);//關(guān)閉測試功能
  44. }

復(fù)制代碼

仿真程序:
資料.7z (2.96 MB, 下載次數(shù): 0)

評分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機教程網(wǎng)

快速回復(fù) 返回頂部 返回列表