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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 8579|回復: 2
收起左側

單片機電子秒表仿真及源程序 實現0.01S~59分的計時 帶3按鍵

[復制鏈接]
ID:140725 發表于 2017-3-18 04:03 | 顯示全部樓層 |閱讀模式
給51黑電子論壇的朋友們分享一個51單片機做的電子秒表程序,帶開始和停止和清除3個按鍵,可以實現0.01S~59分的計時。下面是該電子秒表的仿真原理圖:
0.png

單片機秒表主程序:
  1. /****************************************************
  2. *實例名稱:秒表
  3. *實例說明:本實例實現0.01S~59分的計時。按下Start鍵時
  4. 開始計數,此時按下Stop鍵時停止計時,按下Clear鍵時清零
  5. 顯示屏。Start鍵和Stop鍵分別通過外部中斷0和外部中斷1來
  6. 實現操作
  7. *作者:kxm
  8. *時間:09.06.13
  9. ****************************************************/
  10. #include "target.h"
  11. #include "led.h"
  12. /*時鐘顯示數字區,從左至右為:分高位,分低位;秒高位,秒低位;毫秒高位,毫秒低位*/
  13. uchar clock_time[8]={'0','0',0x01,'0','0',0x01,'0','0'};
  14. const uchar displayMode=0x24;
  15. void main()
  16. {
  17.   uchar i;
  18.   target_init();
  19.   led_init();
  20.   sei();
  21.   while(1)
  22.   {
  23.    if(CLEAR_KEY==0)
  24.    {
  25.      for(i=0;i<200;i++);
  26.          if(CLEAR_KEY==0)
  27.          {
  28.            clock_time[MS_H]='0';
  29.            clock_time[MS_L]='0';
  30.            clock_time[S_H]='0';
  31.            clock_time[S_L]='0';
  32.            clock_time[MIN_H]='0';
  33.            clock_time[MIN_L]='0';
  34.          }
  35.    }
  36.    ledSweepDisplay(clock_time,displayMode,0x08);
  37.   }
  38. }
  39. void T0_OverFlow(void) interrupt 1 //定時器0溢出中斷,延時10ms
  40. {
  41.   TH0=0xDC;
  42.   TL0=0x00;
  43.   if(clock_time[MS_L]<'9')
  44.     clock_time[MS_L]++;
  45.   else
  46.    {
  47.      clock_time[MS_L]='0';
  48.          if(clock_time[MS_H]<'9')
  49.           clock_time[MS_H]++;
  50.          else
  51.          {
  52.            clock_time[MS_H]='0';
  53.            ms_to_s(clock_time);
  54.          }
  55.    }
  56. }
  57. void StartInt(void) interrupt 0          //啟動按鍵通過外部中斷0
  58. {
  59.   TR0=1;
  60. }
  61. void StopInt(void)  interrupt 2         //停止按鍵通過外部中斷1
  62. {
  63.   TR0=0;
  64. }
復制代碼



