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

標題: 基于單片機的快棋賽電子計時器設(shè)計報告 [打印本頁]

作者: 龐智仁    時間: 2018-7-10 15:13
標題: 基于單片機的快棋賽電子計時器設(shè)計報告
題目:
快棋賽電子計時器設(shè)計


第一部分 設(shè)計內(nèi)容和要求

1.1設(shè)計內(nèi)容

利用keil、Proteus和C51單片機設(shè)計出快棋賽電子計時器

1.2 設(shè)計要求

1. 八個數(shù)碼管分為兩組,每組四個數(shù)碼管動態(tài)顯示對應方的定時時間,以及倒計過程,包括分鐘(2位,00~99)、秒(2位,00~59)
2. 相互控制啟停開關(guān)(2個)
3. 總暫停開關(guān)(用于雙方選手同時休息)
4. 各自初始時間設(shè)置(選手同意情況下可以設(shè)置不同的初始時間),即可以對相應的分鐘及秒分別進行初始設(shè)置
5.  任何一方的選手如果時間倒計為零,則報警并在其四個數(shù)碼管上閃爍顯示“LOSE”

1.3系統(tǒng)運行流程

程序首先進行初始化,在主程序的循環(huán)中,首先調(diào)用數(shù)據(jù)處理函數(shù),將分和秒數(shù)值拆開儲存在顯示緩沖區(qū)中(即一個數(shù)組中),然后按鍵掃描函數(shù),判斷是否有按鍵按下;若有,則執(zhí)行相應程序,若沒有;則往下功能指示燈led函數(shù)。若功能按鍵按下,則亮相應的led;若無,則繼續(xù)往下執(zhí)警告函數(shù)。若有時間快耗完了,則執(zhí)行相應程序;若無,則繼續(xù)往下結(jié)束函數(shù),若時間耗完了,則執(zhí)行相應程序;若無,執(zhí)行循環(huán)。這里,我用了定時器0和定時器1,定時器0用來計時間,定時器1用做動態(tài)顯示。
第二部分 設(shè)計方案

程序流程


