找回密码
 立即注册

QQ登录

只需一步,快速开始

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

八路抢答器

[复制链接]
跳转到指定楼层
楼主
例12-5 8位竞赛抢答器.zip (57.57 KB, 下载次数: 15)
  1. #include<reg51.h>

  2. sbit DIN=P3^0;
  3. sbit LOAD=P3^1;
  4. sbit CLK=P3^2;
  5. sbit S1=P3^6;
  6. sbit key0=P1^0;
  7. sbit key1=P1^1;
  8. sbit key2=P1^2;
  9. sbit key3=P1^3;
  10. sbit key4=P1^4;
  11. sbit key5=P1^5;
  12. sbit key6=P1^6;
  13. sbit key7=P1^7;
  14. sbit key_clear=P2^0
  15. sbit begin=P2^1

  16. sbit sounder=P3^7

  17. unsigned char second=30;
  18. unsigned char counter=0;
  19. unsigned char people=0;

  20. unsigned char num_add[]={0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08};
  21. unsigned char num_dat[]={0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89};

  22. unsigned char keyscan()
  23. {
  24.   unsigned char keyvalue,temp;
  25.   
  26.   keyvalue=0;
  27.   P1=0xff;
  28.   temp=P1;
  29.   if(~(P1&temp))
  30.   {
  31.     switch(temp)
  32.         {
  33.           case 0xfe:
  34.             keyvalue=1;zhi=0;
  35.             break;
  36.           case 0xfd:
  37.             keyvalue=2;zhi=0;
  38.             break;
  39.           case 0xfb:
  40.             keyvalue=3;zhi=0;
  41.             break;
  42.           case 0xf7:
  43.             keyvalue=4;zhi=0;
  44.             break;
  45.           case 0xef:
  46.             keyvalue=5;zhi=0;
  47.             break;
  48.           case 0xdf:
  49.             keyvalue=6;zhi=0;
  50.             break;
  51.           case 0xbf:
  52.             keyvalue=7;zhi=0;
  53.             break;
  54.       case 0x7f:
  55.             keyvalue=8;zhi=0;
  56.             break;
  57.           default:
  58.             keyvalue=0;zhi=0;
  59.             break;
  60.         }
  61.   }

  62.   return keyvalue;
  63. }

  64. void max7219_send(unsigned char add,unsigned char dat)
  65. {
  66.   unsigned char        ADS,i,j;

  67.   LOAD=0;
  68.   i=0;
  69.   while(i<16)
  70.   {
  71.     if(i<8)
  72.         {
  73.           ADS=add;
  74.         }
  75.         else
  76.         {
  77.           ADS=dat;
  78.         }
  79.         for(j=8;j>=1;j--)
  80.         {
  81.           DIN=ADS&0x80;
  82.           ADS=ADS<<1;
  83.           CLK=1;
  84.           CLK=0;
  85.         }
  86.         i=i+8;
  87.   }
  88.   LOAD=1;
  89. }

  90. void max7219_init()
  91. {
  92.   max7219_send(0x0c,0x01);
  93.   max7219_send(0x0b,0x07);
  94.   max7219_send(0x0a,0xf5);
  95.   max7219_send(0x09,0xff);
  96. }

  97. void time_display(unsigned char x)
  98. {
  99.   unsigned char i,j;
  100.   i=x/10;
  101.   j=x%10;
  102.   max7219_send(num_add[1],num_dat[j]);
  103.   max7219_send(num_add[0],num_dat[i]);
  104. }

  105. void scare_display(unsigned char x)
  106. {
  107.   unsigned char i,j;
  108.   i=x/10;
  109.   j=x%10;
  110.   max7219_send(num_add[3],num_dat[j]);
  111.   max7219_send(num_add[2],num_dat[i]);
  112. }

  113. void holderscan()//????????????0-60s
  114. {
  115.   time_display(second);
  116.   scare_display(people);
  117.   if(~key_clear)
  118.   {
  119.     while(~key_clear);
  120.         if(people)
  121.         {
  122.           second=30;
  123.           people=0;
  124.         }
  125.         if(second<60)
  126.         {
  127.           second++;
  128.         }
  129.         else
  130.         {
  131.           second=0;
  132.         }
  133.   }
  134. }

  135. void timer_init()
  136. {   S1=0;
  137.   EA=1;
  138.   ET0=1;
  139.   TMOD=0x01;
  140.   TH0=0xd8;
  141.   TL0=0xef;
  142. }

  143. void main()
  144. {         
  145.   while(1)
  146.   {
  147.   do{
  148.     holderscan();
  149.   }while(begin);
  150.   while(~begin);
  151.   max7219_init();
  152.   timer_init();
  153.   TR0=1;
  154. S1=1;
  155.   do{
  156.     time_display(second);
  157.         scare_display(people);
  158.         people=keyscan();
  159.   }while((!people)&&(second));
  160.   TR0=0;}
  161. }

  162. void timer0() interrupt 1
  163. {
  164.   if(counter<100)
  165.   {
  166.     counter++;
  167.         if(counter==50)
  168.         {
  169.           sounder=0;
  170.         }
  171.   }
  172.   else
  173.   {
  174.     sounder=1;
  175.     counter=0;
  176.         second=second-1;
  177.   }
  178.   TH0=0xd8;
  179.   TL0=0xef;
  180.   TR0=1;
  181. }
复制代码


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

使用道具 举报

沙发
ID:850904 发表于 2020-11-28 21:56 | 只看该作者
运行有错误
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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