久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

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 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 欧美不卡视频 | 国产精品伦一区二区三级视频 | 波多野结衣一区二区 | 888久久久| 国产精品久久久久久久久久尿 | 亚洲精品91 | 亚洲不卡av在线 | 日韩在线视频免费观看 | 国产高清在线 | 国产一区二区精 | 日韩成人在线播放 | 在线视频一区二区三区 | 国产一区二区三区四区五区3d | 久久噜噜噜精品国产亚洲综合 | 一区二区三区免费观看 | 精品一区二区三区四区 | 亚洲视频精品 | 国产精品国产精品国产专区不卡 | 欧美成人第一页 | 国产激情精品视频 | 日韩综合在线 | 亚洲一区 | 久久成人高清视频 | 久久免费精品视频 | 亚洲视频在线一区 | 欧美日韩成人影院 | 亚洲国产aⅴ精品一区二区 免费观看av | 成人在线观看网站 | 精品真实国产乱文在线 | 亚洲国产精品福利 | 国产美女免费视频 | 91久久精品国产91久久 | 精品久久久久久久 | 日韩三区在线 | 欧美在线亚洲 | 91看片网| 久久国内| 久久久久国产一区二区三区 | 国产乱码精品一区二区三区忘忧草 | 精品国产色 | 男人阁久久 |