请选择 进入手机版 | 继续访问电脑版

普中开源电子分享网

 找回密码
 立即注册
搜索
查看: 105|回复: 1

秒表源码分享

[复制链接]

1

主题

2

帖子

15

积分

新手上路

Rank: 1

积分
15
发表于 2023-1-23 01:34:44 | 显示全部楼层 |阅读模式
  1. #include <reg52.h>
  2. #include <intrins.h>

  3. typedef unsigned char u8;
  4. typedef unsigned int u16;

  5. #define SMG_A_DP_PORT        P0        //使用宏定义数码管段码口

  6. //定义数码管位选信号控制脚
  7. #define SMG_POS_PORT         P2

  8. sbit KEY3=P3^2;// K3
  9. sbit KEY4=P3^3;// K4

  10. //共阴极数码管显示0~F的段码数据                                                                                                                                                  -    .
  11. u8 gsmg_code[32]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0,0x40,0x80};

  12. // 显示样式:  00.00.00.00
  13. u8 hour=0;      // 时           1位 [0,99]
  14. u8 minute=0;      // 分           2位 [0,59]
  15. u8 second=0;      // 秒数  2位  [0,59]
  16. u8 dot=0;  // 小数部分  1位      [0,99]
  17. u8 vbuf[8]={0};   // 8各数码管,编码索引,缓存
  18. u16 speed=10;     // 计数频率

  19. /**
  20. * @brief  延时 10us, 1s=10^6s
  21. *
  22. * @param ten_us  
  23. */
  24. void delay_10us(u16 ten_us)
  25. {
  26.         while(ten_us--);
  27. }

  28. /**
  29. * @brief 延时 ms
  30. *
  31. * @param ms 毫秒数
  32. */
  33. void delay_ms(u16 ms)
  34. {
  35.         u16 i,j;
  36.         for(i=ms;i>0;i--)
  37.                 for(j=110;j>0;j--);
  38. }

  39. /**
  40. * @brief 外部中断0 1 初始化
  41. *
  42. */
  43. void extint_init()
  44. {
  45.         EA=1; //打开总终端开关
  46.         EX0=1; // 打开外部中断0
  47.         IT0=1; // 设置外部中断的出发方式

  48.         EX1=1; // 打开外部中断0
  49.         IT1=1; // 设置外部中断的出发方式
  50. }

  51. /**
  52. * @brief 定时器0 初始化
  53. *
  54. */
  55. void timer_init()
  56. {
  57.    TMOD=0X01;   // 定时器0 工作方式位1
  58.    TH0=0xd8;  // 定时器赋初值,定时10ms
  59.    TL0=0xf0;

  60.    EA=1;        //打开总终端开关
  61.    //TR0=1;    // 定时器0 打开 开始计时
  62.    ET0=1;    // 打开定时器0 中断允许
  63. }
  64. /**
  65. * @brief 单个数码管 显示
  66. *
  67. * @param pos   数码管位置
  68. * @param value 数码管值的索引
  69. */
  70. void smg_display(u8 pos,u8 value)
  71. {
  72.         SMG_POS_PORT= ~(pos<<2);     //P2的2 3 4 点
  73.         SMG_A_DP_PORT= gsmg_code[value];//传送段选数据
  74.         delay_10us(100);//延时一段时间,等待显示稳定
  75.         SMG_A_DP_PORT=0x00;//消影
  76. }

  77. /**
  78. * @brief 数码管显示
  79. *
  80. */
  81. void smg_show()
  82. {
  83.   u8 i;
  84.   for(i=0;i<8;i++)
  85.   {
  86.         smg_display(i,vbuf[i]);
  87.   }
  88.   delay_ms(10);//延时一段时间,等待显示稳定
  89. }

  90. /**
  91. * @brief 数码管值更新
  92. * 显示样式:  00.00.00.00
  93. */
  94. void smg_update()
  95. {
  96.   vbuf[0]=hour/10;
  97.   vbuf[1]=(hour % 10) + 19;
  98.   vbuf[2]=minute/10;
  99.   vbuf[3]=(minute % 10) + 19;       
  100.   vbuf[4]=second/10;
  101.   vbuf[5]=(second % 10) + 19;               
  102.   vbuf[6]=dot/10;
  103.   vbuf[7]=dot % 10;       
  104. }

  105. /**
  106. * @brief 数码管编码初始化
  107. * 0-9 补个点 ,填充到数码管编码数组钟
  108. *
  109. */
  110. void seg_code_init()
  111. {
  112.           u8 i;
  113.           for(i=0;i<10;i++)
  114.           {
  115.                   gsmg_code[19+i]=gsmg_code[18] | gsmg_code[i];
  116.           }
  117. }
  118. void main()
  119. {
  120.         seg_code_init();
  121.         extint_init();
  122.         speed=1;
  123.           timer_init();
  124.         smg_update();

  125.        
  126.         while(1)
  127.         {
  128.            smg_show();
  129.         }
  130. }

  131. /**
  132. * @brief 外部中断0
  133. * 按钮3,功能:控制定时器0 0启动/1暂停 切换,初始状态暂停
  134. *
  135. */
  136. void exti0() interrupt 0
  137. {
  138.    delay_ms(10);
  139.    if(KEY3 == 0)
  140.    {       
  141.          TR0= !TR0 ; //定时器0  0启动/1暂停 切换
  142.    }
  143. }
  144. /**
  145. * @brief 外部中断1
  146. * 按钮4,功能,复位: 定时器关闭,数据置0
  147. */
  148. void exti1() interrupt 2
  149. {
  150.    delay_ms(10);
  151.    if(KEY4 == 0)
  152.    {
  153.                 TR0=0; // 定时器停止
  154.                 hour=0;      // 时           1位
  155.                 minute=0;      // 分           2位
  156.                 second=0;      // 秒数  2位
  157.                 dot=0;  // 小数部分  1?
  158.                 smg_update();
  159.    }
  160. }
  161. /**
  162. * @brief 定时器0 中断
  163. *
  164. */
  165. void timer() interrupt 1
  166. {
  167.         static u16 i=0;
  168.    TH0=0xd8;  // 定时器赋初值,定时10ms
  169.    TL0=0xf0;

  170.         i++;
  171.         if(i >= speed)  // 10ms 的倍数
  172.         {
  173.            dot++ ;   
  174.                
  175.            if(dot >= 100)  //秒
  176.            {
  177.               dot=0;
  178.                   second++;
  179.                   if( second>= 60)  // 分
  180.                   {
  181.                     second=0;
  182.                         minute++;
  183.                         if( minute>= 60)  //时
  184.                         {
  185.                           minute=0;
  186.                           hour++;
  187.                           if(hour == 100 )  
  188.                           {
  189.                                   hour=0;
  190.                           }
  191.                         }
  192.                   }
  193.            }
  194.            smg_update();  // 数码管缓存更新
  195.            i=0;
  196.         }
  197. }

复制代码

回复

使用道具 举报

2

主题

8

帖子

30

积分

新手上路

Rank: 1

积分
30
发表于 2023-1-23 18:28:48 | 显示全部楼层
亲爱的楼主,您发的帖子真是太棒了。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

站长推荐上一条 /1 下一条

Archiver|手机版|小黑屋|普中开源电子分享网 粤ICP备16123577号-2

GMT+8, 2023-2-2 17:01 , Processed in 0.108088 second(s), 30 queries .

Powered by 论坛搭建 X3.4

Copyright © 2001-2021, Tencent Cloud.

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