项目介绍
通过串口输入,控制红绿灯的显示秒数,且在四位数码管里显示秒数(倒计时)
这里我用的红灯是A0口,绿灯是A1口,黄灯是COM1则是10口
功能分析
演示视频
接线图
实体接线图
代码剖析
定义需要的变量和函数
这里没有好解释的
定义数码管
使用abcdefgh来控制晶体管显示0到9
设置输出口
设置定义的端口都是为输出口,以及设置波特率
Display()函数
传入两个参数,第一com端口号,都是无符号(unsigned)和char(字符)类型的变量
使用switch来控制端口号来设置端口的高第电频来实现端口的开关
传入的n。实现对之前定义的晶体管码表对应,来实现对晶体管的开关。依次来构成数字
//位置显示函数
void Display(unsigned char com, unsigned char n) //显示函数,com可选数值范围1-4,num可选数值范围0-9
{
switch (com) //选通位选
{
case 1:
digitalWrite(COM1, LOW); //选择位1
digitalWrite(COM2, LOW);
pinMode(COM5, LOW);
pinMode(COM6, LOW);
digitalWrite(COM3, LOW);
digitalWrite(COM4, HIGH);
break;
case 2:
pinMode(COM5, LOW);
pinMode(COM6, LOW);
digitalWrite(COM1, LOW);
digitalWrite(COM2, LOW); //选择位2
digitalWrite(COM3, HIGH);
digitalWrite(COM4, LOW);
break;
case 3:
digitalWrite(COM5, LOW);
digitalWrite(COM6, LOW);
digitalWrite(COM3, LOW);
digitalWrite(COM4, LOW);
digitalWrite(COM1, LOW);
digitalWrite(COM2, HIGH);
digitalWrite(COM3, LOW); //选择位3
digitalWrite(COM4, LOW);
break;
case 4:
digitalWrite(COM5, LOW);
digitalWrite(COM6, LOW);
digitalWrite(COM1, HIGH);
digitalWrite(COM2, LOW);
digitalWrite(COM3, LOW);
digitalWrite(COM4, LOW); //选择位4
break;
case 5:
digitalWrite(COM1, LOW);
pinMode(COM6, LOW);
pinMode(COM5, HIGH);
digitalWrite(COM2, LOW);
digitalWrite(COM3, LOW);
digitalWrite(COM4, LOW);
break;
case 6:
pinMode(COM5, LOW);
digitalWrite(COM1, LOW);
pinMode(COM6, HIGH);
digitalWrite(COM2, LOW);
digitalWrite(COM3, LOW);
digitalWrite(COM4, LOW);
break;
//关闭所有灯光
case 7:
pinMode(COM5, LOW);
digitalWrite(COM1, LOW);
pinMode(COM6, LOW);
digitalWrite(COM2, LOW);
digitalWrite(COM3, LOW);
digitalWrite(COM4, LOW);
break;
}
digitalWrite(d_a, LOW); //去除余晖
digitalWrite(d_b, LOW);
digitalWrite(d_c, LOW);
digitalWrite(d_d, LOW);
digitalWrite(d_e, LOW);
digitalWrite(d_f, LOW);
digitalWrite(d_g, LOW);
digitalWrite(d_h, LOW);
digitalWrite(d_a, num[n][0]); //a查询码值表
digitalWrite(d_b, num[n][1]);
digitalWrite(d_c, num[n][2]);
digitalWrite(d_d, num[n][3]);
digitalWrite(d_e, num[n][4]);
digitalWrite(d_f, num[n][5]);
digitalWrite(d_g, num[n][6]);
digitalWrite(d_h, num[n][7]);
}
showLed函数
这里使用For循环来控制秒数,外层是10单位,内层是秒单位,最里面的125次循环是为了让每次执行都是在1秒以内、
delay(2);延迟在1到5个毫秒以内,人眼默认认为没闪动,因为快
void showLed(int a , int b, int c) {
for (int i = a; i >= 0; i--)
{
// 一分钟快闪125次,则是1s
for (int q = 0; q < 125; q++)
{
//显示秒数
Display(1, i);//秒
delay(2);
if ( i > 0 && i <= 5 )
{
Display(4, i);//蓝
delay(2);
}
}
}
//绿色n/1%10,n/10%10
for (int j = b / 10 % 10; j >= 0; j--)
{
if (j == 0) {
for (int i = 9; i >= 0; i--)
{
// 一分钟快闪125次,则是1s
for (int q = 0; q < 125; q++)
{
int d = (j * 10) + i;
//显示秒数
Display(1, i);
delay(2);
Display(2, j);
delay(2);
Display(5, i);
delay(2);
}
}
}
else {
// 内层控制单词走的秒。这里单次走10次
for (int i = b / 1 % 10; i >= 0; i--)
{
// 一分钟快闪125次,则是1s
for (int q = 0; q < 125; q++)
{
int d = (j * 10) + i;
//显示秒数
Display(1, i);
delay(2);
Display(2, j);
delay(2);
Display(5, i);
delay(2);
}
}
}
}
// 红色
for (int j = c / 10 % 10; j >= 0; j--)
{
if (j == 0) {
for (int i = 9; i >= 0; i--)
{
// 一分钟快闪125次,则是1s
for (int q = 0; q < 125; q++)
{
int d = (j * 10) + i;
//显示秒数
Display(1, i);
delay(2);
Display(2, j);
delay(2);
Display(6, i);
delay(2);
}
}
}
else {
// 内层控制单词走的秒。这里单次走10次
for (int i = c / 1 % 10; i >= 0; i--)
{
// 一分钟快闪125次,则是1s
for (int q = 0; q < 125; q++)
{
int d = (j * 10) + i;
//显示秒数
Display(1, i);
delay(2);
Display(2, j);
delay(2);
Display(6, i);
delay(2);
}
}
}
}
}
initLed函数
和helloR构成小递归,重复调用。来实现重复输入和重复显示。
使用t来判断用户是否要修改和关闭这里是第一层用户验证
helloR()函数
通过r来判断用户是否输入了对颜色的选择,这里是第二次判断。每次输入后,通过对a,b,c的赋值,来实现对秒数的控制,然后调用initled函数来实现对红绿灯的显示以及后面的修改操作。是个递归循环。
THE END
暂无评论内容