找回密码
 立即注册

QQ登录

只需一步,快速开始

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

单片机+MAX7219数码管显示的8路抢答器Proteus仿真程序问题 求帮助

[复制链接]
跳转到指定楼层
楼主
以单片机为核心,设计一个8位竞赛抢答器

仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)


单片机源程序如下:
  1. #include<reg51.h>
  2. sbit DIN=P3^0;            //与max7219接口定义
  3. sbit LOAD=P3^1;
  4. sbit CLK=P3^2;
  5. sbit key0=P1^0;         //8路抢答器按键
  6. sbit key1=P1^1;
  7. sbit key2=P1^2;
  8. sbit key3=P1^3;
  9. sbit key4=P1^4;
  10. sbit key5=P1^5;
  11. sbit key6=P1^6;
  12. sbit key7=P1^7;
  13. sbit key_clear=P2^0;        //主持人时间设置、清除
  14. sbit begin=P2^1;        //主持人开始按键
  15. sbit sounder=P3^7;            //蜂鸣器
  16. unsigned char second=30;        //秒表计数值
  17. unsigned char counter=0;        //counter每100,minite加1
  18. unsigned char people=0;            //抢答结果
  19. unsigned char
  20. num_add[]={0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08};
  21.                         //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. keyvalue=0;
  27. P1=0xff;
  28. temp=P1;
  29. if(~(P1&temp))
  30.       {
  31.         switch(temp)
  32.     {
  33.           case 0xfe:
  34.             keyvalue=1;
  35.             break;
  36.           case 0xfd:
  37.             keyvalue=2;
  38.             break;
  39.         case 0xfb:
  40.             keyvalue=3;
  41.             break;
  42.           case 0xf7:
  43.             keyvalue=4;
  44.             break;

  45.         case 0xef:
  46.                 keyvalue=5;
  47.                 break;
  48.               case 0xdf:
  49.                 keyvalue=6;
  50.                 break;
  51.               case 0xbf:
  52.                 keyvalue=7;
  53.             break;
  54.                   case 0x7f:
  55.                 keyvalue=8;
  56.                 break;
  57.               default:
  58.                 keyvalue=0;
  59.                 break;
  60.         }
  61.       }
  62.       return keyvalue;
  63.     }
  64.     void max7219_send(unsigned char add,unsigned char dat)
  65.                                 // 函数功能:向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()            //定时器T0初始化
  137. {
  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. {
  150. holderscan();
  151. }while(begin);        //开始前进行设置,若未按下开始键
  152. while(~begin);        //防抖
  153. max7219_init();         //芯片初始化
  154. timer_init();              //中断初始化
  155. TR0=1;                      //开始中断
  156.   do

  157. {
  158. time_display(second);
  159. scare_display(people);
  160. people=keyscan();
  161.   }while((!people)&&(second));    //运行直到抢答结束或时间结束
  162.   TR0=0;
  163.   }
  164. }
  165. void timer0() interrupt 1                            //定时器T0中断函数
  166. {
  167.       if(counter<100)
  168.       {
  169.         counter++;
  170.         if(counter==50)
  171.         {
  172.               sounder=0;
  173.         }  
  174.     }
  175.     else
  176.     {
  177.         sounder=1;
  178.         counter=0;
  179.     second=second-1;
  180.     }
  181.       TH0=0xd8;                //重新装载
  182.       TL0=0xef;
  183.       TR0=1;
  184. }

复制代码




右侧显示不正常 求大神帮忙修改一下程序啊:
11-5-8位抢答器.rar (104.57 KB, 下载次数: 9)


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

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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