標(biāo)題: 單片機(jī)+MAX7219數(shù)碼管顯示的8路搶答器Proteus仿真程序問題 求幫助 [打印本頁(yè)]

作者: adisen    時(shí)間: 2020-6-19 13:25
標(biāo)題: 單片機(jī)+MAX7219數(shù)碼管顯示的8路搶答器Proteus仿真程序問題 求幫助
以單片機(jī)為核心,設(shè)計(jì)一個(gè)8位競(jìng)賽搶答器

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


單片機(jī)源程序如下:
  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;        //主持人時(shí)間設(shè)置、清除
  14. sbit begin=P2^1;        //主持人開始按鍵
  15. sbit sounder=P3^7;            //蜂鳴器
  16. unsigned char second=30;        //秒表計(jì)數(shù)值
  17. unsigned char counter=0;        //counter每100,minite加1
  18. unsigned char people=0;            //搶答結(jié)果
  19. unsigned char
  20. num_add[]={0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08};
  21.                         //max7219讀寫地址、內(nèi)容
  22. unsigned char num_dat[]={0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89};

  23. unsigned char keyscan()            //鍵盤掃描函數(shù)
  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.                                 // 函數(shù)功能:向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()            //函數(shù)功能: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)        //函數(shù)功能:時(shí)間顯示
  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)           //函數(shù)功能:搶答結(jié)果顯示
  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()                            //函數(shù)功能:搶答時(shí)間設(shè)置,0-60s
  115. {
  116.       time_display(second);
  117.       scare_display(people);
  118.       if(~key_clear)                            //如果有鍵按下,改變搶答時(shí)間
  119.       {
  120.         while(~key_clear);
  121.         if(people)                            //如果搶答結(jié)果沒有清空,搶答器重置
  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()            //定時(shí)器T0初始化
  137. {
  138.       EA=1;
  139.       ET0=1;
  140.       TMOD=0x01;     
  141. TH0=0xd8;        //裝入定時(shí)器定時(shí)常數(shù),設(shè)定10ms中斷一次
  142. TL0=0xef;
  143. }
  144. void main()
  145. {
  146. while(1)
  147. {
  148. do
  149. {
  150. holderscan();
  151. }while(begin);        //開始前進(jìn)行設(shè)置,若未按下開始鍵
  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));    //運(yùn)行直到搶答結(jié)束或時(shí)間結(jié)束
  162.   TR0=0;
  163.   }
  164. }
  165. void timer0() interrupt 1                            //定時(shí)器T0中斷函數(shù)
  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. }

復(fù)制代碼




右側(cè)顯示不正常 求大神幫忙修改一下程序啊:
11-5-8位搶答器.rar (104.57 KB, 下載次數(shù): 9)







歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1