電子秒表的target.c源碼:
  1. #define TARGET_GLOBAL 1
  2. #include "target.h"
  3. /****************************************
  4. *函數名稱:target_init(void)
  5. *函數功能:包含本文件中初始化函數和變量
  6. *函數入口:無
  7. *函數出口:無
  8. ****************************************/
  9. void target_init(void)
  10. {
  11.   timer0_init();  //timer0初始化
  12.   int0_init();          //外部中斷0初始化
  13.   int1_init();          //外部中斷1初始化
  14. }
  15. /****************************************
  16. *函數名稱:timer0_init(void)
  17. *函數功能: 定時器0初始化,11.0592Mhz晶振,
  18.   定時10ms
  19. *函數入口:無
  20. *函數出口:無
  21. *****************************************/
  22. void timer0_init(void)  
  23. {
  24.   TMOD|=0x01;    //MODEL1,timer
  25.   TH0=0xDC;             //定時10ms
  26.   TL0=0x00;
  27.   ET0=1;             //中斷使能
  28.   TR0=0;                 //關閉定時器0
  29. }
  30. /****************************************
  31. *函數名稱:int0_init(void)
  32. *函數功能: 外部中斷0中斷初始化
  33. *函數入口:無
  34. *函數出口:無
  35. *****************************************/
  36. void int0_init(void)
  37. {
  38.   EX0 = 1;         //外部中斷0使能
  39.   T0 = 1;         //外部中斷0跳變中斷(下降沿跳變)
  40. }
  41. /****************************************
  42. *函數名稱:int1_init(void)
  43. *函數功能: 外部中斷0中斷初始化
  44. *函數入口:無
  45. *函數出口:無
  46. *****************************************/
  47. void int1_init(void)
  48. {
  49.   EX1 = 1;         //外部中斷1使能
  50.   IT1 = 1;         //外部中斷1跳變中斷(下降沿跳變)
  51. }
  52. /*******************************************
  53. *函數名稱:ms_to_s(uchar *clockS)
  54. *函數功能:實現毫秒級向秒級進位
  55. *函數入口:*clockS,指向時間數組的指針
  56. *函數出口:無
  57. 說明:說明:毫秒級和秒級計數均為兩位BCD碼,
  58. 毫秒最大值為99,秒最大值為59
  59. *******************************************/
  60. void ms_to_s(uchar *clockS)     
  61. {
  62.   if(clockS[S_L]<'9')
  63.     clockS[S_L]++;
  64.   else
  65.   {
  66.     clockS[S_L]='0';
  67.     if(clockS[S_H]<'5')
  68.          clockS[S_H]++;
  69.         else
  70.         {
  71.           clockS[S_H]='0';
  72.           s_to_min(clockS);
  73.         }
  74.   }
  75. }
  76. /*******************************************
  77. *函數名稱:s_to_min(uchar *clockMin)
  78. *函數功能:實現秒級向分鐘級進位
  79. *函數入口:*clockMin,指向時間數組的指針
  80. *函數出口:無
  81. *說明:秒級和分鐘級計數均為兩位BCD碼,
  82.       秒最大值59,分最大值99
  83. *******************************************/
  84. void s_to_min(uchar *clockMin)
  85. {
  86.   if(clockMin[MIN_L]<'9')
  87.     clockMin[MIN_L]++;
  88.   else
  89.   {
  90.     clockMin[MIN_L]='0';
  91.     if(clockMin[MIN_H]<'9')
  92.          clockMin[MIN_H]++;
  93.         else
  94.         {
  95.           clockMin[MIN_H]='0';
  96.         }
  97.   }
  98. }
復制代碼
0.png

仿真工程文件和源碼下載:
電子秒表.rar (15.27 KB, 下載次數: 112)


回復

使用道具 舉報

