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

 找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 2400|回復(fù): 2
打印 上一主題 下一主題
收起左側(cè)

單片機(jī)比賽計(jì)分器Proteus仿真與代碼

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:983403 發(fā)表于 2021-11-26 15:56 | 只看該作者 |只看大圖 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
1、總設(shè)計(jì)框圖

2、硬件仿真圖

3、主函數(shù)和定時(shí)器代碼

數(shù)碼管倒計(jì)時(shí)設(shè)計(jì)

中斷控制程序


單片機(jī)源程序如下:
  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. //對(duì)應(yīng)數(shù)碼管顯示數(shù)字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兩隊(duì)分?jǐn)?shù)
  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)//定義延時(shí)程序,通過設(shè)置參數(shù)x,改變延時(shí)時(shí)間長(zhǎng)度
  17. {
  18.         while(x--)
  19.         {
  20.                 uint y;
  21.                 for(y=0;y<200;y++);
  22.         }
  23. }
  24. /*顯示子程序,變量i,j分別是分秒,變量x,y是A,B兩隊(duì)的分?jǐn)?shù)*/
  25. void display(int u_i,int u_j,int u_x,int u_y)
  26. {               
  27.         P2=~0xfe;   //刷新數(shù)碼管顯示時(shí)間的分鐘十位,調(diào)用延時(shí)程序                              
  28.         P0=~seg[u_i%100/10];
  29.         delay(1);                        //延時(shí)數(shù)碼管點(diǎn)亮               
  30.         P2=0x00;
  31.         P0=0xff;
  32.         P2=~0xfd;        //刷新刷管分鐘位的個(gè)位                                
  33.         P0=~seg[u_i%10];
  34.         delay(1);
  35.         P2=0x00;
  36.         P0=0xff;
  37.         P2=~0xfb;        //刷新數(shù)碼管秒位的十位               
  38.         P0=~seg[u_j%100/10];
  39.         delay(1);
  40.         P2=0x00;
  41.         P0=0xff;
  42.         P2=~0xf7;        //刷新數(shù)碼管秒位的個(gè)位               
  43.         P0=~seg[u_j%10];
  44.         delay(1);
  45.         P2=0x00;
  46.         P0=0xff;
  47.         P2=~0xef;        //刷新數(shù)碼管A對(duì)分?jǐn)?shù)的十位                        
  48.         P0=~seg[u_x%100/10];
  49.         delay(1);
  50.         P2=0x00;
  51.         P0=0xff;
  52.         P2=~0xdf;        //刷新數(shù)碼管A對(duì)分?jǐn)?shù)的個(gè)位                        
  53.         P0=~seg[u_x%10];
  54.         delay(1);
  55.         P2=0x00;
  56.         P0=0xff;
  57.         P2=~0xbf;        //刷新數(shù)碼管B隊(duì)分?jǐn)?shù)的十位               
  58.         P0=~seg[u_y%100/10];
  59.         delay(1);
  60.         P2=0x00;
  61.         P0=0xff;
  62.         P2=~0x7f;        //刷新數(shù)碼管B隊(duì)分?jǐn)?shù)的個(gè)位        
  63.         P0=~seg[u_y%10];
  64.         delay(1);
  65.         P2=0x00;
  66.         P0=0xff;
  67. }
  68. void t0() interrupt 1 //定義中斷程序,調(diào)用定時(shí)器T0
  69. {  
  70.         TH0=0xb1;                                //對(duì)定時(shí)器T0送入初值,TH0=0xb1   
  71.         TL0=0x10;                                //TL0=0X10定時(shí)器定時(shí)為20ms
  72.         if(u_n<0)                                        //每20ms調(diào)用一次
  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);//調(diào)用數(shù)碼管顯示程序,每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()                                                        //定義調(diào)時(shí)程序
  91. {
  92. if(P1_2==0)                                                //當(dāng)按下P1_2時(shí)
  93. {
  94. delay(1);                                        //延時(shí)消抖
  95. if(P1_2==0)
  96. {
  97. u_n++;                        //秒位加1
  98. if(u_n==60)//當(dāng)秒位到60時(shí)
  99. {
  100. u_m++;//分位加1,秒變1
  101. u_n=1;
  102. }
  103. }
  104. }if(P1_3==0)                                                //當(dāng)按下P1_3時(shí)
  105. {
  106. delay(1);        
  107. if(P1_3==0)
  108. {
  109. u_n--;//秒位減1
  110. if(u_n<0)                  //當(dāng)秒位減到0時(shí),分位減1,秒位變59
  111. { u_n=59;
  112.         u_m--;        
  113.         
  114. }}}}
  115. void exchange()                                                  //定義比分交換程序
  116. {
  117.         int u_t;                                                          //定義中間變量
  118.         if(P1_1==0)                                                  //當(dāng)P1_1按下時(shí)
  119.         {
  120.                 delay(1);                                          //延時(shí)消抖
  121.                 while(P1_1==0);
  122.                 u_t=u_x;                                        //利用中間變量t,將A,B兩隊(duì)比分交換
  123.                 u_x=u_y;
  124.                 u_y=u_t;
  125.                 display(u_m,u_n,u_x,u_y);                        //刷新數(shù)碼管
  126.         }
  127. }
  128. void suspend()                                                        //定義暫停程序
  129. {
  130.         if(P1_0==0)                                                                //當(dāng)按下P1_0時(shí)
  131.         {
  132.         delay(1);                                                  //延時(shí)消抖
  133.         while(P1_0==0);
  134.         EA=0;                                                          //關(guān)中斷,進(jìn)入死循環(huán)
  135.         while(1)
  136.         {
  137.         display(u_m,u_n,u_x,u_y);
  138.         if(P1_0==0)                //當(dāng)再次按下P1_0時(shí),跳出死循環(huán)
  139.         {        
  140.         delay(1);
  141.         while(P1_0==0)
  142.         EA=1;
  143.         break;        
  144.         }}}}
  145. void alertor()                                                 //定義報(bào)警程序
  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()                                                //定義結(jié)束子程序
  158. {
  159.         M:        if(h==1)                        //當(dāng)時(shí)間條件滿足時(shí),關(guān)閉中斷,使數(shù)碼管保持狀態(tài)顯示
  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)                        //當(dāng)P1_0再次按下時(shí),跳出循環(huán)
  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的分開關(guān)打開
  192. EX1=1;//外部中斷1的分開關(guān)打開
  193. IT0=1;//外部中斷0為下降沿觸發(fā)
  194. IT1=1;//外部中斷1為下降沿觸發(fā)
  195. PX1=1;//外部中斷1為高優(yōu)先級(jí)
  196. PX0=0;//外部中斷0為低優(yōu)先級(jí)
  197.         TMOD=0x01;                                                         //初始化程序
  198.         EA=1;        //開關(guān)總中斷打開                        
  199.         ET0=1;
  200.         P3_7=0;
  201.         P0=0xff;
  202.         P2=0x00;
  203.         if(P1_0==0)                //第一次按下P1_0,單片機(jī)啟動(dòng),顯示初始值
  204.         {                                                          //由于調(diào)用了一次暫停功能,會(huì)顯示初始值
  205.                 TH0=0xb1;
  206.                 TL0=0x10;
  207.                 TR0=1;                                                                //啟動(dòng)定時(shí)器
  208.                 P3=0xff;         
  209.                 P1=0x7f;
  210.                 P3_7=0;
  211.                 while(1)
  212.                 {                        
  213.                         timing();                            //調(diào)時(shí)子程序
  214.                         exchange();                       //比分交換程序
  215.                         suspend();                           //暫停程序
  216.                         alertor();                           //報(bào)警程序
  217.                         if((u_m==0)&&(u_n==1))           //判斷子程序結(jié)束調(diào)用條件
  218.                         {
  219.                                 h=1;
  220.                         }
  221.                         conclude();                              //結(jié)束子程序
  222.                 }
  223.         }
  224. }