主程序流程圖
按鍵掃描子程序
檢測是否有按鍵按下,若無返回主程序;
K1按下,若計時開始且功能按鍵記錄次數(shù)為0,則是控制時間作用:紅色時間暫停,藍色時間若計時暫停且功能按鍵記錄次數(shù)不為0,則是調(diào)節(jié)時間作用:根據(jù)功能按鍵次數(shù),增加對應數(shù)值
K2按下,若計時開始且功能按鍵記錄次數(shù)為0,則是控制時間作用:藍色時間暫停,紅色時間開始;若計時暫停且功能按鍵記錄次數(shù)不為0,則是調(diào)節(jié)時間作用:根據(jù)功能按鍵次數(shù),減少對應數(shù)值
K3按下,全部時間暫停或者開啟;(一開始時,時間都是暫停的,只有當K3按下時,紅色方先開始計時)
K4按下,記錄按下次數(shù);(作為功能按鍵,K1K2調(diào)整紅色分和秒數(shù)值以及藍色分秒數(shù)值
(注:當程序開始計時時或比賽結(jié)束時,K4按鍵無效)

功能指示燈程序(附加功能)
共有4led作為指示燈,根據(jù)功能按鍵按下次數(shù),亮不同的led,作為指示燈,告知使用者,你正在調(diào)整的是哪個數(shù)值。

警告子程序(附加功能)
若有一方的時間少于十秒了,則代表他的兩個led就會閃爍,作為提示。

結(jié)束子程序
當一方的時間耗完了,則他的數(shù)碼管會閃爍“lose”,另一方閃爍顯示“win(附加功能),并且4led也會一起閃爍(附加功能)

定時器0
我用做秒計時,每當秒計時到了,根據(jù)判斷,減少紅色時間或減少藍色時間。

定時器1
我用做數(shù)碼管的動態(tài)顯示;這樣能消除按鍵帶來的顯示影響。
第三部分 Proteus電路圖


第四部分 keil編譯結(jié)果和Proteus仿真結(jié)果
Keil編譯結(jié)果
Proteus仿真結(jié)果
編譯和仿真都能通過沒有問題。
第五部分 單片機仿真
第六部分 附加功能
在第二部分設(shè)計方案中,我已用紅色字體標注出,這里不再贅述了。
第八部分設(shè)計心得及體會

本次課程設(shè)計中,特別是在程序編寫過程中,遇到了很多的問題。但這是對我的考驗一定要充滿耐心,遇到問題,就去尋找解決問題的辦法。我設(shè)計過程中還不斷提出自己的疑點以及新的想法,聯(lián)系實際應用,將課本上學習的東西運用到實際中,這些都令我受益匪淺。最終得以完成這次單片機課程設(shè)計,非常感謝老師教導。

第七部分 代碼及注釋
  1. #include <reg51.h>
  2. #define uchar  unsigned char
  3. #define uint unsigned int
  4. uchar DispBuf[8];  //顯示緩沖區(qū)
  5. uchar DispTab[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,
  6.                                                         0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E,0xFF};              //LED字形碼
  7. uchar BitTab[]={0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01 };              //LED位驅(qū)動碼
  8. uchar redlose[]={0xC1,0xC1,              0xF9,0xC8,0xC7,0xC0,0x92,0x84};//紅色時間到LED字形碼
  9. uchar bluelose[]={0xC7,0xC0,0x92,0x84,0xC1,0xC1,0xF9,0xC8};//藍色時間到LED字形碼
  10. sbit k1=P1^0;
  11. sbit k2=P1^1;
  12. sbit k3=P1^2;
  13. sbit k4=P1^3;
  14. sbit L1=P3^0;
  15. sbit L2=P3^1;
  16. sbit L3=P3^2;
  17. sbit L4=P3^3;
  18. uint num,flag1=1,flag2,flag3=1;,k4num;
  19. uchar miao1=00,fen1=30,miao2=00,fen2=30;
  20. void Timer1(void) interrupt 1{
  21.               TH0=(65536-50000)/256;//重裝數(shù)值
  22.               TL0=(65536-50000)%256;
  23.               num++;
  24.               if(num==20)//如果到了20次,說明一秒時間到
  25.               {
  26.                             num=0;//清零,重新計數(shù)20次
  27.                             if(flag1==1)//紅方時間減少
  28.                             {
  29.                                           miao1--;//秒時間減少
  30.                                           if(miao1==-1){//說明一分鐘到了,重新減少一分鐘,并且分鐘減一
  31.                                                            miao1=59;
  32.                                                            fen1--;
  33.                                                            }
  34.                                                         }
  35.                   if(flag1==0)//藍方時間減少
  36.                             {
  37.                                           miao2--;
  38.                                           if(miao2==-1){
  39.                                                            miao2=59;
  40.                                                            fen2--;
  41.                                        }
  42.                            
  43.                       }
  44.                }
  45.                                                            }
  46. void Timer2(void) interrupt 3{
  47.     uchar tmp;
  48.     uchar Count;
  49.               TH1=(65536-3000)/256;//重裝數(shù)值
  50.               TL1=(65536-3000)%256;
  51.             
  52.               P2=BitTab[Count];              //取位值
  53.               tmp=DispBuf[Count];              //取出待顯示的數(shù)
  54.               tmp=DispTab[tmp];              //取字形碼
  55.               P0=tmp;
  56.               Count++;
  57.     if(Count==8)
  58.                             Count=0;
  59.             
  60.             
  61.                                         }
  62. void delay(uint xms)//延時函數(shù)
  63. {
  64.               uint i,j;
  65.               for(i=xms;i>0;i--)

  66.                             for(j=110;j>0;j--);
  67. }

  68. void keyscan(void)//按鍵函數(shù)
  69. {
  70.               if(k1==0)//按鍵按下
  71.               {
  72.                             delay(5);
  73.                             if(k1==0)//確認按鍵按下
  74.                             {
  75.                                          
  76.                                           while(!k1);//等待按鍵釋放
  77.                                           if(k4num==0&&TR0==1)//當計時開始,并且功能鍵記錄次數(shù)為零時,作用為控制時間
  78.                                           {
  79.                                                         if(flag1==1)//紅色時間暫停,藍色時間開始
  80.                                                                       flag1=0;
  81.                                                         }
  82.                                           if(k4num!=0&&TR0==0)//當計時暫停,并且功能鍵記錄次數(shù)不為零,作用為調(diào)節(jié)時間
  83.                                           {
  84.                                           switch(k4num)//根據(jù)功能鍵次數(shù),增加相應數(shù)值
  85.                                                         {
  86.                                                                       case 1: miao1++;
  87.                                                                                                   if(miao1==60)
  88.                                                                                                                 miao1=0;
  89.                                                                                                   break;
  90.                                                                       case 2: fen1++;
  91.                                                                                                   if(fen1==100)
  92.                                                                                                                 fen1=0;
  93.                                                                                                   break;
  94.                                                                       case 3: miao2++;
  95.                                                                                                   if(miao2==60)
  96.                                                                                                                 miao2=0;
  97.                                                                                                   break;
  98.                                                                       case 4: fen2++;
  99.                                                                                                   if(fen2==100)
  100.                                                                                                                 fen2=0;
  101.                                                                                                   break;
  102.                                                                                                   }
  103.                                                                                                   }
  104.                                                                       }
  105.                                                         }
  106.               if(k2==0){
  107.                             delay(5);
  108.                             if(k2==0){
  109.                                          
  110.                                           while(!k2);
  111.                                           if(k4num==0&&TR0==1)//
  112.                                           {
  113.                                                         if(flag1==0)//藍色時間暫停,紅色時間開始
  114.                                                                       flag1=1;
  115.                                                                                     }
  116.                                           if(k4num!=0&&TR0==0)//根據(jù)功能鍵次數(shù),增加相應數(shù)值
  117.                                           {
  118.                                           switch(k4num)
  119.                                           {
  120.                                                                       case 1: miao1--;
  121.                                                                                                   if(miao1==-1)
  122.                                                                                                                 miao1=59;
  123.                                                                                                   break;
  124.                                                                       case 2: fen1--;
  125.                                                                                                   if(fen1==-1)
  126.                                                                                                                 fen1=99;
  127.                                                                                                   break;
  128.                                                                       case 3: miao2--;
  129.                                                                                                   if(miao2==-1)
  130.                                                                                                                 miao2=59;
  131.                                                                                                   break;
  132.                                                                       case 4: fen2--;
  133.                                                                                                   if(fen2==-1)
  134.                                                                                                                 fen2=99;
  135.                                                                                                   break;
  136.                                                                                                   }
  137.                                                            }
  138.                                                                       }
  139.                                                          
  140.                                                         }
  141.               if(k3==0)//總暫停開關(guān)
  142.               {
  143.                             delay(5);
  144.                             if(k3==1){
  145.                                           while(!k3);
  146.                                           TR0=~TR0;//控制時間暫停或是開始
  147.                                           k4num=0;//功能按鍵記錄次數(shù)清零
  148.                                           flag3=0;//清零標志
  149.                                                                       }
  150.                                                         }
  151.               if(k4==0)//功能按鍵
  152.               {
  153.                             delay(5);
  154.                             if(k4==0){
  155.                                           if(TR0==0)//當計時暫停時,這個按鍵才有效
  156.                                           {
  157.                                                         flag3=1;//做標志,防止在調(diào)節(jié)時間時,調(diào)到零的時候,就進入子程序last()
  158.                                                         k4num++;//記錄功能按鍵按下次數(shù)
  159.                                                                       }
  160.                                                         if(k4num==5||TR0==1||flag2==1)//當帶五次按下或開始計時或某一方時間耗完,清零記錄次數(shù)
  161.                                                         {
  162.                                                                       k4num=0;
  163.                                                                                                 
  164.                                                                       }
  165.                                           while(!k4);
  166.                                                         }
  167.                                           }
  168.                            

  169. }
  170. void last()//某一方時間耗完,分別顯示lose和win
  171. {
  172.               uint i,j;
  173.               if(miao1==0&&fen1==0&&flag3==0)//紅方時間先耗完
  174.               {
  175.                             TR0=0;//關(guān)閉計時
  176.                             TR1=0;//關(guān)閉時間顯示
  177.                             flag2=1;//標志比賽結(jié)束
  178.                             for(i=80;i>0;i--)//動態(tài)顯示 lose和win 80次
  179.                             {
  180.                                           for(j=0;j<8;j++){
  181.                                                         P2=BitTab[j];//送入位選
  182.                                                         P0=redlose[j];//送入lose和win的字形碼
  183.                                                         delay(2);
  184.                                                         P0=0xFF;
  185.                                                         }            
  186.                                           L1=~L1;//led不斷閃爍
  187.                                 L2=~L2;
  188.                                           L3=~L3;
  189.                                           L4=~L4;
  190.                                           }
  191.                             P0=0XFF;//關(guān)閉顯示300ms
  192.                             P2=0X00;
  193.                             delay(300);
  194.                             }
  195.               if(miao2==0&&fen2==0&&flag3==0)//藍色方時間耗完
  196.               {
  197.                             TR0=0;
  198.                             TR1=0;
  199.                             flag2=1;
  200.                             for(i=70;i>0;i--){
  201.                                           for(j=0;j<8;j++){
  202.                                                         P2=BitTab[j];
  203.                                                         P0=bluelose[j];
  204.                                                         delay(3);
  205.                                                         P0=0xFF;
  206.                                                         }                                                                     
  207.                                           L1=~L1;
  208.                                 L2=~L2;
  209.                                           L3=~L3;
  210.                                           L4=~L4;            
  211.                             }
  212.                             P0=0XFF;
  213.                             P2=0X00;
  214.                             delay(100);
  215.                             }
  216.                             }
  217. void led()//功能按鍵對應的指示led燈亮或滅
  218. {
  219.               switch(k4num){
  220.                             case 0: P3=0xFF;
  221.                                                         break;
  222.                             case 1: P3=0xF7;
  223.                                               break;
  224.                             case 2: P3=0xFB;
  225.                                               break;
  226.                             case 3: P3=0xFD;
  227.                                                         break;
  228.                             case 4: P3=0xFE;
  229.                                                         break;
  230.                                                         }
  231.             

  232. }
  233. void warn(){
  234.               if(fen1==0&&miao1<10&&TR0==1&&flag1==1)//當紅色時間少于十秒的時候,閃爍led燈提示
  235.               {
  236.                             L3=~L3;
  237.                             L4=~L4;
  238.                             }
  239.               if(fen2==0&&miao2<10&&TR0==1&&flag1==0)//當紅色時間少于十秒的時候,閃爍led燈提示
  240.               {
  241.                             L1=~L1;
  242.                             L2=~L2;
  243.                             }

  244.                             }

  245. void zixing(){
  246.                             DispBuf[0]=fen2/10;
  247.                             DispBuf[1]=fen2%10;
  248.                             DispBuf[2]=miao2/10;
  249.                             DispBuf[3]=miao2%10;
  250.                             DispBuf[4]=fen1/10;
  251.                             DispBuf[5]=fen1%10;
  252.                             DispBuf[6]=miao1/10;
  253.                             DispBuf[7]=miao1%10;

  254. }                           
  255. void main(){
  256.               TMOD=0X11;//設(shè)置T0定時方式一和T1定時方式一
  257.               TH0=(65536-50000)/256;//裝入初值,計時一秒
  258.               TL0=(65536-50000)%256;
  259.               TH1=(65536-3000)/256; //裝入初值,計時30us
  260.               TL1=(65536-3000)%256;
  261.               EA=1;//打開總中斷
  262.               ET0=1;//打開定時器0中斷
  263.               ET1=1;//打開定時器1中斷
  264.               TR0=0;//暫停定時器0
  265.               TR1=1;//開啟定時器1
  266.               while(1){
  267.                             zixing();//將分和秒數(shù)值拆開,存入顯示緩沖區(qū),等待顯示
  268.                             keyscan();//按鍵函數(shù)
  269.                             led();//功能指示led
  270.                             warn();//當時間少于十秒時,警告函數(shù)
  271.                             last();//比賽結(jié)束,顯示lose和win 函數(shù)
  272.                                           }
  273.                                           }
復制代碼
完整的Word格式文檔51黑下載地址:
龐智仁2016160111.doc (695 KB, 下載次數(shù): 23)







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