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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

基于51單片機精確到0.1秒可回看記錄的秒表程序

[復制鏈接]
跳轉到指定樓層
樓主
基于51單片機精確到0.1秒可回看記錄的秒表程序
可回看計時記錄

下載:
miaobiao5.rar (20.28 KB, 下載次數: 21)

  1. #include <reg51.h>
  2. unsigned char code leddata[]= {  0x3F,  0x06,  0x5B,  0x4F, //0 1 2 3
  3.                                  0x66,  0x6D,  0x7D,  0x07,  //4 5 6 7
  4.                                  0x7F,  0x6F,  0x77,  0x7C,  //8 9 A b
  5.                                  0x39,  0x5E,  0x79,  0x71,  //c d E F
  6.                                  0x76,  0x38,  0x37,  0x3E,  //H L n u
  7.                                  0x73,  0x5C,  0x40,  0x00,  //P o - 清屏
  8.                               };
  9. #define digitData P0          //數碼管數據
  10. #define startBtn    0       //按鍵值
  11. #define resetBtn    1
  12. #define counterBtn  2
  13. sbit DX = P2^6;//段選
  14. sbit WX = P2^7;//位選
  15. sbit kaiShi = P3^4;//開始、暫停按鍵
  16. sbit chongZhi = P3^5;//重置按鍵
  17. sbit jiCi = P3^6;//計次、記錄查看按鍵
  18. unsigned int recode[8] = {0};//記錄數據
  19. unsigned char recodeNum = 0;//記錄數據值位置
  20. unsigned char showRe = 0; //查看哪項記錄值
  21. unsigned int times = 0; //當前計時時間
  22. unsigned int saveTimes = 0;//暫停查看記錄時保存時間數據
  23. unsigned char counter = 0;//定時器次數,構成100ms
  24. unsigned char shuanXi = 0,sXW = 1;//刷新數碼管
  25. unsigned char runState = 0;//0表示停止,1表示運行
  26. unsigned char keyTemp[3]= {0}; //按鍵按下狀態持續時間

  27. //六位數碼管顯示 dat:顯示內容下標 wei:哪一個數碼管
  28. void display(unsigned char dat,unsigned char wei)//wei 1-6
  29. {
  30.     digitData = 0xff; //關掉顯示 消除重影
  31.     WX = 1;
  32.     WX = 0;
  33.     //如果不先關閉顯示,不論先段選還位選(位選前關閉都不行),而且必須先送段選,再送位選,
  34.     //先位選則當前位置會顯示上次殘留段選數據 導致重影
  35.     digitData = leddata[dat];//段選
  36.     DX = 1;
  37.     DX = 0;
  38.     digitData = ~(1<<(wei-1));//位選
  39.     WX = 1;
  40.     WX = 0;
  41. }
  42. //判斷當前按鍵
  43. unsigned char scanKey()
  44. {
  45.     P3 = 0x70;//k1 k2 k3給高

  46.     if(kaiShi==0)//開始鍵按下
  47.     {
  48.         if(keyTemp[0] == 0) keyTemp[0]=1 ;//按鍵按下 開始記延時
  49.     }
  50.     else
  51.     {
  52.         keyTemp[0] = 0; //有抖動重新延時
  53.     }

  54.     if(chongZhi==0)
  55.     {
  56.         if(keyTemp[1] == 0) keyTemp[1]=1 ;
  57.     }
  58.     else
  59.     {
  60.         keyTemp[1] = 0;
  61.     }

  62.     if(jiCi==0)
  63.     {
  64.         if(keyTemp[2] == 0) keyTemp[2]=1 ;
  65.     }
  66.     else
  67.     {
  68.         keyTemp[2] = 0;
  69.     }
  70.     if(keyTemp[0]>5) return startBtn;  //5次 5*2ms 超過10ms 消抖
  71.     if(keyTemp[1]>5) return resetBtn;
  72.     if(keyTemp[2]>5) return counterBtn;
  73.     return 0xFF; //沒有按鍵
  74. }
  75. void Timer0Init(void)        //2毫秒@11.0592MHz
  76. {
  77.     //AUXR &= 0x7F;        //定時器時鐘12T模式
  78.     TMOD &= 0xF0;        //設置定時器模式
  79.     TMOD |= 0x01;        //設置定時器模式
  80.     TL0 = 0xCF;        //設置定時初值
  81.     TH0 = 0xF8;        //設置定時初值
  82.     TF0 = 0;        //清除TF0標志
  83.     TR0 = 1;        //定時器0開始計時
  84.     ET0 = 1;         //運行定時器0中斷
  85.     EA = 1;         //開全局中斷
  86. }

  87. void main()
  88. {
  89.     unsigned char keyValue = 0xFF,keyT = 0xFF;//按鍵值
  90.     unsigned char weiXian[6] = {0,22,0,0,22,0};
  91.     Timer0Init();
  92.     while(1)
  93.     {
  94.         if(shuanXi)//刷新sXW位置的數碼管中
  95.         {
  96.             if(times>=6000) //十分鐘
  97.             {
  98.                 times = 0;
  99.             }
  100.             weiXian[0] = times/600;//分鐘
  101.             weiXian[2] = times/10%60/10;
  102.             weiXian[3] = times/10%60%10;
  103.             weiXian[5] = times%10;
  104.             display(weiXian[sXW-1],sXW);
  105.             shuanXi = 0;
  106.         }
  107.         keyT = scanKey();//當前按鍵值
  108.         if(keyT!=keyValue)//當前按鍵值與上次按鍵值不同,則表示按鍵狀態改變。需要做按鍵處理
  109.         {
  110.             keyValue = keyT;
  111.             //P1 = keyValue;
  112.             switch(keyValue)//按鍵處理
  113.             {
  114.             case startBtn://開始暫停按下
  115.                 //if(runState) TR0 = 0; else TR0 = 1;
  116.                 //runState ? (TR0 = 0) : (TR0 = 1);
  117.                 runState = !runState;//改變狀態
  118.                 if(runState)//恢復時間
  119.                 {
  120.                     times = saveTimes;
  121.                 }
  122.                 else//保存時間
  123.                 {
  124.                     saveTimes = times;
  125.                 }

  126.                 break;
  127.             case resetBtn:  //重置
  128.                 if(!runState)
  129.                 {
  130.                     times = 0;
  131.                     saveTimes = 0;
  132.                     recodeNum = 0;
  133.                     P1 = 0xFF;
  134.                 }
  135.                 break;
  136.             case counterBtn:  //記錄或查看記錄
  137.                 if(runState)//運行時,記錄
  138.                 {
  139.                     if(recodeNum<8)
  140.                     {
  141.                         recode[recodeNum++] = times;
  142.                         P1 = (0xFF<<recodeNum);//點亮recodeNum個燈
  143.                     }
  144.                 }
  145.                 else//暫停查看記錄
  146.                 {
  147.                     P1 = (0xFF ^(1 << showRe));//點亮showRe位置的燈
  148.                     times = recode[showRe++];
  149.                     if(showRe >= recodeNum)
  150.                     {
  151.                         showRe = 0;//循環查看記錄
  152.                     }
  153.                 }
  154.                 break;
  155.             }
  156.         }
  157.     }

  158. }
  159. void T0_2ms() interrupt 1
  160. {
  161.     //定時器重新賦初值 放在終端服務程序最開始有利于降低定時中斷誤差
  162.     TL0 = 0xCF;        //設置定時初值
  163.     TH0 = 0xF8;        //設置定時初值
  164.     if(++counter>=50 && runState)//運行狀態下100ms 加0.1秒
  165.     {
  166.         times++;
  167.         counter = 0;
  168.     }
  169.     shuanXi = 1;//數碼管周期刷新
  170.     if(++sXW>6) //六位循環刷新
  171.     {
  172.         sXW = 1;
  173.     }
  174.     if(keyTemp[0]) keyTemp[0]++;//按鍵持續
  175.     if(keyTemp[1]) keyTemp[1]++;//按鍵持續
  176.     if(keyTemp[2]) keyTemp[2]++;//按鍵持續

  177. }
