找回密码
 立即注册

QQ登录

只需一步,快速开始

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

51单片机八路抢答器

[复制链接]
跳转到指定楼层
楼主

  1. #include<reg51.h>
  2. sbit DIN=P3^0;//??max7219??????
  3. sbit LOAD=P3^1;
  4. sbit CLK=P3^2;
  5. sbit S1=P3^6;
  6. sbit key0=P1^0;//8·??????????
  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 zhi=P3^6;//????
  15. sbit key_clear=P2^0;//????????????á????
  16. sbit begin=P2^1;//????????????
  17. sbit sounder=P3^7;//??????
  18. unsigned char second=30;//???????
  19. unsigned char counter=0;//counter?100??minite??1
  20. unsigned char people=0;//??????
  21. unsigned char num_add[]={0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08};//max7219??д?????????
  22. unsigned char num_dat[]={0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89};
  23. unsigned char keyscan()//??????躯??
  24. {
  25.   unsigned char keyvalue,temp;
  26.   
  27.   keyvalue=0;
  28.   P1=0xff;
  29.   temp=P1;
  30.   if(~(P1&temp))
  31.   {
  32.     switch(temp)
  33. {
  34.    case 0xfe:
  35.      keyvalue=1;zhi=0;
  36.      break;
  37.    case 0xfd:
  38.      keyvalue=2;zhi=0;
  39.      break;
  40.    case 0xfb:
  41.      keyvalue=3;zhi=0;
  42.      break;
  43.    case 0xf7:
  44.      keyvalue=4;zhi=0;
  45.      break;
  46.    case 0xef:
  47.      keyvalue=5;zhi=0;
  48.      break;
  49.    case 0xdf:
  50.      keyvalue=6;zhi=0;
  51.      break;
  52.    case 0xbf:
  53.      keyvalue=7;zhi=0;
  54.      break;
  55.       case 0x7f:
  56.      keyvalue=8;zhi=0;
  57.      break;
  58.    default:
  59.      keyvalue=0;zhi=0;
  60.      break;
  61. }
  62.   }
  63.   return keyvalue;
  64. }
  65. void max7219_send(unsigned char add,unsigned char dat)//??max7219д?????
  66. {
  67.   unsigned char ADS,i,j;
  68.   LOAD=0;
  69.   i=0;
  70.   while(i<16)
  71.   {
  72.     if(i<8)
  73. {
  74.    ADS=add;
  75. }
  76. else
  77. {
  78.    ADS=dat;
  79. }
  80. for(j=8;j>=1;j--)
  81. {
  82.    DIN=ADS&0x80;
  83.    ADS=ADS<<1;
  84.    CLK=1;
  85.    CLK=0;
  86. }
  87. i=i+8;
  88.   }
  89.   LOAD=1;
  90. }
  91. void max7219_init()//max7219?????????
  92. {
  93.   max7219_send(0x0c,0x01);
  94.   max7219_send(0x0b,0x07);
  95.   max7219_send(0x0a,0xf5);
  96.   max7219_send(0x09,0xff);
  97. }
  98. void time_display(unsigned char x)//??????
  99. {
  100.   unsigned char i,j;
  101.   i=x/10;
  102.   j=x%10;
  103.   max7219_send(num_add[1],num_dat[j]);
  104.   max7219_send(num_add[0],num_dat[i]);
  105. }
  106. void scare_display(unsigned char x)//?????????
  107. {
  108.   unsigned char i,j;
  109.   i=x/10;
  110.   j=x%10;
  111.   max7219_send(num_add[3],num_dat[j]);
  112.   max7219_send(num_add[2],num_dat[i]);
  113. }
  114. void holderscan()//????????????0-60s
  115. {
  116.   time_display(second);
  117.   scare_display(people);
  118.   if(~key_clear)//????м????£???????????
  119.   {
  120.     while(~key_clear);
  121. if(people)//??????????????????????????
  122. {
  123.    second=30;
  124.    people=0;
  125. }
  126. if(second<60)
  127. {
  128.    second++;
  129. }
  130. else
  131. {
  132.    second=0;
  133. }
  134.   }
  135. }
  136. void timer_init()
  137. {   S1=0;
  138.   EA=1;
  139.   ET0=1;
  140.   TMOD=0x01;
  141.   TH0=0xd8;//?趨10ms?ж????
  142.   TL0=0xef;
  143. }
  144. void main()
  145. {  
  146.   while(1)
  147.   {
  148.   do{
  149.     holderscan();
  150.   }while(begin);//????????????,??δ????????
  151.   while(~begin);//????
  152.   max7219_init(); //о??????
  153.   timer_init();   //?ж?????
  154.   TR0=1;//????ж?
  155. S1=1;
  156.   do{
  157.     time_display(second);
  158. scare_display(people);
  159. people=keyscan();
  160.   }while((!people)&&(second));//????????????????????????
  161.   TR0=0;}
  162. }
  163. void timer0() interrupt 1
  164. {
  165.   if(counter<100)
  166.   {
  167.     counter++;
  168. if(counter==50)
  169. {
  170.    sounder=0;
  171. }
  172.   }
  173.   else
  174.   {
  175.     sounder=1;
  176.     counter=0;
  177. second=second-1;
  178.   }
  179.   TH0=0xd8;//???????
  180.   TL0=0xef;
  181.   TR0=1;
  182. }
复制代码


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

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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