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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

基于單片機的快棋賽電子計時器設計報告

[復制鏈接]
跳轉到指定樓層
樓主
ID:368732 發表于 2018-7-10 15:13 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
題目:
快棋賽電子計時器設計


第一部分 設計內容和要求

1.1設計內容

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

1.2 設計要求

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

1.3系統運行流程

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

程序流程


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

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

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

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

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

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


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

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

第七部分 代碼及注釋
  1. #include <reg51.h>
  2. #define uchar  unsigned char
  3. #define uint unsigned int
  4. uchar DispBuf[8];  //顯示緩沖區
  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位驅動碼
  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;//重裝數值
  22.               TL0=(65536-50000)%256;
  23.               num++;
  24.               if(num==20)//如果到了20次,說明一秒時間到
  25.               {
  26.                             num=0;//清零,重新計數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;//重裝數值
  50.               TL1=(65536-3000)%256;
  51.             
  52.               P2=BitTab[Count];              //取位值
  53.               tmp=DispBuf[Count];              //取出待顯示的數
  54.               tmp=DispTab[tmp];              //取字形碼
  55.               P0=tmp;
  56.               Count++;
  57.     if(Count==8)
  58.                             Count=0;
  59.             
  60.             
  61.                                         }
  62. void delay(uint xms)//延時函數
  63. {
  64.               uint i,j;
  65.               for(i=xms;i>0;i--)

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

  68. void keyscan(void)//按鍵函數
  69. {
  70.               if(k1==0)//按鍵按下
  71.               {
  72.                             delay(5);
  73.                             if(k1==0)//確認按鍵按下
  74.                             {
  75.                                          
  76.                                           while(!k1);//等待按鍵釋放
  77.                                           if(k4num==0&&TR0==1)//當計時開始,并且功能鍵記錄次數為零時,作用為控制時間
  78.                                           {
  79.                                                         if(flag1==1)//紅色時間暫停,藍色時間開始
  80.                                                                       flag1=0;
  81.                                                         }
  82.                                           if(k4num!=0&&TR0==0)//當計時暫停,并且功能鍵記錄次數不為零,作用為調節時間
  83.                                           {
  84.                                           switch(k4num)//根據功能鍵次數,增加相應數值
  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)//根據功能鍵次數,增加相應數值
  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)//總暫停開關
  142.               {
  143.                             delay(5);
  144.                             if(k3==1){
  145.                                           while(!k3);
  146.                                           TR0=~TR0;//控制時間暫停或是開始
  147.                                           k4num=0;//功能按鍵記錄次數清零
  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;//做標志,防止在調節時間時,調到零的時候,就進入子程序last()
  158.                                                         k4num++;//記錄功能按鍵按下次數
  159.                                                                       }
  160.                                                         if(k4num==5||TR0==1||flag2==1)//當帶五次按下或開始計時或某一方時間耗完,清零記錄次數
  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;//關閉計時
  176.                             TR1=0;//關閉時間顯示
  177.                             flag2=1;//標志比賽結束
  178.                             for(i=80;i>0;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;//關閉顯示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;//設置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();//將分和秒數值拆開,存入顯示緩沖區,等待顯示
  268.                             keyscan();//按鍵函數
  269.                             led();//功能指示led
  270.                             warn();//當時間少于十秒時,警告函數
  271.                             last();//比賽結束,顯示lose和win 函數
  272.                                           }
  273.                                           }
復制代碼
完整的Word格式文檔51黑下載地址:
龐智仁2016160111.doc (695 KB, 下載次數: 23)


評分

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

查看全部評分

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

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 少妇午夜一级艳片欧美精品 | 国产精品一区久久久久 | 久久精品91久久久久久再现 | 婷婷久久五月 | 欧美日韩国产精品一区二区 | 午夜精品久久久久久久星辰影院 | 国产乱码精品1区2区3区 | 天天综合久久 | 毛片一区 | 蜜桃五月天 | 日韩欧美在 | 欧美精品久久 | 国产资源在线播放 | 久热免费| 一区二区免费视频 | 亚洲成人福利视频 | 午夜视频导航 | av色在线 | 精品在线视频播放 | 欧美网站一区二区 | 日韩精品一区二区三区 | 久久久91精品国产一区二区三区 | 日日操天天射 | 免费视频一区二区 | 欧美黄 片免费观看 | 午夜在线视频 | 玖玖在线精品 | 亚洲欧美国产精品久久 | 免费一区 | 国产欧美一区二区三区久久手机版 | 免费一级片 | 久久久高清 | 欧美a在线| 精品免费在线 | 国产黄色在线观看 | 久久国产成人 | 人人性人人性碰国产 | 亚洲成人99 | 久久精品国产一区老色匹 | 国产日韩精品视频 | 欧美亚洲综合久久 |