圣源电子制作

标题: Arduino 掷骰子实验 [打印本页]

作者: sydz    时间: 2012-4-28 12:15
标题: Arduino 掷骰子实验
转载自互联网!!!仅供学习

掷骰子
一、设计思路
掷骰子,主要是骰子点数的随机性。应该引用random函数。又因为筛子的点数是1~6,那么最后确定用到的函数应该是random(min,max)。
题目中给出的是使用led灯,用六个led灯来表示不同的数字,当然需要上拉电阻避免超过led灯的最大电流。
同样还有倾斜开关。利用晃动时不同的角度里面的滚珠的滚动来形成不同的电压值因此而触发电路,通过读取倾斜开关的金色端得电压值来确定灯得亮灭。
由于六个led灯形成的点数不够直观,我又加上了数码管来显示,同样也需要上拉电阻配合使用,这样更清楚的显示。
蜂鸣器是因为发出的声音间隔不一样,形成的频率就会不一样,还有可以通过循环的次数来解决题目中蜂鸣器的要求。
二、物品清单
面包板、扩展板和控制板的组合版,USB接线,导线,led灯,数码管,倾斜开关,蜂鸣器,220欧姆电阻
三、照片
(led灯从左到右分别代表数字是1~6,接的IO口8~13,数码管接的IO口是0~6,蜂鸣器的IO口是7)
(最后一个随机数是3,那么数码管显示为3)


四、代码
  1. int buzzer=7;//蜂鸣器正极是数字端7
  2. int a=0;
  3. int b=1;
  4. int c=2;
  5. int d=3;
  6. int e=4;
  7. int f=5;
  8. int g=6;//因为dp脚一直是灭,所以直接高电平
  9. void buzzerZ()//蜂鸣器发出“嘀”声音子程序
  10. {      int i;
  11.         for(i=0;i<=2;i++)    //响三声,在最后一个随机数字出来时候
  12.         {
  13.         digitalWrite(buzzer,HIGH);//发声音
  14.         delay(125);//延时125ms
  15.         digitalWrite(buzzer,LOW);//不发声音
  16.         delay(125);//延时125ms,因为说是4Hz的频率
  17.         }
  18. }
  19. //显示数字1
  20. void digital_1(void)
  21. {
  22.   digitalWrite(c,LOW);//给数字5引脚低电平,点亮c段
  23.   digitalWrite(b,LOW);//点亮b段
  24.   digitalWrite(f,HIGH);
  25.   digitalWrite(d,HIGH);
  26.   digitalWrite(a,HIGH);
  27.   digitalWrite(g,HIGH);
  28.   digitalWrite(e,HIGH);
  29.   
  30. }
  31. //显示数字2
  32. void digital_2(void)
  33. {
  34.   digitalWrite(b,LOW);
  35.   digitalWrite(a,LOW);
  36.   digitalWrite(g,LOW);
  37.   digitalWrite(e,LOW);
  38.   digitalWrite(d,LOW);
  39.   digitalWrite(c,HIGH);
  40.   digitalWrite(f,HIGH);
  41. }
  42. //显示数字3
  43. void digital_3(void)
  44. {
  45.   unsigned char j;
  46.   digitalWrite(g,LOW);
  47.   digitalWrite(d,LOW);
  48.   digitalWrite(a,LOW);
  49.   digitalWrite(b,LOW);
  50.   digitalWrite(c,LOW);
  51.   digitalWrite(f,HIGH);
  52.   digitalWrite(e,HIGH);
  53. }
  54. //显示数字4
  55. void digital_4(void)
  56. {
  57.   digitalWrite(c,LOW);
  58.   digitalWrite(b,LOW);
  59.   digitalWrite(f,LOW);
  60.   digitalWrite(g,LOW);
  61.   digitalWrite(a,HIGH);
  62.   digitalWrite(e,HIGH);
  63.   digitalWrite(d,HIGH);   
  64. }
  65. //显示数字5
  66. void digital_5(void)
  67. {
  68.   digitalWrite(a,LOW);
  69.   digitalWrite(f,LOW);
  70.   digitalWrite(g,LOW);
  71.   digitalWrite(c,LOW);
  72.   digitalWrite(d,LOW);
  73.   digitalWrite(b,HIGH);
  74.   digitalWrite(e,HIGH);
  75. }
  76. //显示数字6
  77. void digital_6(void)
  78. {
  79.   digitalWrite(a,LOW);
  80.   digitalWrite(f,LOW);
  81.   digitalWrite(g,LOW);
  82.   digitalWrite(d,LOW);
  83.   digitalWrite(c,LOW);
  84.   digitalWrite(e,LOW);
  85.   digitalWrite(b,HIGH);   
  86. }
  87. void digital(void)//全灭
  88. {
  89.   digitalWrite(a,HIGH);
  90.   digitalWrite(f,HIGH);
  91.   digitalWrite(g,HIGH);
  92.   digitalWrite(d,HIGH);
  93.   digitalWrite(c,HIGH);
  94.   digitalWrite(e,HIGH);
  95.   digitalWrite(b,HIGH);   
  96. }
  97. void setup()
  98. {   
  99.      int i,j;
  100.      pinMode(buzzer,OUTPUT);
  101.      for(i=8;i<=13;i++)
  102.   {
  103.        pinMode(i,OUTPUT);//将8~13引脚设置为输出模式
  104.   }  
  105.   for(j=0;j<=6;j++)
  106.     pinMode(j,OUTPUT);//设置0~6引脚为输出模式
  107. }
  108. void loop()
  109. {
  110.     int i,j,k,l,m;//定义变量i,j,k,l,m
  111.     while(1)
  112.    {
  113.     // i=analogRead(5);//读取模拟5口电压值
  114.        for(k=1;k<=99;k++)//因为从每10ms到1s产生的随机数,需要100秒,所以要循环100次,但是最后一次需要定下来随机数,不再改变,所以要单独写
  115.      {  for(l=10;l<1000/l;l=l+10)//因为如果是10ms产生一次,那么1s需要50次,那么按此累加的时候循环的次数是1000/周期
  116.        {
  117.          digital();
  118.         i=analogRead(5);//读取模拟5口电压值(倾斜开关)
  119.          if(i>206)//如果大于206(1.25V)
  120.        {  
  121.          j=random(8,13);
  122.          digitalWrite(j,HIGH);//点亮led灯
  123.           delay(10*k);//间隔时间
  124.         // else//否则
  125.        //j=random(8,13);
  126.           digitalWrite(j,LOW);//熄灭led灯
  127.        }
  128.        }
  129.      }
  130.        delay(1000);
  131.        m=random(8,13);
  132.        digitalWrite(m,HIGH);//最后一次的随机数字不再灭(如果重新摇骰子,需要按键reset)
  133.        buzzerZ();//蜂鸣器
  134.        if(m==13)//根据灯亮的情况来显示数码管的数字
  135.        { digital_1();}//数字1
  136.     else if(m==12)
  137.     {digital_2();}
  138.     else if(m==11)
  139.     {digital_3();}
  140.     else if(m==10)
  141.     {digital_4();}
  142.     else if(m==9)
  143.     {digital_5();}
  144.     else if(m==8)
  145.     {digital_6();}
  146.        while(1){}
  147.    }
  148. }
复制代码





欢迎光临 圣源电子制作 (https://bbs.syyyd.com/) Powered by Discuz! X3.4