丄帝De咗臂 发表于 2015-8-31 18:21:37

秒表

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


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


【接线】接线示意图如下


【程序】代码程序如下
/*
秒表程序,采用4位共阳数码管,为接线方便,把模拟口A0~A5改成数字口D14~D19,接数码管上面的6条线,这样基本消除了面包板上下区之间的跨接面包线。
*/
//设置阳(阴)极接口,采用4位数码管
int a = 15;//设置A1口连接数码管a段
int b = 19;//设置A5口连接数码管b段
int c = 7;//设置D7口连接数码管c段
int d = 5;//设置D5口连接数码管d段
int e = 4;//设置D4口连接数码管e段
int f = 16;//设置A2口连接数码管f段
int g = 8;//设置D8口连接数码管g段
int dp = 6;//设置D6口连接数码管dp段
//设置阳极接口
int d1 = 14;//设置A0口连接第一个数码管公共阳极
int d2 = 17;//设置A3口连接第二个数码管公共阳极
int d3 = 18;//设置A4口连接第三个数码管公共阳极
int d4 = 9;//设置D9口连接第四个数码管公共阳极
//设置变量
long n = 0;//设时间的自变量n
int ptimer = 100;//改用此数值对时钟进行设置:100-0.1s,1000-1s,...
int del = 45;//此处数值对时钟进行微调
/***************************赋值数组******************************/
byte segs = { a, b, c, d, e, f, g };//除了小数点外的数码管7笔划段
byte seven_seg_digits = { { 1,1,1,1,1,1,0 },//设置数码管显示0的数组
                                 { 0,1,1,0,0,0,0 },//设置数码管显示1的数组
                                 { 1,1,0,1,1,0,1 },//设置数码管显示2的数组
                                 { 1,1,1,1,0,0,1 },//设置数码管显示3的数组
                                 { 0,1,1,0,0,1,1 },//设置数码管显示4的数组
                                 { 1,0,1,1,0,1,1 },//设置数码管显示5的数组
                                 { 1,0,1,1,1,1,1 },//设置数码管显示6的数组
                                 { 1,1,1,0,0,0,0 },//设置数码管显示7的数组
                                 { 1,1,1,1,1,1,1 },//设置数码管显示8的数组
                                 { 1,1,1,1,0,1,1 }//设置数码管显示9的数组
                              };
/*************************初始化设置函数***************************/
void setup()
{
pinMode(d1, OUTPUT);
pinMode(d2, OUTPUT);
pinMode(d3, OUTPUT);
pinMode(d4, OUTPUT);
pinMode(a, OUTPUT);
pinMode(b, OUTPUT);
pinMode(c, OUTPUT);
pinMode(d, OUTPUT);
pinMode(e, OUTPUT);
pinMode(f, OUTPUT);
pinMode(g, OUTPUT);
pinMode(dp, OUTPUT);//以上定义数码管所有引脚连线的单片机引脚为输出引脚
}
/**************************秒表主程序(循环)*****************************/
void loop()//秒表主程序
{
clearLEDs();//数码管清屏
pickDigit(1);//第一个数码管显示百秒数值
lightSegments((n/ptimer/1000)%10);//n除以100,再除以1000,然后取除以10的余数,就得到秒表百位的数值
delayMicroseconds(del);//百秒数字亮度
clearLEDs();//数码管清屏
pickDigit(2);//第二个数码管显示十秒数值
lightSegments((n/ptimer/100)%10);//n除以100,再除以100,然后取除以10的余数,得到秒表十位的数值
delayMicroseconds(del);//十秒数字亮度
clearLEDs();//清屏
pickDigit(3);//第三个数码管显示个位数值
dispDec(3);//开启第三个数码管小数点
lightSegments((n/ptimer/10)%10);//n除以100,再除以10,然后取除以10的余数,得到秒表个位的数值
delayMicroseconds(del);//个位数字亮度
clearLEDs();//数码管清屏
pickDigit(4);//第四个数码管显示十分位住址
lightSegments(n/ptimer%10); //n除以100,再取除以10的余数,就得到秒表十分位的数值
delayMicroseconds(del);//十分位数字亮度
n++;//计时
}
/**************************开启数码管子函数****************************/
void pickDigit(int x)//定义pickDigit(x),其作用是开启数码管
{
digitalWrite(d1, 1-HIGH);
digitalWrite(d2, 1-HIGH);
digitalWrite(d3, 1-HIGH);
digitalWrite(d4, 1-HIGH);
switch(x)
{
case 1:
    digitalWrite(d1, (n>100000)-LOW); //小于100秒该数码管不亮
    break;
case 2:
    digitalWrite(d2, (n>10000)-LOW);//小于10秒该数码管不亮
    break;
case 3:
    digitalWrite(d3, 1-LOW); //秒表个位数数码管
    break;
default:
    digitalWrite(d4, 1-LOW);
    break;
}
}
/*************************开启小数点子函数**************************/
void dispDec(int x)//设定开启小数点
{
digitalWrite(dp, 1-HIGH);//点亮小数点
}
/***********************数码管清屏子函数**************************/
void clearLEDs()
{
digitalWrite(a, 1-LOW);
digitalWrite(b, 1-LOW);
digitalWrite(c, 1-LOW);
digitalWrite(d, 1-LOW);
digitalWrite(e, 1-LOW);
digitalWrite(f, 1-LOW);
digitalWrite(g, 1-LOW);
digitalWrite(dp, 1-LOW);//将数码管所有管脚置高,数码管是共阳数码管,即将所有管脚熄灭
}
/**********************点亮对应数字的数码管子函数***********************/
void lightSegments(int x)
{
for (int i = 0; i < 7; i++)
{
    digitalWrite(segs, 1-seven_seg_digits);//对于共阴极的笔画段设置,这里要用1-的算术,改成共阳极数码管的正确显示
}
}【效果】最终效果图如下




大连林海 发表于 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

请问在这个基础上怎么加一个暂停计时的程序{:5_127:}

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

怎么清零

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

佩服佩服
页: [1]
查看完整版本: 秒表