欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2398|回復: 2
打印 上一主題 下一主題
收起左側

單片機比賽計分器Proteus仿真與代碼

[復制鏈接]
跳轉到指定樓層
樓主
1、總設計框圖

2、硬件仿真圖

3、主函數和定時器代碼

數碼管倒計時設計

中斷控制程序


單片機源程序如下:
  1. #include<reg51.h>
  2. typedef unsigned char uchar;
  3. typedef unsigned int  uint;
  4. uchar code seg[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};  
  5. //對應數碼管顯示數字0-9
  6. int u_m=20,u_n=0,u_x=0,u_y=0,u_i=0,h=0,k;
  7. //定義全局變量并初始化,m,n表示分鐘與秒,x,y表示A,B兩隊分數
  8. sbit P1_0=P1^0;
  9. sbit P1_1=P1^1;
  10. sbit P1_2=P1^2;
  11. sbit P1_3=P1^3;
  12. sbit P3_2=P3^2;
  13. sbit P3_3=P3^3;
  14. sbit P3_6=P3^6;
  15. sbit P3_7=P3^7;
  16. void delay(uint x)//定義延時程序,通過設置參數x,改變延時時間長度
  17. {
  18.         while(x--)
  19.         {
  20.                 uint y;
  21.                 for(y=0;y<200;y++);
  22.         }
  23. }
  24. /*顯示子程序,變量i,j分別是分秒,變量x,y是A,B兩隊的分數*/
  25. void display(int u_i,int u_j,int u_x,int u_y)
  26. {               
  27.         P2=~0xfe;   //刷新數碼管顯示時間的分鐘十位,調用延時程序                              
  28.         P0=~seg[u_i%100/10];
  29.         delay(1);                        //延時數碼管點亮               
  30.         P2=0x00;
  31.         P0=0xff;
  32.         P2=~0xfd;        //刷新刷管分鐘位的個位                                
  33.         P0=~seg[u_i%10];
  34.         delay(1);
  35.         P2=0x00;
  36.         P0=0xff;
  37.         P2=~0xfb;        //刷新數碼管秒位的十位               
  38.         P0=~seg[u_j%100/10];
  39.         delay(1);
  40.         P2=0x00;
  41.         P0=0xff;
  42.         P2=~0xf7;        //刷新數碼管秒位的個位               
  43.         P0=~seg[u_j%10];
  44.         delay(1);
  45.         P2=0x00;
  46.         P0=0xff;
  47.         P2=~0xef;        //刷新數碼管A對分數的十位                        
  48.         P0=~seg[u_x%100/10];
  49.         delay(1);
  50.         P2=0x00;
  51.         P0=0xff;
  52.         P2=~0xdf;        //刷新數碼管A對分數的個位                        
  53.         P0=~seg[u_x%10];
  54.         delay(1);
  55.         P2=0x00;
  56.         P0=0xff;
  57.         P2=~0xbf;        //刷新數碼管B隊分數的十位               
  58.         P0=~seg[u_y%100/10];
  59.         delay(1);
  60.         P2=0x00;
  61.         P0=0xff;
  62.         P2=~0x7f;        //刷新數碼管B隊分數的個位        
  63.         P0=~seg[u_y%10];
  64.         delay(1);
  65.         P2=0x00;
  66.         P0=0xff;
  67. }
  68. void t0() interrupt 1 //定義中斷程序,調用定時器T0
  69. {  
  70.         TH0=0xb1;                                //對定時器T0送入初值,TH0=0xb1   
  71.         TL0=0x10;                                //TL0=0X10定時器定時為20ms
  72.         if(u_n<0)                                        //每20ms調用一次
  73.         {
  74.                 u_n=59;
  75.                 u_m--;
  76.                
  77.         }
  78.         u_i++;
  79.         if(u_i==50)                        //定義I為50,50*20ms=1s
  80.         {
  81.                 u_n--;
  82.                 u_i=0;
  83.         }
  84.         display(u_m,u_n,u_x,u_y);//調用數碼管顯示程序,每20ms刷新
  85. }
  86. void int0() interrupt 0 //外部中斷0的控制程序,每次按鍵按下,加2操作
  87. {u_x+=2;if(u_x>98)u_x=98;}
  88. void int1() interrupt 2 //外部中斷1的控制程序,每次按鍵按下,加2操作
  89. {u_y+=2;if(u_y>98)u_y=98;}
  90. void timing()                                                        //定義調時程序
  91. {
  92. if(P1_2==0)                                                //當按下P1_2時
  93. {
  94. delay(1);                                        //延時消抖
  95. if(P1_2==0)
  96. {
  97. u_n++;                        //秒位加1
  98. if(u_n==60)//當秒位到60時
  99. {
  100. u_m++;//分位加1,秒變1
  101. u_n=1;
  102. }
  103. }
  104. }if(P1_3==0)                                                //當按下P1_3時
  105. {
  106. delay(1);        
  107. if(P1_3==0)
  108. {
  109. u_n--;//秒位減1
  110. if(u_n<0)                  //當秒位減到0時,分位減1,秒位變59
  111. { u_n=59;
  112.         u_m--;        
  113.         
  114. }}}}
  115. void exchange()                                                  //定義比分交換程序
  116. {
  117.         int u_t;                                                          //定義中間變量
  118.         if(P1_1==0)                                                  //當P1_1按下時
  119.         {
  120.                 delay(1);                                          //延時消抖
  121.                 while(P1_1==0);
  122.                 u_t=u_x;                                        //利用中間變量t,將A,B兩隊比分交換
  123.                 u_x=u_y;
  124.                 u_y=u_t;
  125.                 display(u_m,u_n,u_x,u_y);                        //刷新數碼管
  126.         }
  127. }
  128. void suspend()                                                        //定義暫停程序
  129. {
  130.         if(P1_0==0)                                                                //當按下P1_0時
  131.         {
  132.         delay(1);                                                  //延時消抖
  133.         while(P1_0==0);
  134.         EA=0;                                                          //關中斷,進入死循環
  135.         while(1)
  136.         {
  137.         display(u_m,u_n,u_x,u_y);
  138.         if(P1_0==0)                //當再次按下P1_0時,跳出死循環
  139.         {        
  140.         delay(1);
  141.         while(P1_0==0)
  142.         EA=1;
  143.         break;        
  144.         }}}}
  145. void alertor()                                                 //定義報警程序
  146. {  
  147.         if(((u_m==0)&&(u_n==0))|(P3_2==0)|(P3_3==0)|(P1_0==0)|(P1_1==0)|(P1_2==0)|(P1_3==0))
  148.         {
  149.                 P3_7=1;                                
  150.                 P3_6=1;//P3_7和P3_6間隔輸出高低電平,使蜂鳴器響
  151.                 delay(5);
  152.                 P3_7=0;
  153.                 P3_6=0;
  154.                 delay(5);
  155.         }
  156. }
  157. void conclude()                                                //定義結束子程序
  158. {
  159.         M:        if(h==1)                        //當時間條件滿足時,關閉中斷,使數碼管保持狀態顯示
  160. {
  161.         EA=0;
  162.         delay(20);
  163.   u_m=0;
  164.         u_n=0;
  165.         P3_6=1;
  166.         P3_7=1;
  167.         delay(200);
  168.         P3_7=0;
  169.         P3_6=0;
  170.         while(1)
  171.         {
  172.          display(u_m,u_n,u_x,u_y);
  173.          exchange();
  174.          if(P1_0==0)                        //當P1_0再次按下時,跳出循環
  175.         {                     
  176.                 delay(1);
  177.                 while(P1_0==0)  
  178.         {
  179.                 EA=1;
  180.                 u_m=20;    //重新賦予初始值,開始比賽
  181.                 u_n=0;
  182.                 h=0;
  183.                 goto M ;
  184.         }               
  185.         }
  186.         }
  187. }
  188. }
  189. void main()                                                                //定義主程序
  190. {
  191. EX0=1;//外部中斷0的分開關打開
  192. EX1=1;//外部中斷1的分開關打開
  193. IT0=1;//外部中斷0為下降沿觸發
  194. IT1=1;//外部中斷1為下降沿觸發
  195. PX1=1;//外部中斷1為高優先級
  196. PX0=0;//外部中斷0為低優先級
  197.         TMOD=0x01;                                                         //初始化程序
  198.         EA=1;        //開關總中斷打開                        
  199.         ET0=1;
  200.         P3_7=0;
  201.         P0=0xff;
  202.         P2=0x00;
  203.         if(P1_0==0)                //第一次按下P1_0,單片機啟動,顯示初始值
  204.         {                                                          //由于調用了一次暫停功能,會顯示初始值
  205.                 TH0=0xb1;
  206.                 TL0=0x10;
  207.                 TR0=1;                                                                //啟動定時器
  208.                 P3=0xff;         
  209.                 P1=0x7f;
  210.                 P3_7=0;
  211.                 while(1)
  212.                 {                        
  213.                         timing();                            //調時子程序
  214.                         exchange();                       //比分交換程序
  215.                         suspend();                           //暫停程序
  216.                         alertor();                           //報警程序
  217.                         if((u_m==0)&&(u_n==1))           //判斷子程序結束調用條件
  218.                         {
  219.                                 h=1;
  220.                         }
  221.                         conclude();                              //結束子程序
  222.                 }
  223.         }
  224. }
復制代碼

仿真代碼51hei附件下載:
仿真程序.7z (61.93 KB, 下載次數: 47)

評分

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

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏1 分享淘帖 頂1 踩
回復

使用道具 舉報

沙發
ID:986694 發表于 2021-12-2 15:16 | 只看該作者
此帖僅作者可見

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表