[项目]秒表

9472浏览
查看: 9472|回复: 5

[项目] 秒表

[复制链接]
【简介】本项目中我们使用四位数码管模拟一下秒表功能。最后完成图如下
秒表图3

【器材】Arduino Nano,四位数码管,面包板,导线若干。
【原理】电路原理图如下
秒表图2

【接线】接线示意图如下
秒表图1

【程序】代码程序如下
  1. /*
  2. 秒表程序,采用4位共阳数码管,为接线方便,把模拟口A0~A5改成数字口D14~D19,接数码管上面的6条线,这样基本消除了面包板上下区之间的跨接面包线。
  3. */
  4. //设置阳(阴)极接口,采用4位数码管
  5. int a = 15;//设置A1口连接数码管a段
  6. int b = 19;//设置A5口连接数码管b段
  7. int c = 7;//设置D7口连接数码管c段
  8. int d = 5;//设置D5口连接数码管d段
  9. int e = 4;//设置D4口连接数码管e段
  10. int f = 16;//设置A2口连接数码管f段
  11. int g = 8;//设置D8口连接数码管g段
  12. int dp = 6;//设置D6口连接数码管dp段
  13. //设置阳极接口
  14. int d1 = 14;//设置A0口连接第一个数码管公共阳极
  15. int d2 = 17;//设置A3口连接第二个数码管公共阳极
  16. int d3 = 18;//设置A4口连接第三个数码管公共阳极
  17. int d4 = 9;//设置D9口连接第四个数码管公共阳极
  18. //设置变量
  19. long n = 0;//设时间的自变量n
  20. int ptimer = 100;//改用此数值对时钟进行设置:100-0.1s,1000-1s,...
  21. int del = 45;  //此处数值对时钟进行微调
  22. /***************************赋值数组******************************/
  23. byte segs[7] = { a, b, c, d, e, f, g };//除了小数点外的数码管7笔划段
  24. byte seven_seg_digits[10][7] = { { 1,1,1,1,1,1,0 },//设置数码管显示0的数组
  25.                                  { 0,1,1,0,0,0,0 },//设置数码管显示1的数组
  26.                                  { 1,1,0,1,1,0,1 },//设置数码管显示2的数组
  27.                                  { 1,1,1,1,0,0,1 },//设置数码管显示3的数组
  28.                                  { 0,1,1,0,0,1,1 },//设置数码管显示4的数组
  29.                                  { 1,0,1,1,0,1,1 },//设置数码管显示5的数组
  30.                                  { 1,0,1,1,1,1,1 },//设置数码管显示6的数组
  31.                                  { 1,1,1,0,0,0,0 },//设置数码管显示7的数组
  32.                                  { 1,1,1,1,1,1,1 },//设置数码管显示8的数组
  33.                                  { 1,1,1,1,0,1,1 }//设置数码管显示9的数组
  34.                               };
  35. /*************************初始化设置函数***************************/
  36. void setup()
  37. {
  38.   pinMode(d1, OUTPUT);
  39.   pinMode(d2, OUTPUT);
  40.   pinMode(d3, OUTPUT);
  41.   pinMode(d4, OUTPUT);
  42.   pinMode(a, OUTPUT);
  43.   pinMode(b, OUTPUT);
  44.   pinMode(c, OUTPUT);
  45.   pinMode(d, OUTPUT);
  46.   pinMode(e, OUTPUT);
  47.   pinMode(f, OUTPUT);
  48.   pinMode(g, OUTPUT);
  49.   pinMode(dp, OUTPUT);//以上定义数码管所有引脚连线的单片机引脚为输出引脚
  50. }
  51. /**************************秒表主程序(循环)*****************************/
  52. void loop()//秒表主程序
  53. {
  54.   clearLEDs();//数码管清屏
  55.   pickDigit(1);//第一个数码管显示百秒数值
  56.   lightSegments((n/ptimer/1000)%10);//n除以100,再除以1000,然后取除以10的余数,就得到秒表百位的数值
  57.   delayMicroseconds(del);//百秒数字亮度
  58.   clearLEDs();//数码管清屏
  59.   pickDigit(2);//第二个数码管显示十秒数值
  60. lightSegments((n/ptimer/100)%10);//n除以100,再除以100,然后取除以10的余数,得到秒表十位的数值
  61.   delayMicroseconds(del);//十秒数字亮度  
  62.   clearLEDs();//清屏
  63.   pickDigit(3);//第三个数码管显示个位数值
  64.   dispDec(3);//开启第三个数码管小数点
  65. lightSegments((n/ptimer/10)%10);//n除以100,再除以10,然后取除以10的余数,得到秒表个位的数值
  66.   delayMicroseconds(del);//个位数字亮度  
  67.   clearLEDs();//数码管清屏
  68.   pickDigit(4);//第四个数码管显示十分位住址
  69.   lightSegments(n/ptimer%10); //n除以100,再取除以10的余数,就得到秒表十分位的数值
  70.   delayMicroseconds(del);//十分位数字亮度
  71.   n++;//计时
  72. }
  73. /**************************开启数码管子函数****************************/
  74. void pickDigit(int x)  //定义pickDigit(x),其作用是开启数码管
  75. {
  76.   digitalWrite(d1, 1-HIGH);
  77.   digitalWrite(d2, 1-HIGH);
  78.   digitalWrite(d3, 1-HIGH);
  79.   digitalWrite(d4, 1-HIGH);
  80.   switch(x)
  81.   {
  82.   case 1:
  83.     digitalWrite(d1, (n>100000)-LOW); //小于100秒该数码管不亮
  84.     break;
  85.   case 2:
  86.     digitalWrite(d2, (n>10000)-LOW);  //小于10秒该数码管不亮
  87.     break;
  88.   case 3:
  89.     digitalWrite(d3, 1-LOW); //秒表个位数数码管
  90.     break;
  91.   default:
  92.     digitalWrite(d4, 1-LOW);
  93.     break;
  94.   }
  95. }
  96. /*************************开启小数点子函数**************************/
  97. void dispDec(int x)  //设定开启小数点
  98. {
  99. digitalWrite(dp, 1-HIGH);//点亮小数点
  100. }
  101. /***********************数码管清屏子函数**************************/
  102. void clearLEDs()  
  103. {
  104.   digitalWrite(a, 1-LOW);
  105.   digitalWrite(b, 1-LOW);
  106.   digitalWrite(c, 1-LOW);
  107.   digitalWrite(d, 1-LOW);
  108.   digitalWrite(e, 1-LOW);
  109.   digitalWrite(f, 1-LOW);
  110.   digitalWrite(g, 1-LOW);
  111.   digitalWrite(dp, 1-LOW);//将数码管所有管脚置高,数码管是共阳数码管,即将所有管脚熄灭
  112. }
  113. /**********************点亮对应数字的数码管子函数***********************/
  114. void lightSegments(int x)
  115. {
  116.   for (int i = 0; i < 7; i++)
  117. {
  118.     digitalWrite(segs[i], 1-seven_seg_digits[x][i]);//对于共阴极的笔画段设置,这里要用1-的算术,改成共阳极数码管的正确显示
  119.   }
  120. }
复制代码
【效果】最终效果图如下

秒表图4
秒表图5


大连林海  初级技神

发表于 2015-8-31 19:49:19

真的和数码管和nano较上劲了 佩服啊
回复

使用道具 举报

丄帝De咗臂  高级技匠
 楼主|

发表于 2015-8-31 20:56:47

大连林海 发表于 2015-8-31 19:49
真的和数码管和nano较上劲了 佩服啊

要先把手头这点东西玩烂啊
回复

使用道具 举报

深冬  见习技师

发表于 2018-11-19 15:03:18

请问在这个基础上怎么加一个暂停计时的程序
回复

使用道具 举报

20060606  高级技匠

发表于 2020-8-10 05:02:37

怎么清零
回复

使用道具 举报

 初级技匠

发表于 2022-4-18 14:01:31

佩服佩服
回复

使用道具 举报

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

本版积分规则

为本项目制作心愿单
购买心愿单
心愿单 编辑
[[wsData.name]]

硬件清单

  • [[d.name]]
btnicon
我也要做!
点击进入购买页面
上海智位机器人股份有限公司 沪ICP备09038501号-4

© 2013-2024 Comsenz Inc. Powered by Discuz! X3.4 Licensed

mail