找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3679|回復(fù): 2
收起左側(cè)

51單片機(jī)設(shè)計(jì),計(jì)時(shí)器,計(jì)分器視頻教程與proteus仿真及源代碼

[復(fù)制鏈接]
ID:256527 發(fā)表于 2017-12-8 13:16 | 顯示全部樓層 |閱讀模式
該項(xiàng)目基本滿足以下要求
1.一個(gè)四位一體數(shù)碼管顯示比賽時(shí)間,時(shí)間格式如:15:00,兩個(gè)三位一體數(shù)碼管顯示甲乙兩對的比分,比分格式如:008。
2.比賽時(shí)間采用倒計(jì)時(shí)方式,以一秒的頻率減時(shí),上電時(shí)默認(rèn)初值為15:00.
3.甲乙隊(duì)比分采用三位數(shù),上電初值為000,最大值為999,滿足常理要求,未開始比賽以及比賽結(jié)束后比分無法加減,
4.比賽未開始之前,可以通過ADD1、DEC1鍵對比較時(shí)間的分鐘進(jìn)調(diào)時(shí),通過ADD2、DEC2鍵對比較時(shí)間的秒進(jìn)行調(diào)時(shí)。
5.可隨時(shí)暫停/啟動(dòng)比賽時(shí)間。
6.比賽進(jìn)行時(shí),可以通過ADD1、DEC1鍵對甲隊(duì)比分加、減,可以通過ADD2、DEC2對乙隊(duì)比分加、減。每按一次鍵,加/減1分。
7.當(dāng)一節(jié)比賽完后,可以通過(EXCHANGE)換場鍵換場,換場后,比分交換顯示,交換后,下一節(jié)比賽開始時(shí),相應(yīng)的比分加減鍵也隨之交換。
8.當(dāng)比賽結(jié)束時(shí),發(fā)出報(bào)警。

對齊9.jpg

視頻教程下載地址:http://www.torrancerestoration.com/bbs/dpj-100315-1.html

