void loop () { clearLEDs(); pickDigit(1); pickNumber((n/x/1000)%10); delayMicroseconds(del); clearLEDs(); pickDigit(2); pickNumber((n/x/100)%10); delayMicroseconds(del); clearLEDs(); pickDigit(3); dispDec(3); pickNumber((n/x/10)%10); delayMicroseconds(del); clearLEDs(); pickDigit(4); pickNumber(n/x%10); delayMicroseconds(del); n++; if (digitalRead(13)== HIGH ) { n=0; } }
时间: 2023-11-20 15:04:37 浏览: 95
这是一个 Arduino 循环程序,主要功能是控制 4 个七段数码管进行计数显示。程序中用到的函数包括:clearLEDs() 用于清除数码管的显示内容,pickDigit() 用于选中要显示的数码管位数,pickNumber() 用于选择要显示的数字,dispDec() 用于显示小数点,delayMicroseconds() 用于延时一段时间,digitalRead() 用于读取数字输入口的状态。
具体地,程序中的变量 n 表示当前的计数值,x 表示计数的步长,del 表示控制数码管刷新速度的延时时间。在每次循环中,先清除数码管的显示内容,然后分别选中第 1 到第 4 位数码管,根据当前计数值的不同位数显示对应的数字,最后延时一段时间后进入下一次循环。如果数字输入口接收到高电平信号,则将计数值重置为零。
相关问题
byte ReadOneByte() { int ByteRead; while(!Serial.available()); ByteRead = Serial.read(); return ByteRead; } byte num[10][8]= {//a,b,c,d,e,f,g,p {0,0,0,0,0,0,1,1}, //0 {1,0,0,1,1,1,1,1}, //1 {0,0,1,0,0,1,0,1}, //2 {0,0,0,0,1,1,0,1}, //3 {1,0,0,1,1,0,0,1}, //4 {0,1,0,0,1,0,0,1}, //5 {0,1,0,0,0,0,0,1}, //6 {0,0,0,1,1,1,1,1}, //7 {0,0,0,0,0,0,0,1}, //8 {0,0,0,0,1,0,0,1} //9 }; void Clear() { digitalWrite(a,1); digitalWrite(b,1); digitalWrite(c,1); digitalWrite(d,1); digitalWrite(e,1); digitalWrite(f,1); digitalWrite(g,1); digitalWrite(p,1); } void pickDigit(byte i) { digitalWrite(d1,0); digitalWrite(d2,0); digitalWrite(d3,0); digitalWrite(d4,0); switch(i) { case 1:digitalWrite(d1,1);break; case 2:digitalWrite(d2,1);break; case 3:digitalWrite(d3,1);break; case 4:digitalWrite(d4,1);break; } } void pickNumber(byte dp) { digitalWrite(a,num[dp][0]); digitalWrite(b,num[dp][1]); digitalWrite(c,num[dp][2]); digitalWrite(d,num[dp][3]); digitalWrite(e,num[dp][4]); digitalWrite(f,num[dp][5]); digitalWrite(g,num[dp][6]); digitalWrite(p,num[dp][7]); } void show(byte num1,byte num2) { Clear(); pickDigit(1); pickNumber(num1/10); delayMicroseconds(55); Clear(); pickDigit(2); pickNumber(num1%10); digitalWrite(p,0); delayMicroseconds(55); Clear(); pickDigit(3); pickNumber(num2/10); delayMicroseconds(55); Clear(); pickDigit(4); pickNumber(num2%10); delayMicroseconds(55); }
这段代码是一个简单的Arduino程序,用于控制一个数字显示器显示两个数字。
首先,`ReadOneByte()` 函数用于从串口读取一个字节的数据,并将其返回。在这段代码中,它似乎是未被使用的。
然后,定义了一个二维数组 `num[10][8]`,用于存储每个数字在数码管上的显示模式。每个数字用一个长度为8的数组表示,其中每个元素代表一个数码管的段是否点亮。例如,`num[0]` 表示数字0在数码管上的显示模式。
接下来是一些函数定义:
- `Clear()` 函数用于将数码管的所有段都熄灭。
- `pickDigit()` 函数用于选择要显示数字的位数,通过设置不同的引脚为高电平来选择位数。
- `pickNumber()` 函数用于根据给定的数字选择相应的段亮灭状态。
- `show()` 函数用于在数码管上显示两个数字。它先清空数码管,然后依次选择位数并显示对应的数字。
整个代码的逻辑是先显示第一个数字的十位和个位,然后显示第二个数字的十位和个位。
请注意,这段代码缺少了一些必要的定义和引脚设置,例如 `a,b,c,d,e,f,g,p,d1,d2,d3,d4` 等引脚。如果要使用这段代码,你需要根据实际硬件连接情况进行相应的修改和配置。
int outputPin = 9; // 输出引脚 void setup() { pinMode(outputPin, OUTPUT); // 将输出引脚设置为输出模式 TCCR1A = 0; // 清除TCCR1A寄存器 TCCR1B = 0; // 清除TCCR1B寄存器 OCR1A = 15624; // 设置计数器 TOP 值,用于设置频率 TCCR1B |= (1 << WGM12); // CTC 模式 TCCR1B |= (1 << CS12); // 设置预分频器为256 } void loop() { digitalWrite(outputPin, HIGH); // 输出高电平 delayMicroseconds(5); // 延迟5微秒 digitalWrite(outputPin, LOW); // 输出低电平 delayMicroseconds(5); // 延迟5微秒 }
这段代码使用了Arduino的定时器1来实现输出100HZ的PWM信号。其中,outputPin指定了输出信号所在的引脚,这里选择了Pin 9。在setup()函数中,首先设置了outputPin引脚为输出模式。然后,通过设置TCCR1A和TCCR1B寄存器,将定时器1设置为CTC模式,并将预分频器设置为256。OCR1A寄存器的值设置为15624,这个值可以通过公式f_PWM = F_CPU / (N * (1 + OCR1A))计算出来,其中f_PWM为输出PWM信号的频率,F_CPU为Arduino的CPU时钟频率,N为预分频器的值。
在loop()函数中,首先将outputPin引脚输出高电平,再延迟5微秒,然后将outputPin引脚输出低电平,再延迟5微秒,这样就实现了一个占空比为50%的PWM信号。通过调整延迟的时间,可以改变PWM信号的占空比。
阅读全文