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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1534|回復: 1
打印 上一主題 下一主題
收起左側(cè)

基于51單片機的秒表記次+數(shù)碼管+按鍵 Proteus仿真程序

[復制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:316613 發(fā)表于 2024-1-2 16:22 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)


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

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

  24. void ConfigTimer0(unsigned int ms);
  25. void stopwatchDisplay();
  26. void KeyDriver();

  27. void main()
  28. {
  29.         EA = 1;
  30.         ConfigTimer0(2);
  31.         while(1)
  32.         {
  33.                 if(stopwatchRefresh)
  34.                 {
  35.                         stopwatchRefresh = 0;
  36.                         stopwatchDisplay();
  37.                 }
  38.                 KeyDriver();
  39.         }
  40. }




  41. void ConfigTimer0(unsigned int ms)
  42. {
  43.         unsigned long tmp;
  44.         
  45.         tmp = 11059200/12;
  46.         tmp = (tmp*ms)/1000;
  47.         tmp = 65536 - tmp;
  48.         tmp +=18;      //定時誤差補償
  49.         
  50.         T0RH = (unsigned char)(tmp>>8);
  51.         T0RL = (unsigned char)tmp;
  52.         TMOD &=0xf0;
  53.   TMOD |=0X01;
  54.         TH0 = T0RH;
  55.         TL0 = T0RL;
  56.         ET0 = 1;
  57.         TR0 = 1;
  58. }
  59. void stopwatchDisplay()
  60. {
  61.         signed char i;
  62.         unsigned char buf[4];
  63.         LedBuff[0] = LedChar[DecimalPart%10];
  64.         LedBuff[1] = LedChar[DecimalPart/10];
  65.         buf[0] = IntegerPart%10;
  66.         buf[1] = IntegerPart/10%10;
  67.         buf[2] = IntegerPart/100%10;
  68.         buf[3] = IntegerPart/1000%10;
  69.         for(i=3;i>=1;i--)
  70.         {
  71.                 if(buf[i]==0)
  72.                 {
  73.                         LedBuff[i+2]=0xFF;
  74.                 }else break;
  75.         }
  76.         for(;i>=0;i--)
  77.         {
  78.                 LedBuff[i+2] = LedChar[buf[i]];
  79.         }
  80.          LedBuff[2] &=0x7f;
  81. }

  82. void Stopwatchjc()
  83. {

  84.         signed char i;
  85.         unsigned char buf[4];
  86.         static unsigned char Dec[10] = 0;
  87.   static unsigned int  Int[10] = 0;
  88.         static char cnt = 0;
  89.         static char cnt1 = 0;
  90.         Dec[cnt] = DecimalPart;
  91.         Int[cnt] = IntegerPart;
  92.         cnt++;
  93.         if(kd == 1)
  94.         {        
  95.                 LedBuff[0] = LedChar[Dec[cnt1]%10];
  96.                 LedBuff[1] = LedChar[Dec[cnt1]/10];
  97.                 buf[0] = Int[cnt1]%10;
  98.                 buf[1] = Int[cnt1]/10%10;
  99.                 buf[2] = Int[cnt1]/100%10;
  100.                 buf[3] = Int[cnt1]/1000%10;
  101.                 for(i=3;i>=1;i--)
  102.                 {
  103.                         if(buf[i]==0)
  104.                         {
  105.                                 LedBuff[i+2]=0xFF;
  106.                         }else break;
  107.                 }
  108.                 for(;i>=0;i--)
  109.                 {
  110.                         LedBuff[i+2] = LedChar[buf[i]];
  111.                 }
  112.                  LedBuff[2] &=0x7f;
  113.                
  114.                 cnt1++;
  115.         
  116.         
  117.         }               

  118.         
  119. }
  120. void Stopwatchsy()
  121. {
  122.         stopwatchRunning = 0;
  123.         kd = 1;
  124.         stopwatchRefresh = 1;        
  125. }
  126. void StopwatchAction()
  127. {
  128.         stopwatchRunning = ~stopwatchRunning;
  129. }
  130. void StopwatchReset()
  131. {

  132.         stopwatchRunning = 0;
  133.         lk = 0;
  134.         
  135.         DecimalPart = 0;
  136.         IntegerPart = 0;
  137.         stopwatchRefresh = 1;        


  138. }

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


仿真程序: 秒表記次+數(shù)碼管+51+按鍵.7z (63.29 KB, 下載次數(shù): 31)

評分

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

查看全部評分

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

使用道具 舉報

沙發(fā)
ID:1107746 發(fā)表于 2024-1-3 12:54 | 只看該作者
博主,有仿真圖的完整原圖嗎?
回復

使用道具 舉報

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

本版積分規(guī)則

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

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

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 中文字幕精品一区久久久久 | 亚洲国产精品99久久久久久久久 | 久久久国产精品一区 | 欧美www在线 | 99久久免费观看 | 日韩一区二区av | 日日夜夜天天 | 久草福利| 欧美高清视频一区 | 成人黄色av网址 | 亚洲视频区 | 日韩欧美在线观看 | 国产片淫级awww | 国产在线中文字幕 | 亚洲精品日韩在线 | 午夜精品三区 | 久久亚洲一区二区三区四区 | 蜜桃特黄a∨片免费观看 | 免费国产一区二区 | 久久99精品久久久久久国产越南 | 国产亚洲精品美女久久久久久久久久 | 久久亚洲天堂 | 99九九视频 | 福利精品 | 三级视频网站 | 天天操天天插 | 视频在线一区二区 | 国产精品久久久久久久久久久久久 | 91影院在线观看 | 午夜影视网 | 色888www视频在线观看 | 亚洲精品国产a久久久久久 午夜影院网站 | 视频在线一区二区 | 羞羞午夜| 我要看黄色录像一级片 | 国产精品一区一区 | 色综合网站 | 99爱免费| 国产成人aⅴ | 极品国产视频 | h漫在线观看 |