單片機(jī)源程序如下:
  1. /*
  2. 倒計(jì)時(shí)計(jì)算器,數(shù)碼管顯示 默認(rèn)值15:00

  3. 共陽數(shù)碼管

  4. */
  5. #include <reg52.h>


  6. void delay(int ms);
  7. void dispaly(char min,char sec,int sco1,int sco2);
  8. void key_scan(void);


  9. /*共陽極數(shù)碼管的0-9數(shù)字編碼*/
  10. code unsigned char table[] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};

  11. sbit s8 = P3^6;
  12. sbit s9 = P3^7;
  13. sbit buz = P3^4;


  14. char m = 15;   //默認(rèn)的分鐘
  15. char sec = 0;  //默認(rèn)的秒鐘

  16. int sc1 = 0;   //默認(rèn)甲方的比分
  17. int sc2 = 0;   //默認(rèn)乙方的比分

  18. char buz_flag = 0; //默認(rèn)報(bào)警標(biāo)志為0,不報(bào)警
  19. char status = 0;  //狀態(tài)標(biāo)志,0的時(shí)候表示非比賽狀態(tài),1表示比賽狀態(tài)


  20. int main(void)
  21. {        
  22.         /*使用定時(shí)器進(jìn)行計(jì)時(shí)*/
  23.         //初始化定時(shí)器0
  24.         TMOD=0xf1;  //設(shè)置T0為工作方式1    16位的定時(shí)器模式
  25.     TH0=(65535-50000)/256;     //50ms中斷一次  
  26.     TL0=(65535-50000)%256;      
  27.     /*Timer0工作在模式0下時(shí)為13位定時(shí)/計(jì)數(shù)器,
  28.     TL0只使用前5位,故對32進(jìn)行求余/模    */  
  29.   
  30.      
  31.     ET0=1;      //開定時(shí)器0中斷  
  32.             
  33.         P3 = 0x3f;
  34.         
  35.         /*外部中斷0 的初始化*/
  36.         IT0 = 1;                           //設(shè)置為下降沿觸發(fā)
  37.     EX0 = 1;                           //外部中斷0中斷允許位
  38.         
  39.         
  40.         EA=1;       //開總中斷
  41. //        TR0=1;      //啟動(dòng)定時(shí)器0

  42.         while(1)
  43.         {
  44.                 dispaly(m,sec,sc1,sc2);
  45.                 key_scan();
  46.                 if(buz_flag)
  47.                 {
  48.                         buz = 0;
  49.                 }
  50.         }

  51. }


  52. /*按鍵掃描*/
  53. void key_scan(void)
  54. {
  55.         static char key_flag = 0;  //按鍵按下標(biāo)志 ,檢測到按下之后為1,否則為0
  56.         static char key_count = 0;
  57.         static unsigned char key_val = 0;   //檢測到按鍵之后保存的按鍵值
  58.         int t;
  59.         
  60.         P1  = 0xff;
  61.         
  62.         if(P1 != 0xff)   //有按鍵按下了
  63.         {
  64.                 if(key_flag == 1) //表示已經(jīng)檢測到按鍵了
  65.                 {
  66.                         key_count++;
  67.                         if(key_count > 15)
  68.                         {
  69.                                 key_count = 0;
  70.                                 if(P1 == key_val)   //確實(shí) 有按鍵按下了
  71.                                 {
  72.                                         switch(key_val)  //進(jìn)行按鍵處理
  73.                                         {
  74.                                                 case 0xfe:
  75.                                                         //add1
  76.                                                         if(status)
  77.                                                         {
  78.                                                                 sc1 += 1;
  79.                                                         }
  80.                                                         else
  81.                                                         {
  82.                                                                 m += 1;
  83.                                                         }
  84.                                                         break;
  85.                                                 case 0xfd:
  86.                                                         //dec1
  87.                                                         if(status)
  88.                                                         {        
  89.                                                                 if(sc1 > 0)
  90.                                                                 {
  91.                                                                         sc1 -= 1;
  92.                                                                 }
  93.                                                         }
  94.                                                         else
  95.                                                         {
  96.                                                                 if(m>0)
  97.                                                                 {
  98.                                                                         m -= 1;
  99.                                                                 }
  100.                                                         }
  101.                                                         break;
  102.                                                 case 0xfb:
  103.                                                         //add2
  104.                                                         if(status)
  105.                                                         {
  106.                                                                 sc2 += 1;
  107.                                                         }
  108.                                                         else
  109.                                                         {
  110.                                                                 if(sec<59)
  111.                                                                 {
  112.                                                                         sec += 1;                                                
  113.                                                                 }
  114.                                                         }
  115.                                                         break;
  116.                                                 case 0xf7:
  117.                                                         //dec2
  118.                                                         if(status)
  119.                                                         {        
  120.                                                                 if(sc2 > 0)
  121.                                                                 {
  122.                                                                         sc2 -= 1;
  123.                                                                 }
  124.                                                         }
  125.                                                         else
  126.                                                         {
  127.                                                                 if(sec>0)
  128.                                                                 {
  129.                                                                         sec -= 1;
  130.                                                                 }
  131.                                                         }
  132.                                                         break;
  133.                                                 case 0xef:
  134.                                                         //exchang
  135.                                                         t = sc1;
  136.                                                         sc1 = sc2;
  137.                                                         sc2 = t;
  138.                                                         break;
  139.                                         }
  140.                                 }
  141.                                 else
  142.                                 {
  143.                                         key_val = 0;  //還原默認(rèn)值
  144.                                         key_flag = 0;  //還原默認(rèn)值
  145.                                         key_count = 0;
  146.                                 }
  147.                         }
  148.                         
  149.                 }
  150.                 else
  151.                 {
  152.                         key_val = P1;  //保存按鍵的值
  153.                         key_flag = 1;  //檢測到了按鍵
  154.                 }
  155.         }
  156.         else
  157.         {
  158.                 key_val = 0;  //還原默認(rèn)值
  159.                 key_flag = 0;  //還原默認(rèn)值
  160.                 key_count = 0;
  161.         }
  162.         
  163. }



  164. void exint0() interrupt 0                //中斷服務(wù)函數(shù)的書寫格式
  165. {
  166. //    if(IE0 == 1)                      //產(chǎn)生了外部中斷,IE 自動(dòng)置為1
  167.     {
  168.         if(status)
  169.                 {
  170.                         status = 0 ;  //切換到非比賽狀態(tài)
  171.                         TR0 = 0   ;   //關(guān)閉定時(shí)器0
  172.                 }        
  173.                 else
  174.                 {
  175.                         status = 1 ;  //切換到非比賽狀態(tài)
  176.                         TR0 = 1   ;   //啟動(dòng)定時(shí)器1
  177.                 }
  178.     }
  179. }


  180. char counter = 0;

  181. /******T0中斷函數(shù)*******/  
  182. void Timer0()interrupt 1  
  183. {  
  184.     TH0=(65535-50000)/256;     //50ms中斷一次  
  185.     TL0=(65535-50000)%256;  
  186.     counter++;  
  187.     while(counter>=20)  
  188.     {  
  189.         counter=0;
  190.                 if(sec == 0)
  191.                 {
  192.                         m --;
  193.                         sec = 60;
  194.                         if(m == 0)
  195.                         {
  196.                                 buz_flag = 1;    //報(bào)警標(biāo)志設(shè)置
  197.                         }
  198.                 }
  199.         sec--;  
  200.     }  
  201. }  



  202. //led數(shù)碼管顯示,4個(gè)參數(shù)分別表示分鐘秒鐘,分?jǐn)?shù)1和分?jǐn)?shù)2
  203. void dispaly(char min,char sec,int sco1,int sco2)
  204. {
  205.         char buf[10];
  206.         char i;
  207.         
  208.         buf[0] = min/10%10;  //分鐘的十位
  209.         buf[1] = min%10;     //分鐘的各位
  210.         buf[2] = sec/10%10;  //秒鐘的十位
  211.         buf[3] = sec%10;     //秒鐘的各位        
  212.         buf[4] = sco1/100%10;  //分?jǐn)?shù)1的百位
  213.         buf[5] = sco1/10%10;     //分?jǐn)?shù)1的十位        
  214.         buf[6] = sco1%10;      //分?jǐn)?shù)1的個(gè)位
  215.         buf[7] = sco2/100%10;  //分?jǐn)?shù)2的百位
  216.         buf[8] = sco2/10%10;     //分?jǐn)?shù)2的十位        
  217.         buf[9] = sco2%10;      //分?jǐn)?shù)2的個(gè)位        
  218.         
  219.         for(i=0;i<8;i++)
  220.         {
  221.                 P0 = table[buf[i]];
  222.                 P2 = 1<<i;
  223.                 delay(1);
  224.                 P2 = 0;               
  225.         }
  226. ……………………

  227. …………限于本文篇幅 余下代碼請從51黑下載附件…………
復(fù)制代碼

所有資料51hei提供下載:
4.bisaijifenqi.rar (31.68 KB, 下載次數(shù): 23)
4.bisaijifenqi-1208.rar (25.22 KB, 下載次數(shù): 19)
在單片機(jī)視頻中的項(xiàng)目二部分,有源代碼及完整的視頻,謝謝大家,希望大家共同進(jìn)步




評分

參與人數(shù) 1黑幣 +5 收起 理由
a756312364 + 5

查看全部評分

回復(fù)

使用道具 舉報(bào)

ID:257065 發(fā)表于 2017-12-9 16:48 | 顯示全部樓層
親,你的工程文件用什么打開啊
回復(fù)

使用道具 舉報(bào)

ID:257065 發(fā)表于 2017-12-9 22:35 | 顯示全部樓層
打開就彈出這個(gè)窗口,百度不出來哪的問題
1.png
回復(fù)

使用道具 舉報(bào)

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

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表