极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 14923|回复: 8

极客工坊外包任务--【红绿灯】

[复制链接]
发表于 2012-11-18 20:33:16 | 显示全部楼层 |阅读模式
本帖最后由 Malc 于 2012-11-20 14:06 编辑

有谁写完了就贴出来吧
我的代码:
找到一个小bug已修复,下面的代码测试通过:

  1. /*红灯40秒
  2. 黄灯3秒
  3. 绿灯25秒
  4. 配合二位数码管显示数字
  5. */
  6. #define Duration 5 //数码管扫描时间
  7. #define SegNum 2
  8. #define LEDNum 3
  9. int Light_time[3]={40,3,25};

  10. //digital number 0~9
  11. char number[10][7]={
  12.   1,1,1,1,1,1,0,
  13.   0,1,1,0,0,0,0,
  14.   1,1,0,1,1,0,1,
  15.   1,1,1,1,0,0,1,
  16.   0,1,1,0,0,1,1,
  17.   1,0,1,1,0,1,1,
  18.   1,0,1,1,1,1,1,
  19.   1,1,1,0,0,0,0,
  20.   1,1,1,1,1,1,1,
  21.   1,1,1,1,0,1,1,
  22. };
  23. /*
  24. arduino引脚   2 3 4 5 6 7 8
  25. 数码管引脚    7 6 4 2 1 9 10 5
  26.               a b c d e f g dp
  27. 不是所有数码管都是这样的管脚排列
  28. 我的数码管管脚为:
  29. a b c d e f g dp
  30. 6 7 9 1 2 4 5 10
  31. 共阴极需要三极管扩流,如NPN8050
  32. */
  33. char seg[7]={3,2,7,6,5,4,8};//数码管a~g

  34. char DS[SegNum]={9,10};//共阴极
  35. char LED[LEDNum]={11,12,13};// red,yellow,green
  36. char sign=0;
  37. unsigned long timer=0,ptimer=0;
  38. void setup()
  39. {
  40.   Serial.begin(9600);
  41.   int i;
  42.   for(i=0;i<8;i++)
  43.   {
  44.     pinMode(seg[i],OUTPUT);
  45.     digitalWrite(seg[i],HIGH);
  46.     }

  47.   for(i=0;i<SegNum;i++)
  48.   {
  49.     pinMode(DS[i],OUTPUT);
  50.     digitalWrite(DS[i],HIGH);
  51.     }


  52.   for(i=0;i<LEDNum;i++)
  53.   {
  54.     pinMode(LED[i],OUTPUT);
  55.     digitalWrite(LED[i],LOW);
  56.     }
  57.   timer=millis();
  58. }
  59. void dis(char num,char _DS)
  60. {
  61.   int i;
  62.   for(i=0;i<8;i++)
  63.     digitalWrite(seg[i],number[num][i]);
  64.   for(i=0;i<SegNum;i++)
  65.     if(i==_DS)
  66.       digitalWrite(DS[i],HIGH);
  67.     else
  68.       digitalWrite(DS[i],LOW);     
  69. delay(Duration);
  70. for(i=0;i<SegNum;i++)//消隐
  71.   {
  72.     digitalWrite(DS[i],HIGH);
  73.     }
  74. }
  75. void show(unsigned long timer)
  76. {
  77.     dis(timer/10,0);
  78.     dis(timer%10,1);
  79. }
  80. void loop()
  81. {
  82.   int i;
  83. for(i=0;i<LEDNum;i++)
  84. {
  85.   while(timer<=Light_time[i])
  86.   {
  87.    digitalWrite(LED[i],HIGH);
  88.    show(Light_time[i]-timer);
  89.    timer=(millis()-ptimer)/1000;
  90.    Serial.println(Light_time[i]-timer);
  91.    }
  92.    timer=0;
  93.    ptimer=millis();
  94.    digitalWrite(LED[i],LOW);
  95. }
  96. }
复制代码
回复

使用道具 举报

发表于 2012-11-18 21:02:31 | 显示全部楼层
{:soso_e204:}这个不是单片机课标准课程么,为啥要外包呢
回复 支持 反对

使用道具 举报

发表于 2012-11-19 00:12:03 | 显示全部楼层
作业从来都是外包的
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-11-19 10:00:10 | 显示全部楼层
Ansifa 发表于 2012-11-18 21:02
这个不是单片机课标准课程么,为啥要外包呢

人家给任务,我就接任务呗
回复 支持 反对

使用道具 举报

发表于 2016-8-31 21:34:40 | 显示全部楼层
本帖最后由 偶是谁 于 2016-8-31 22:07 编辑

非常,非常感谢版主
程序对初学者太有用了
没学过C语言
timer=(millis()-ptimer)/1000;
这句看不懂,倒计时1秒间隔也不知道怎么来的
极客工坊外包任务,版块可以大力发展壮大
没有好的程序参考,学到的永远是皮毛
一个红绿灯程序网上一大堆arduino垃圾,就这个靠谱

还改了个KEEP跑步机
int Light_time[8]={10,13,15,11,8,22,7,17};//8组循环倒计时组,时间是随意定的
回复 支持 反对

使用道具 举报

发表于 2016-8-31 21:41:26 | 显示全部楼层
本帖最后由 偶是谁 于 2016-9-17 21:38 编辑

程序直接复制出错的,直接敲一篇。别问我为什么,找了3天,也没找出来为什么出错。
回复 支持 反对

使用道具 举报

发表于 2016-9-5 23:11:04 | 显示全部楼层
想在红绿灯程序中加一个按键,实现倒计时程序的暂停和恢复(暂停时间处恢复倒计时),找了好久也没这方面的资料,不是偷懒,C语言也没学过,真不知道该如何写,特请教各位大神。
回复 支持 反对

使用道具 举报

发表于 2016-9-6 22:12:23 | 显示全部楼层
偶是谁 发表于 2016-9-5 23:11
想在红绿灯程序中加一个按键,实现倒计时程序的暂停和恢复(暂停时间处恢复倒计时),找了好久也没这方面的 ...

这个就是在正常的倒计时过程中,看你的数码管怎么写了,如果是持续刷新的话,你可以考虑用中断0,(IO2),按下按键时进入中断函数,数码管持续刷新一个数直到这个键被按下
回复 支持 反对

使用道具 举报

发表于 2016-9-6 22:48:38 | 显示全部楼层
本帖最后由 偶是谁 于 2016-9-17 21:30 编辑
zjz5717 发表于 2016-9-6 22:12
这个就是在正常的倒计时过程中,看你的数码管怎么写了,如果是持续刷新的话,你可以考虑用中断0,(IO2), ...


谢谢,用的中断0能暂停了
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则 需要先绑定手机号

Archiver|联系我们|极客工坊

GMT+8, 2024-4-19 18:05 , Processed in 0.043502 second(s), 21 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表