找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 7924|回复: 5
打印 上一主题 下一主题
收起左侧

用STC15W104单片机制作电子骰子电路图和程序

[复制链接]
跳转到指定楼层
楼主
和孩子玩飞行棋,骰子找不到了。就想起做个电子骰子。主控用了一块8脚的单片机STC15W104。考虑单片机直接驱动LED发光管,怕单片机电流吃不起,所以使用了一块74HC573当作输出驱动。为了显示尽量接近骰子,LED发光管采用了7个。之前用按钮,玩了一下,感觉不完美,改用离心开关后,甩动的形式来掷骰子有意思多了。电路见附件,加上一块锂电和充电保护板就行。因为待机2分钟后自动关闭显示。关闭显示后,待机电流6mA左右,也不必加装电源开关了。程序不长,与大家分享!

电路原理图如下:


单片机源程序如下:
  1. #include<stc15w.h>

  2. sbit a1 = P3^0;                 
  3. sbit a2 = P3^1;                 
  4. sbit a3 = P3^2;                 
  5. sbit a4 = P3^3;               
  6. //sbit beei = P3^4;         
  7. sbit k1 = P3^5;

  8. unsigned char i,m,r1;
  9. unsigned int u;

  10. void Delay50ms(unsigned char n)                //12.000MHz延时
  11. {
  12.         unsigned char i, j, k;

  13.         i = n;                                                        //3;
  14.         j = 72;
  15.         k = 161;
  16.         do
  17.         {
  18.                 do
  19.                 {
  20.                         while (--k);
  21.                 }
  22.                 while (--j);
  23.         }
  24.         while (--i);
  25. }
  26. void Timer0Init() interrupt 1                //50毫秒@12.000MHz
  27. {
  28.         TL0 = 0xB0;                //设置定时初值
  29.         TH0 = 0x3C;                //设置定时初值
  30.         r1++;                        //0~5滚动数值
  31.         if(r1 >= 6)
  32.                 r1 = 0;
  33.         if(u > 0)                //延时2分钟关闭显示
  34.                 u--;
  35.         else
  36.                 u = 0;
  37.         if(k1 == 0)                //离心开关接通时,重新计时
  38.                 u = 2400;                
  39. }

  40. void main()
  41. {
  42.     unsigned char s = 0;
  43.         P3 = 0xff;
  44.         m = 15;

  45.         TMOD = 0x01;                    //设置定时器为模式1
  46.     TL0 = 0xB0;                                                //设置定时初值
  47.         TH0 = 0x3C;                                                //设置定时初值
  48.     TR0 = 1;                        //定时器0开始计时
  49.     ET0 = 1;                        //使能定时器0中断
  50.     EA = 1;
  51.         while(1)
  52.         {
  53.                 while(u>0)                                        //离心开关接通后,2分钟以内
  54.                 {
  55.                         if(k1 == 0)                                //离心开关接通
  56.                         {
  57.                                 u = 2400;
  58.                         //        i++;
  59.                         //        if(m >= 3)
  60.                         //                m--;
  61.                                 m = 2;
  62.                 //                Delay50ms(2);
  63.                         //        if(i >= 6)
  64.                                         i = r1;                        //摇中的初值
  65.                         }
  66.                         else
  67.                         {                                                //骰子惯性效果
  68.                                 if(m == 2)                       
  69.                                 {
  70.                                            s++;
  71.                                         i++;
  72.                                         Delay50ms(m);
  73.                                         if(i >= 6)
  74.                                                 i = 0;
  75.                                         if(s >= 50)
  76.                                                 m++;
  77.                                 }
  78.                                 else if(m < 15)
  79.                                 {
  80.                                         i++;
  81.                                         m++;                               
  82.                                         Delay50ms(m);
  83.                                         if(i >= 6)
  84.                                                 i = 0;
  85.                                 }
  86.                                 else
  87.                                         s = 0;
  88.                         }                                                //最终值显示
  89.                         if(i == 0)
  90.                         {
  91.                                 a1 = 0;
  92.                                 a2 = 0;
  93.                                 a3 = 0;
  94.                                 a4 = 1;         
  95.                         }
  96.                         else if(i == 1)
  97.                         {
  98.                                 a4 = 0;
  99.                                 a1 = 1;
  100.                                 a2 = 1;
  101.                                 a3 = 1;
  102.                         }
  103.                         else if(i == 2)
  104.                         {
  105.                                 a3 = 0;
  106.                                 a1 = 1;
  107.                                 a2 = 1;
  108.                                 a4 = 1;
  109.                         }
  110.                         else if(i == 3)
  111.                         {
  112.                                 a2 = 0;
  113.                                 a4 = 0;
  114.                                 a1 = 1;
  115.                                 a3 = 1;
  116.                         }
  117.                         else if(i == 4)
  118.                         {
  119.                                 a1 = 0;
  120.                                 a2 = 0;
  121.                                 a3 = 1;
  122.                                 a4 = 1;
  123.                         }
  124.                         else if(i == 5)
  125.                         {
  126.                                 a1 = 0;
  127.                                 a2 = 0;
  128.                                 a4 = 0;
  129.                                 a3 = 1;
  130.                         }

  131.                 }                                            //延时到,关闭显示后,电路电流6mA左右,用锂电加充电保护板不用开关。
  132.                 a1 = 1;
  133.                 a2 = 1;
  134.                 a3 = 1;
  135.                 a4 = 1;
  136.         }
  137. }
复制代码

所有资料51hei提供下载:
骰子.rar (20.73 KB, 下载次数: 53)

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏5 分享淘帖 顶1 踩
回复

使用道具 举报

沙发
ID:561986 发表于 2019-6-15 11:05 | 只看该作者
学习了,刚刚想用STC15W104做接收
回复

使用道具 举报

板凳
ID:105826 发表于 2019-9-12 11:26 | 只看该作者
虽然实用性不高,但很有创意,并且为儿子的兴趣爱好做了一次亲身教育!
回复

使用道具 举报

地板
ID:670808 发表于 2020-1-31 16:45 | 只看该作者
p3和LED正极好像没有接到单片机上
回复

使用道具 举报

5#
ID:1003999 发表于 2022-2-3 09:05 来自手机 | 只看该作者
再加两块P10单元板,能制作飞行棋吗?再加上撞飞机的音效,还做到落棋不悔了
回复

使用道具 举报

6#
ID:385830 发表于 2022-2-3 11:55 | 只看该作者
做的不错。就是 离心开关 不如用 震动开关,数据可采用 随机数 来产生。
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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