復制代碼


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

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 乱码av午夜噜噜噜噜动漫 | 黄视频免费观看 | 欧美不卡网站 | 久久aⅴ乱码一区二区三区 亚洲国产成人精品久久久国产成人一区 | av 一区二区三区 | 成人av一区 | 亚洲欧美日韩久久 | 蜜桃官网 | 日韩成人免费 | 羞羞视频在线观看免费观看 | 国产精品国产a级 | 日韩在线资源 | 中文字幕视频在线 | 日韩精品一区二区三区在线观看 | 欧美伊人久久久久久久久影院 | 99久久免费精品 | 可以免费观看的av片 | 久久国产婷婷国产香蕉 | 欧美久久影院 | 日本黄视频在线观看 | 日日日干干干 | 国产精品不卡 | 国产亚洲一区二区三区 | 国产一区中文 | 欧美一二区 | 观看av| 亚洲精品9999 | 日本一区二区视频 | 国产精品国产三级国产aⅴ无密码 | 亚洲精品456 | 国产精品视频一区二区三区不卡 | 婷婷五月色综合香五月 | 国产精品视频一区二区三区 | 欧美一区二区三区的 | 91精品国产综合久久国产大片 | 成人在线免费电影 | 岛国av在线免费观看 | 成人免费淫片aa视频免费 | 日韩视频一区二区 | 欧美性猛交一区二区三区精品 | 日本二区|