ID:140725 發表于 2017-3-18 04:04 | 顯示全部樓層
該秒表的led數碼管驅動程序:
  1. #define LED_GLOBAL 1
  2. #include "led.h"
  3. /****************************************
  4. *函數名稱:delay_us(uint us)
  5. *函數功能:實現微秒級的延時
  6. *函數入口:us,延時函數循環后期數
  7. *函數出口:無
  8. ****************************************/
  9. void delay_us(uint us)
  10. {
  11.   uint i;
  12.   while(us--)
  13.   {
  14.     for(i=0;i<100;i++);
  15.   }
  16. }
  17. /****************************************
  18. *函數名稱:led_init(void)
  19. *函數功能:六位七段數碼管顯示初始化
  20. *函數入口:無
  21. *函數出口:無
  22. ****************************************/
  23. void led_init(void)
  24. {
  25.    LED=segLedCode[0];
  26.    LED_CS1=0;
  27.    LED_CS2=0;
  28.    LED_CS3=0;
  29.    LED_CS4=0;
  30.    LED_CS5=0;
  31.    LED_CS6=0;
  32.    LED_CS7=0;
  33.    LED_CS8=0;
  34. }
  35. /**********************************************
  36. *函數名稱:ledWrite(uchar c,uchar n,uchar mod)
  37. *函數功能:對一組數碼管的某一位進行短暫顯示
  38. *函數入口:c,要顯示的數據;n,顯示一組數碼管中的
  39.            第n位;mod,c的數據形式
  40. *函數出口:無
  41. *說明:當mod==DIGITAL時,c為數字0~9的ANCII碼形式,
  42.        此時在n位數碼管上顯示想用數字
  43.        當mod==CHARACTER,直接將c輸出數據口
  44. ***********************************************/
  45. void ledWrite(uchar c,uchar n,uchar mod)
  46. {
  47.    if(CHARACTER==mod)
  48.    {
  49.           LED=c;  
  50.    }
  51.    else if(DIGITAL==mod)
  52.            {
  53.               if((c-'0')<0x0a)
  54.                   {
  55.                     LED=segLedCode[c-'0'];
  56.                   }
  57.                   else
  58.                   {  
  59.                         LED=segLedCode[0];
  60.                   }
  61.            }
  62.    switch(n)
  63.    {
  64.                 case 0x01:
  65.                 {
  66.                   LED_CS1=0;
  67.                   delay_us(10);
  68.                   LED_CS1=1;
  69.                   break;
  70.                 }
  71.                 case 0x02:
  72.                 {
  73.                   LED_CS2=0;
  74.                   delay_us(10);
  75.                   LED_CS2=1;
  76.                   break;
  77.                 }
  78.                 case 0x03:
  79.                 {
  80.                   LED_CS3=0;
  81.                   delay_us(10);
  82.                   LED_CS3=1;
  83.                   break;
  84.                 }
  85.             case 0x04:
  86.                 {
  87.                   LED_CS4=0;
  88.                   delay_us(10);
  89.                   LED_CS4=1;
  90.                   break;
  91.                 }
  92.                 case 0x05:
  93.                 {
  94.                   LED_CS5=0;
  95.                   delay_us(10);
  96.                   LED_CS5=1;
  97.                   break;
  98.                 }
  99.                 case 0x06:
  100.                 {
  101.                   LED_CS6=0;
  102.                   delay_us(10);
  103.                   LED_CS6=1;
  104.                   break;
  105.                 }
  106.                 case 0x07:
  107.                 {
  108.                  LED_CS7=0;
  109.                   delay_us(10);
  110.                   LED_CS7=1;
  111.                   break;
  112.                 }
  113.                 case 0x08:
  114.                 {
  115.                   LED_CS8=0;
  116.                   delay_us(10);
  117.                   LED_CS8=1;
  118.                   break;
  119.                 }
  120.                 default:
  121.                   break;

  122.    }

  123. }
  124. /***************************************************************************
  125. *函數名稱:ledSweepDisplay(uchar *segCode,uchar segCodeMod,uchar segNumber)
  126. *函數功能:循環在數碼管上顯示緩沖區中的數據
  127. *函數入口:segCode,指向顯示緩沖區中的指針;segCodeMod,0~7位為1或0標示1~8位數碼管
  128.            顯示的數據的類型(DIGITAL或者CHARACTER);segNumber,代表要顯示數碼管的
  129.                    位數
  130. *函數出口:無
  131. *說明:本函數主要實現將顯示緩沖區中的數據在數碼管上顯示出來
  132. ****************************************************************************/                     
  133. void ledSweepDisplay(uchar *segCode,uchar segCodeMod,uchar segNumber)
  134. {
  135.            uchar segCount;
  136.         for(segCount=0;segCount<segNumber;segCount++)
  137.         {
  138.            if(segCodeMod&0x01)            /*1代表此處顯示任意字符 */
  139.            {
  140.              ledWrite(segCode[segCount],segCount+1,CHARACTER);
  141.            }
  142.            else
  143.            {
  144.              ledWrite(segCode[segCount],segCount+1,DIGITAL);
  145.            }
  146.            segCodeMod=segCodeMod>>1;
  147.         }
  148. }
復制代碼
回復

使用道具 舉報

ID:612453 發表于 2019-9-17 17:29 來自觸屏版 | 顯示全部樓層
51hei官方發布 發表于 2017-3-18 04:04
該秒表的led數碼管驅動程序:

你好嗎要怎么把中間的橫線去掉了只用六位
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 99热最新网址 | 天堂综合网 | 午夜精品一区 | 天堂在线www| 午夜精品久久久久久久星辰影院 | 日韩欧美中文在线 | 国产一区三区在线 | 国产精品久久欧美久久一区 | 欧美成人一区二区 | 国产成人精品久久 | 国产精品日韩一区二区 | 国产精品视频 | 日韩视频精品在线 | 欧美片网站免费 | 91在线第一页 | 国产欧美精品一区二区色综合 | 久久久久九九九九 | 亚洲精品在线国产 | 韩国av网站在线观看 | 国产一区免费 | 日本精品视频一区二区 | 密室大逃脱第六季大神版在线观看 | 欧美成视频 | 亚洲一区免费 | 操一草 | 国产精品日女人 | 一区二区国产精品 | 久久久五月天 | 久久中文字幕一区 | 欧美日韩一区二区在线播放 | 婷婷久久久久 | 中文字幕一区二区三区在线乱码 | 中文字幕在线观看一区 | 欧美一级www片免费观看 | 天天色综 | 欧美日日日日bbbbb视频 | 午夜成人免费视频 | 免费v片在线观看 | 欧美在线不卡 | 国产伦精品一区二区三区照片91 | 岛国一区 |