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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 7514|回復: 7
收起左側

51單片機秒表程序設計 有四個按鍵分別是計次,顯示多次計次時間,復位,啟停

  [復制鏈接]
ID:711823 發表于 2020-5-15 16:29 | 顯示全部樓層 |閱讀模式
功能:秒表精確到10ms,有四個按鍵分別是計次,顯示多次計次時間,復位,啟停。

仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
123.png

5.png

12.png

單片機源程序如下:
  1. #include<reg52.h>

  2. sbit KEY1 = P3^0;  //計次
  3. sbit KEY2 = P3^1;  //從快到慢顯示計次數
  4. sbit KEY3 = P3^2;  //復位
  5. sbit KEY4 = P3^3;  //啟停秒表
  6. unsigned char code LedChar[] = {  //數碼管顯示字符轉換表
  7.     0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8,
  8.     0x80, 0x90, 0x88, 0x83, 0xC6, 0xA1, 0x86, 0x8E
  9. };
  10. unsigned char LedBuff[6] = {  //數碼管顯示緩沖區
  11.     0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF
  12. };
  13. unsigned char KeySta[4] = {1,1,1,1};  //當前按鍵狀態
  14. unsigned char T0RH = 0;
  15. unsigned char T0RL = 0;
  16. bit kd = 0;
  17. bit lk = 1;
  18. bit stopwatchRefresh = 1;
  19. bit stopwatchRunning = 0;
  20. unsigned char DecimalPart = 0;
  21. unsigned int  IntegerPart = 0;

  22. void ConfigTimer0(unsigned int ms);
  23. void stopwatchDisplay();
  24. void KeyDriver();
  25. void main()
  26. {
  27.         EA = 1;
  28.         ConfigTimer0(2);
  29.         while(1)
  30.         {
  31.                 if(stopwatchRefresh)
  32.                 {
  33.                         stopwatchRefresh = 0;
  34.                         stopwatchDisplay();
  35.                 }
  36.                 KeyDriver();
  37.         }
  38. }
  39. void ConfigTimer0(unsigned int ms)
  40. {
  41.         unsigned long tmp;
  42.        
  43.         tmp = 11059200/12;
  44.         tmp = (tmp*ms)/1000;
  45.         tmp = 65536 - tmp;
  46.         tmp +=18;      //定時誤差補償
  47.        
  48.         T0RH = (unsigned char)(tmp>>8);
  49.         T0RL = (unsigned char)tmp;
  50.         TMOD &=0xf0;
  51.   TMOD |=0X01;
  52.         TH0 = T0RH;
  53.         TL0 = T0RL;
  54.         ET0 = 1;
  55.         TR0 = 1;
  56. }
  57. void stopwatchDisplay()
  58. {
  59.         signed char i;
  60.         unsigned char buf[4];
  61.         LedBuff[0] = LedChar[DecimalPart%10];
  62.         LedBuff[1] = LedChar[DecimalPart/10];
  63.         buf[0] = IntegerPart%10;
  64.         buf[1] = IntegerPart/10%10;
  65.         buf[2] = IntegerPart/100%10;
  66.         buf[3] = IntegerPart/1000%10;
  67.         for(i=3;i>=1;i--)
  68.         {
  69.                 if(buf[i]==0)
  70.                 {
  71.                         LedBuff[i+2]=0xFF;
  72.                 }else break;
  73.         }
  74.         for(;i>=0;i--)
  75.         {
  76.                 LedBuff[i+2] = LedChar[buf[i]];
  77.         }
  78.          LedBuff[2] &=0x7f;
  79. }
  80. void Stopwatchjc()
  81. {
  82.         signed char i;
  83.         unsigned char buf[4];
  84.         static unsigned char Dec[10] = 0;
  85.   static unsigned int  Int[10] = 0;
  86.         static char cnt = 0;
  87.         static char cnt1 = 0;
  88.         Dec[cnt] = DecimalPart;
  89.         Int[cnt] = IntegerPart;
  90.         cnt++;
  91.         if(kd == 1)
  92.         {
  93.                 LedBuff[0] = LedChar[Dec[cnt1]%10];
  94.                 LedBuff[1] = LedChar[Dec[cnt1]/10];
  95.                 buf[0] = Int[cnt1]%10;
  96.                 buf[1] = Int[cnt1]/10%10;
  97.                 buf[2] = Int[cnt1]/100%10;
  98.                 buf[3] = Int[cnt1]/1000%10;
  99.                 for(i=3;i>=1;i--)
  100.                 {
  101.                         if(buf[i]==0)
  102.                         {
  103.                                 LedBuff[i+2]=0xFF;
  104.                         }else break;
  105.                 }
  106.                 for(;i>=0;i--)
  107.                 {
  108.                         LedBuff[i+2] = LedChar[buf[i]];
  109.                 }
  110.                  LedBuff[2] &=0x7f;
  111.                
  112.                 cnt1++;
  113.                
  114.         }                       
  115.        
  116.        
  117. }
  118. void Stopwatchsy()
  119. {
  120.         stopwatchRunning = 0;
  121.         kd = 1;
  122.         stopwatchRefresh = 1;       
  123. }
  124. void StopwatchAction()
  125. {
  126.         stopwatchRunning = ~stopwatchRunning;
  127. }
  128. void StopwatchReset()
  129. {
  130.         stopwatchRunning = 0;
  131.         lk = 0;
  132.         DecimalPart = 0;
  133.         IntegerPart = 0;
  134.         stopwatchRefresh = 1;       
  135. }

  136. void KeyDriver()     //按鍵驅動函數
  137. {
  138.           static unsigned char backup[4] = {1,1,1,1}; //按鍵值備份,保存前一次的掃描值
  139.     unsigned char i;
  140.             for(i=0;i<4;i++)
  141.                         {
  142.         if (KeySta[i] != backup[i])  //當前值與前次值不相等說明此時按鍵有動作
  143.         {
  144.             if (backup[i] == 0)   //如果前次值為0,則說明當前是彈起動作
  145.             {
  146.                                                           if(i==0)
  147.                                                                   Stopwatchjc();      //計次
  148.                                                                 else if(i==1)
  149.                                                                   Stopwatchsy();      //從快到慢
  150.                                                           else if(i==2)         //復位
  151.                                                                         StopwatchReset();
  152.                                                                 else if(i==3)                                        //啟停秒表
  153.                                                                         StopwatchAction();
  154.                                                                
  155.             }
  156.             backup[i] = KeySta[i];   //更新備份為當前值,以備進行下次比較
  157.         }
  158.                         }
  159. }
  160. void LedScan()
  161. {
  162.           static unsigned char i=0;
  163.           P0 = 0xFF;
  164.                 switch(i)       //每過1ms從低到高位刷新一個數碼管
  165.                 {
  166.                         case 0:P2=0x01;i++; P0=        LedBuff[0]; break;
  167.                         case 1:P2=0x02;i++; P0=        LedBuff[1]; break;
  168.                         case 2:P2=0x04;i++; P0=        LedBuff[2]; break;
  169.                         case 3:P2=0x08;i++; P0=        LedBuff[3]; break;
  170.                         case 4:P2=0x10;i++; P0=        LedBuff[4]; break;
  171.                         case 5:P2=0x20;i=0; P0=        LedBuff[5]; break;
  172.                         default :break;
  173.                 }
  174. }
  175. void KeyScan()
  176. {
  177.         static unsigned char keybuf[4] ={ 0xFF,0xFF,0xFF,0xFF};  //掃描緩沖區,保存一段時間內的掃描值
  178.   static unsigned char i=0;
  179.         keybuf[0] = (keybuf[0]<<1) | KEY1;  //緩沖區左移一位,并將當前掃描值移入最低位
  180.         keybuf[1] = (keybuf[1]<<1) | KEY2;  //緩沖區左移一位,并將當前掃描值移入最低位
  181.         keybuf[2] = (keybuf[2]<<1) | KEY3;  //緩沖區左移一位,并將當前掃描值移入最低位
  182.         keybuf[3] = (keybuf[3]<<1) | KEY4;  //緩沖區左移一位,并將當前掃描值移入最低位
  183.         for(i=0;i<4;i++)
  184.         {
  185.                 if (keybuf[i] == 0x00)
  186.                 {   //連續8次掃描值都為0,即16ms內都只檢測到按下狀態時,可認為按鍵已按下
  187.                                 KeySta[i] = 0;
  188.                 }
  189.                 else if (keybuf[i] == 0xFF)
  190.                 {   //連續8次掃描值都為1,即16ms內都只檢測到彈起狀態時,可認為按鍵已彈起
  191.                                 KeySta[i] = 1;
  192.                 }
  193.                 else
  194.                 {}  //其它情況則說明按鍵狀態尚未穩定,則不對KeySta變量值進行更新
  195.         }
  196. }
  197. void StowatchCount()
  198. {
  199.         if(stopwatchRunning)
  200.         {
  201.                 DecimalPart++;
  202.                 if(DecimalPart>=100)
  203.                 {
  204.                         DecimalPart=0;
  205.                         IntegerPart++;
  206.                         if(IntegerPart>=10000)
  207.                         {
  208.                                 IntegerPart=0;
  209.                         }
  210.                 }
  211.                 stopwatchRefresh=1;
  212.         }
  213. }
  214. void InterruptTimer0() interrupt 1
  215. {
  216.         static unsigned char ter10ms = 0;
  217.         TH0 = T0RH;  //重新加載重載值
  218.         TL0 = T0RL;
  219.         LedScan();   //數碼管掃描顯示
  220.         KeyScan();   //按鍵掃描
  221.         ter10ms++;
  222.         if (ter10ms>=5)
  223.         {
  224.                 ter10ms = 0;
  225.                 StowatchCount();
  226.         }
  227. }