復(fù)制代碼

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

評(píng)分

參與人數(shù) 1黑幣 +30 收起 理由
admin + 30 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評(píng)分

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

使用道具 舉報(bào)

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

使用道具 舉報(bào)

本版積分規(guī)則

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

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 正在播放国产精品 | 91在线电影 | 伊人超碰| 九九爱这里只有精品 | 国产a级黄色录像 | jⅰzz亚洲| 久久久久久久久99精品 | 一级一片在线观看 | 午夜小视频在线观看 | 中文成人在线 | 国产一级免费视频 | 九九精品视频在线 | 一区二区精品视频 | 91视频在线| 天天操人人干 | 伊人网综合 | 亚洲欧美日韩一区二区 | 91在线色视频 | 国产一区二区影院 | 国产色片 | 亚洲精品久久久久久久久久久久久 | 亚洲欧美在线一区 | 久久精品免费一区二区三 | 亚洲视频在线看 | 国产欧美一区二区在线观看 | 91伊人网 | 在线国产一区二区 | 日韩精品一区二区三区在线播放 | 欧美一级全黄 | 亚洲久草 | 91久久久久久久久 | 日韩视频精品在线 | 九一国产精品 | 国产高清视频 | 精品久久久久久亚洲精品 | 97成人免费 | 国产精品一区在线播放 | 全部免费毛片在线播放网站 | 人人色视频 | 亚洲狠狠 | 欧美13videosex性极品 |