找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 7648|回复: 2
打印 上一主题 下一主题
收起左侧

单片机电子秒表仿真及源程序 实现0.01S~59分的计时 带3按键

[复制链接]
跳转到指定楼层
楼主
给51黑电子论坛的朋友们分享一个51单片机做的电子秒表程序,带开始和停止和清除3个按键,可以实现0.01S~59分的计时。下面是该电子秒表的仿真原理图:


单片机秒表主程序:
  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. }
复制代码


仿真工程文件和源码下载:
电子秒表.rar (15.27 KB, 下载次数: 110)


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏4 分享淘帖 顶 踩
回复

使用道具 举报

沙发
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 单片机教程网

快速回复 返回顶部 返回列表