7.2用3位数码管显示计时时间,最小计时单位为“0.1s”,计时范围0.1~99.9s。当第1次按一下计时功能键时,秒表开始计时并显示;第2次按一下计时功能键时,停止计时,将计时的时间值送到数码管显示;如果计时到99.9s,将重新开始从0计时;第3次按一下计时功能键,秒表清0。再次按一下计时功能键,则重复上述计时过程
时间: 2023-06-26 21:10:10 浏览: 70
以下是基于Arduino开发板的代码实现:
```
//定义引脚
const int digit1 = 2;
const int digit2 = 3;
const int digit3 = 4;
const int segA = 5;
const int segB = 6;
const int segC = 7;
const int segD = 8;
const int segE = 9;
const int segF = 10;
const int segG = 11;
//定义计时器状态变量
bool timing = false; //是否正在计时
int count = 0; //计时时间,以0.1秒为单位
void setup() {
//设置引脚模式为输出
pinMode(digit1, OUTPUT);
pinMode(digit2, OUTPUT);
pinMode(digit3, OUTPUT);
pinMode(segA, OUTPUT);
pinMode(segB, OUTPUT);
pinMode(segC, OUTPUT);
pinMode(segD, OUTPUT);
pinMode(segE, OUTPUT);
pinMode(segF, OUTPUT);
pinMode(segG, OUTPUT);
//显示0.0
displayDigit(0, 0, 0);
}
void loop() {
//检测计时器按键
if (digitalRead(12) == LOW) {
delay(50); //去抖动
if (timing) {
//停止计时并显示计时时间
timing = false;
displayCount();
} else {
//开始计时
timing = true;
count = 0;
//显示0.0
displayDigit(0, 0, 0);
}
}
//计时器每0.1秒加1
if (timing) {
count++;
if (count >= 1000) {
count = 0;
}
//将计时时间转换为数码管显示
int sec = count / 10;
int dec = sec / 10;
int unit = sec % 10;
displayDigit(dec, unit, 0);
//延时0.1秒
delay(100);
}
//检测清零按键
if (digitalRead(13) == LOW) {
delay(50); //去抖动
if (timing) {
//如果正在计时,先停止计时
timing = false;
}
//清零计时时间并显示0.0
count = 0;
displayDigit(0, 0, 0);
}
}
//显示计时时间
void displayCount() {
int sec = count / 10;
int dec = sec / 10;
int unit = sec % 10;
displayDigit(dec, unit, 1); //第3位显示小数点
delay(1000); //显示1秒钟
}
//显示一个3位数码管的数字
void displayDigit(int hundreds, int tens, int units) {
//定义数字对应的段码
byte digit[10][7] = {
{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
};
//显示百位数字
digitalWrite(digit1, HIGH);
displaySegment(digit[hundreds]);
delay(1);
digitalWrite(digit1, LOW);
//显示十位数字
digitalWrite(digit2, HIGH);
displaySegment(digit[tens]);
delay(1);
digitalWrite(digit2, LOW);
//显示个位数字
digitalWrite(digit3, HIGH);
displaySegment(digit[units]);
if (units == 1) {
//第3位显示小数点
digitalWrite(segG, HIGH);
}
delay(1);
digitalWrite(digit3, LOW);
}
//显示一个数码管段
void displaySegment(byte seg[]) {
digitalWrite(segA, seg[0]);
digitalWrite(segB, seg[1]);
digitalWrite(segC, seg[2]);
digitalWrite(segD, seg[3]);
digitalWrite(segE, seg[4]);
digitalWrite(segF, seg[5]);
digitalWrite(segG, seg[6]);
}
```
在这个代码中,我们使用了Arduino的数字输入输出引脚(D2~D13),其中D12和D13作为计时器按键和清零按键的输入,D2~D11作为数码管显示的输出。我们使用了一个变量`timing`来记录计时器是否正在计时,另一个变量`count`来记录计时时间。当按下计时器按键时,如果计时器正在计时,就停止计时并显示计时时间;否则,就开始计时。在计时的过程中,每0.1秒更新一次数码管的显示。当计时到达99.9秒时,计时器重新从0开始计时。当按下清零按键时,如果计时器正在计时,就先停止计时,然后将计时时间清零并显示0.0。
我们还定义了两个函数`displayCount`和`displayDigit`来分别显示计时时间和一个3位数码管的数字。在`displayDigit`函数中,我们使用了一个二维数组`digit`来存储数字对应的段码。在每次显示一个数字时,我们先根据百位、十位和个位分别显示3个数码管,然后根据`units`参数决定是否在第3位显示小数点。在`displaySegment`函数中,我们用7个数字输出引脚分别控制一个数码管的7个段。
相关推荐
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)