復制代碼

所有資料51hei提供下載:
51秒表.rar (70.02 KB, 下載次數: 179)

評分

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

查看全部評分

回復

使用道具 舉報

ID:749164 發表于 2020-5-17 19:42 | 顯示全部樓層
仿真文件打不開呀 樓主你看看?
回復

使用道具 舉報

ID:711823 發表于 2020-5-21 10:06 | 顯示全部樓層
furuiabc 發表于 2020-5-17 19:42
仿真文件打不開呀 樓主你看看?

你是用的proteus 8.0嗎
回復

使用道具 舉報

ID:711823 發表于 2020-5-21 10:19 | 顯示全部樓層
SAFASDF 發表于 2020-5-21 10:06
你是用的proteus 8.0嗎

Proteus 8.0及以上版本生成的仿真電路圖文件類型是Proteus Project(.pdsprj),是無法生成 .DSN 文件的
我傳的是(.pdsprj)文件
回復

使用道具 舉報

ID:362692 發表于 2020-5-21 10:59 來自手機 | 顯示全部樓層
furuiabc 發表于 2020-5-17 19:42
仿真文件打不開呀 樓主你看看?

下載功能沒了嗎
回復

使用道具 舉報

ID:446774 發表于 2020-6-10 09:58 | 顯示全部樓層
你好樓主
回復

