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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3766|回復: 1
收起左側

單片機+Proteus仿真四路搶答器程序

[復制鏈接]
ID:625113 發表于 2019-12-25 21:45 | 顯示全部樓層 |閱讀模式
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
Snipaste_2019-12-25_21-43-19.png

單片機源程序如下:
  1. #include<reg52.h>
  2. #define uint unsigned int
  3. #define uchar unsigned char
  4. sbit RS = P2^0;
  5. sbit RW = P2^1;
  6. sbit EN = P2^2;
  7. sbit K0 = P3^0;
  8. sbit K1 = P1^0;
  9. sbit K2 = P1^1;
  10. sbit K3 = P1^2;
  11. sbit K4 = P1^3;
  12. sbit K5 = P3^1;
  13. sbit K6 = P2^3;
  14. sbit K7 = P2^4;
  15. sbit K8 = P3^4;
  16. sbit Buzz = P3^7;
  17. uint cnt = 0;//記錄中斷次數
  18. uint cnt1= 0;
  19. uint sec = 20;//記錄倒計時
  20. uchar num = 0;//記錄搶答選手
  21. uchar flag = 1;//搶答標志
  22. uchar s_flag = 0;//開始標志
  23. uchar e_flag = 0;//結束標志
  24. uchar score[4]={0};
  25. void init1602();
  26. void Lcdshow(uchar x,uchar y,uchar *str);
  27. void KeyScan();   
  28. void Keycontrol() ;
  29. void Judge();
  30. uchar IntToString(uchar *str, int dat);

  31. void main()
  32. {
  33.         uchar str1[12];
  34.         uchar str2[12];
  35.         uchar len,len1;
  36.         EA = 1;
  37.         ET0 = 1;
  38.         TMOD = 0x11;//打開定時器T0,T1
  39.         TR0 = 0;
  40.         TH0 = 0xFC;
  41.         TL0 = 0x67;
  42.        
  43.         TR1 = 0;
  44.         TH1 = 0xFC;
  45.         TL1 = 0x67;
  46.         ET1 = 1;

  47.         init1602();
  48.        
  49.        
  50.        
  51.         Lcdshow(0,0,str1);
  52.         while(1)
  53.         {
  54.                 Keycontrol();
  55.                 KeyScan();
  56.                 len = IntToString(str1,sec);
  57.                 len1= IntToString(str2,num);
  58.                 if(e_flag==0)
  59.                 {
  60.                         Lcdshow(0,0,"Time:");
  61.                         Lcdshow(6,0,str1);
  62.                 }
  63.                 if(num!=0&&e_flag==0&&flag==0)//沒有結束且有人按下按鍵
  64.                 {
  65.                         Lcdshow(0, 1, "answerer:");       
  66.                         Lcdshow(9, 1, str2);
  67.                 }
  68.                 if(e_flag==1)
  69.                 {
  70.                         Judge();
  71.                 }
  72.         }
  73. }

  74. /*等待液晶準備*/
  75. void Lcdready()
  76. {
  77.         uchar sta;
  78.         P0 = 0xFF;
  79.         RS = 0;
  80.         RW = 1;
  81.         do
  82.         {
  83.                 EN = 1;
  84.                 sta = P0;//讀取狀態字
  85.                 EN = 0;

  86.         }while(sta & 0x80);
  87. }
  88. /* 向 LCD1602 液晶寫入命令,cmd-待寫入命令值 */
  89. void WriteCmd(uchar cmd)
  90. {
  91.         Lcdready();
  92.         RS = 0;
  93.         RW = 0;
  94.         P0 = cmd;
  95.         EN = 1;
  96.         EN = 0;
  97. }
  98. /* 向 LCD1602 液晶寫入數據,dat-待寫入數據 */
  99. void WriteData(uchar dat)
  100. {
  101.         Lcdready();
  102.         RS = 1;
  103.         RW = 0;
  104.         P0 = dat;
  105.         EN = 1;
  106.         EN = 0;
  107. }
  108. /* 設置顯示 RAM 起始地址(x,y)-對應屏幕上的字符坐標 */
  109. void Lcdaddr(uchar x,uchar y)
  110. {
  111.         uchar m;
  112.         if(y==0)
  113.                 m = 0x00+x;        //第一行字符地址從 0x00 起始
  114.         else
  115.                 m = 0x40+x;        //第二行字符地址從 0x40 起始
  116.         WriteCmd(m | 0x80);//設置 RAM 地址
  117. }
  118. /* 在液晶上顯示字符串,(x,y)-對應屏幕上的起始坐標,str-字符串指針 */
  119. void Lcdshow(uchar x,uchar y,uchar *str)
  120. {
  121.         Lcdaddr(x,y);
  122.         while(*str != '\0')
  123.         {
  124.                 WriteData(*str++);
  125.         }
  126. }
  127. /* 初始化 1602 液晶 */
  128. void init1602()
  129. {
  130.         WriteCmd(0x38);
  131.         WriteCmd(0x0C);
  132.         WriteCmd(0x06);
  133.         WriteCmd(0x01);
  134. }
  135. /* 整型數轉換為字符串,str-字符串指針,dat-待轉換數,返回值-字符串長度 */
  136. unsigned char IntToString(unsigned char *str, int dat)
  137. {
  138.     uchar i = 0;
  139.     unsigned char len = 0;
  140.     unsigned char buf[6];
  141.    
  142.     if (dat < 0)  //如果為負數,首先取絕對值,并在指針上添加負號
  143.     {
  144.         dat = -dat;
  145.         *str++ = '-';
  146.         len++;
  147.     }
  148.     do                            //先轉換為低位在前的十進制數組
  149.         {         
  150.         buf[i++] = dat % 10;
  151.         dat /= 10;
  152.     } while (dat > 0);
  153.     len += i;     //i最后的值就是有效字符的個數
  154.     while (i-- > 0)   //將數組值轉換為ASCII碼反向拷貝到接收指針上
  155.     {
  156.         *str++ = buf[i] + '0';
  157.     }
  158.     *str = '\0';  //添加字符串結束符
  159.    
  160.     return len;   //返回字符串長度
  161. }
  162. /*簡易延時*/
  163. void delay(uint x)
  164. {
  165.         uchar i,j;
  166.         for(i=x;i>0;i--)
  167.                 for(j=110;j>0;j--);
  168. }
  169. /*控制鍵掃描函數,開始結束*/
  170. void Keycontrol()   
  171. {
  172.         if(K0==0)        //開始鍵
  173.         {
  174.                  delay(10);
  175.             if(K0==0)
  176.             {
  177.                 while(!K0);
  178.                                 WriteCmd(0x01);
  179.                                 sec=20;
  180.                 TR0=~TR0;
  181.                                 e_flag=0;
  182.                                 flag=1;
  183.                                 s_flag = 1;//表示已經開始
  184.             }
  185.         }
  186.                 if(K5==0)
  187.                 {
  188.                         delay(10);
  189.                         if(K5==0 && flag==0)
  190.                         {
  191.                                 while(!K5);
  192.                                 e_flag =1;//表示結束
  193.                                 Buzz = 0;
  194.                                 Lcdshow(9,0,"Successed");
  195.                         }       
  196.                 }
  197.                 if(K8==0)         //查分鍵
  198.                 {
  199.                         uchar ch;
  200.                         delay(10);
  201.                         if(K8==0 && e_flag==1) //按鍵按下且此時已結束
  202.                         {
  203.                                 while(!K8);
  204.                                 WriteCmd(0x01);
  205.                                 Lcdshow(0,0,"P1:");
  206.                                 ch=(char) (score[1]+48);
  207.                                 WriteData(ch);
  208.                                 Lcdshow(10,0,"P2:");
  209.                                 ch=(char) (score[2]+48);
  210.                                 WriteData(ch);
  211.                                 Lcdshow(0,1,"P3:");
  212.                                 ch=(char) (score[3]+48);
  213.                                 WriteData(ch);
  214.                                 Lcdshow(10,1,"P4:");
  215.                                 ch=(char) (score[4]+48);
  216.                                 WriteData(ch);
  217.                         }       
  218.                 }
  219. }
  220. /*四路熱鍵掃描(哪個鍵先按下,哪個優先級最高) */
  221. void KeyScan()               
  222. {
  223.         if( K1==0 && flag != 0 && s_flag==1)
  224.     {
  225.             delay(10);
  226.         if(K1==0)
  227.         {
  228.             while(!K1);
  229.             num=1;           //數碼管顯示1號"1"
  230.             TR0=0;           //關閉定時器0,時間停止            
  231.             TR1=1;                        //按下搶答器,蜂鳴器提醒           
  232.             flag=0;        //關閉開始鍵標志位,使再按其他三個鍵不會響應                                   
  233.         }        
  234.     }
  235.         if( K2==0 && flag != 0 && s_flag==1)          //以下三個按鍵同一
  236.     {
  237.             delay(10);
  238.         if(K2==0)
  239.         {
  240.             while(!K1);
  241.             num=2;         
  242.             TR0=0;                    
  243.             TR1=1;                 
  244.             flag=0;                                       
  245.         }        
  246.     }
  247.         if( K3==0 && flag != 0 && s_flag==1)          
  248.     {
  249.             delay(10);
  250.         if(K3==0)
  251.         {
  252.             while(!K1);
  253.             num=3;         
  254.             TR0=0;                    
  255.             TR1=1;                  
  256.             flag=0;                                       
  257.         }        
  258.     }
  259.         if( K4==0 && flag != 0 && s_flag==1)          
  260.     {
  261.             delay(10);
  262.         if(K4==0)
  263.         {
  264.             while(!K1);
  265.             num=4;         
  266.             TR0=0;                    
  267.             TR1=1;                  
  268.             flag=0;                                       
  269.         }        
  270.     }
  271.         
  272. }
  273. void Judge()
  274. {
  275.         if( K6==0 )                    //Yes按鍵
  276.     {
  277.             delay(10);
  278.         if(K6==0)
  279.         {
  280.             while(!K6);         
  281.             WriteCmd(0x01);
  282.                         Lcdshow(0, 0, "Your answer is:");  
  283.                         Lcdshow(0, 1, "Right");
  284.                         score[num]++;//為選手加分                                    
  285.         }        
  286.     }
  287.         if( K7==0 )          
  288.     {
  289.             delay(10);
  290.         if(K7==0)
  291.         {
  292.             while(!K7);         
  293.             WriteCmd(0x01);
  294.                         Lcdshow(0, 0, "Your answer is:");  
  295.                         Lcdshow(0, 1, "Worry");                                    
  296.         }        
  297.     }       
  298. }

  299. void Time0 () interrupt 1
  300. {
  301.         TH0 = 0xFC;
  302.         TL0 = 0x67;//重賦值
  303.         cnt++;
  304.         if(cnt>=1000)
  305.         {
  306.                 cnt = 0;
  307.                 sec--;
  308.                 if(sec==0)
  309.                         TR0 = 0;
  310.         }

  311. }
  312. void Time1 () interrupt 3
  313. {
  314.         TH1=(65536-2000)/256;
  315.     TL1=(65536-2000)%256;
  316.     Buzz = ~Buzz;
  317.     cnt1++;
  318.     if(cnt1==1000)
  319.     {
  320.         cnt1=0;
  321.             TR1=0;
  322.     }
  323. }
