红绿灯串口四位数码管实现(Arduino)yxqz小余塘
红绿灯串口四位数码管实现(Arduino)
此内容为付费资源,请付费后查看
3.99
限时特惠
10
立即购买
建议登录购买,可以长期保存你的购买权限
付费资源
已售 2

红绿灯串口四位数码管实现(Arduino)

项目介绍

通过串口输入,控制红绿灯的显示秒数,且在四位数码管里显示秒数(倒计时)

这里我用的红灯是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函数来实现对红绿灯的显示以及后面的修改操作。是个递归循环。

文章版权声明 1、本网站名称:小余塘
2、本站永久网址:https://www.yxqz.top/
3、本网站的文章部分内容可能来源于网络,仅供大家学习与参考,如有侵权,请联系站长QQ2457431511进行删除处理。
4、本站一切资源不代表本站立场,并不代表本站赞同其观点和对其真实性负责。
5、本站一律禁止以任何方式发布或转载任何违法的相关信息,访客发现请向站长举报
6、本站资源大多存储在云盘,如发现链接失效,请联系我们我们会第一时间更新。
THE END
喜欢就支持一下吧~
点赞8 分享
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情代码图片

    暂无评论内容