使用道具 舉報

ID:316613 發表于 2020-11-4 18:02 | 顯示全部樓層
大佬太牛逼了,解決了燃眉之急,也學習了代碼看起來好復雜,沒備注真不好看呢。但是大佬牛逼!
回復

使用道具 舉報

ID:316613 發表于 2020-11-4 18:19 | 顯示全部樓層
親測有效!需要按下查詢按鍵在按下記次按鍵就能看到記次的值了 5次是沒問題的
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 日韩精品在线一区 | 国产福利小视频 | 久久久久亚洲视频 | 欧美性久久 | 精品国产第一区二区三区 | 日韩精品 电影一区 亚洲 | 国产专区在线 | 亚洲一区二区三区视频在线 | 91精品国产自产精品男人的天堂 | 成人欧美一区二区三区在线播放 | 国产第二页 | 成年人视频在线免费观看 | 超碰人人插 | 五月综合久久 | 日韩精品久久久 | 一区在线播放 | 久久国产区 | 亚洲美女一区二区三区 | 一区二区三区视频在线 | 国产成人综合亚洲欧美94在线 | 国产欧美一区二区三区日本久久久 | 亚洲91| 亚洲欧美国产精品一区二区 | 538在线精品| 欧美成人综合 | 日韩中文一区二区三区 | 午夜视频网站 | 色综合成人网 | 亚洲精品一 | 日韩一区在线播放 | 国产91丝袜在线18 | 色欧美综合 | 国产精品久久久久久久久久尿 | 国产精品视频一区二区三区, | 狠狠撸在线视频 | av一区二区三区在线观看 | 婷婷久久五月 | 国产精品久久久久久久久久久久久 | 国产男女猛烈无遮掩视频免费网站 | 日韩免费视频一区二区 | 国产精品久久久久久久久污网站 |