復制代碼

所有資料51hei提供下載:
4路搶答器1602顯示.zip (53.54 KB, 下載次數: 47)

評分

參與人數 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

回復

使用道具 舉報

ID:625113 發表于 2019-12-25 21:47 來自手機 | 顯示全部樓層
注釋亂碼了
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 亚洲成人国产精品 | 国产精品3区| 国产精品黄视频 | 亚洲综合色视频在线观看 | 欧美涩 | 精品国产乱码久久久久久牛牛 | 成人国产精品久久 | 亚洲第一在线视频 | 一区中文字幕 | 在线一区 | 国产精品久久视频 | 99久久精品免费看国产四区 | 午夜视频在线免费观看 | 亚洲欧美日本国产 | av影音 | 欧美精品一区二区三区在线播放 | 日本羞羞影院 | 精品国产一区二区三区免费 | 欧美综合自拍 | 97av| 欧美一级在线观看 | 黑人巨大精品欧美一区二区免费 | 国产综合视频 | 亚洲一区二区三区在线播放 | 国产精品一区二区三区在线 | 国产精品久久久久久妇女6080 | 日本免费一区二区三区四区 | 99精品国产成人一区二区 | 欧美一级二级视频 | 亚洲国产精品久久人人爱 | 欧美vide| 免费观看www7722午夜电影 | 日本午夜精品一区二区三区 | 精品伊人久久 | 久久久久国产精品一区三寸 | 久久久久综合 | 久久久亚洲一区 | 亚洲综合色 | 久久成人免费 | 国产精品亚洲精品日韩已方 | av网站在线看 |