找回密码
 立即注册

QQ登录

只需一步,快速开始

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

STC15W408AS单片机显字陀螺制作 附程序

[复制链接]
跳转到指定楼层
楼主
完成效果图:

电路原理图如下:


PCB布线图:


PCB实物图:


这款指尖陀螺跟常见的显字陀螺不同点在于,多了一颗LED,不要小看一颗LED,显示效果会好很多。
显示效果对比图:
11颗LED:


12颗LED:


会减少很多粘连的笔画。

单片机源程序如下:
  1. /************旋转LED指尖陀螺程序**************/

  2. //----------|D1        |D2        | D3|D4        | D5| D6| D7|D8        |D9 |D10|D11||P32 |  P55   |        
  3. //----------|         |        |        |        |        |        |        |        |        |        |        ||          |                   |                 
  4. //----------|P10|P11|P12|P13|P14|P15|P30|P31|P33|P36|P37||霍尔|  按键  |        

  5. //----------字模取12x11点阵,黑体,低位先,从左至右,0有效


  6. #include <STC15F2K60S2.H>
  7. #include"intrins.h"
  8. #define uchar unsigned char        //宏定义
  9. #define uint unsigned int        //宏定义


  10. /***********************************
  11. ********   文字     ***************/
  12. uchar code wenzi0[]={

  13. 0xFD,0xF7,0xDD,0xF7,0xDD,0xF1,
  14. ........省略 见附件........
  15. //0xFE,0xFB,0xFC,0xF9,0x01,0xFC,/*"回",0*/
  16. ///* (12 X 11 ) */

  17. //};
  18. /////////////////////////////////////////////////////////////////////////////////////
  19. uchar code table0[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//从低位往高位移一个灯
  20. uchar idata xiancun[192];

  21. sbit key=P5^5;
  22. sbit LED=P5^4;
  23. sbit D1=P1^0;
  24. sbit D2=P1^1;
  25. sbit D3=P1^2;
  26. sbit D4=P1^3;
  27. sbit D5=P1^4;
  28. sbit D6=P1^5;
  29. sbit D7=P3^0;
  30. sbit D8=P3^1;
  31. sbit D9=P3^3;
  32. sbit D10=P3^6;
  33. sbit D11=P3^7;
  34. sbit D12=P5^4;

  35. uchar xuanze,a,b;               
  36. uint t,tt;
  37. uint t1,t2;
  38. uchar ms=0;
  39. /**********************************
  40. *****  延时子程序            *****/

  41. void delay(uint a)       
  42. {
  43.         uchar x;
  44.         while(a--)
  45.         {
  46.           for(x=0;x<150;x++);
  47.         }       
  48. }
  49.                                  
  50. /**********************************
  51. *****  10us延时子程序        *****/

  52. void delay10us(uint b)                //@11.0592MHz
  53. {
  54.         unsigned int a;
  55.         uchar i;
  56.         for(a=b;a>0;a--)
  57.    {


  58.         _nop_();
  59.         i = 25;
  60.         while (--i);
  61.   }
  62. }

  63. /*******************************
  64. ***** 定时器初始化程序 ********/
  65. void Timer0Init(void)                //10u秒@11.0592MHz
  66. {
  67.         AUXR |= 0x80;                //定时器时钟1T模式
  68.         TMOD &= 0xF0;                //设置定时器模式
  69.         TL0 = 0x91;                //设置定时初值
  70.         TH0 = 0xFF;                //设置定时初值
  71.         TF0 = 0;                //清除TF0标志
  72.         TR0 = 1;                //定时器0开始计时
  73.         ET0 = 1;                //定时器T0中断允许


  74.        
  75.         IE2  |= 0x04;
  76.         AUXR |= 0x04;                //定时器时钟1T模式
  77.         T2L = 0xCD;                //设置定时初值
  78.         T2H = 0xD4;                //设置定时初值
  79.         AUXR |= 0x10;                //定时器2开始计时
  80. }

  81. /********************************************/
  82. /*   LED测试程序,按住按键再开机,LED流水   */
  83. void ceshi()
  84. {
  85.         uchar i,a,b;
  86.         IE2  = 0x00;   //不允许T2中断
  87.         for(i=0;i<8;i++)
  88.         {
  89.                 a=table0[i];
  90.                 D1=a&0x01;
  91.                 D2=a&0x02;
  92.                 D3=a&0x04;
  93.                 D4=a&0x08;
  94.                 D5=a&0x10;
  95.                 D6=a&0x20;
  96.                 D7=a&0x40;
  97.                 D8=a&0x80;
  98.                 delay10us(20000);
  99.         }
  100.            D8=1;
  101.         for(i=0;i<4;i++)
  102.         {
  103.                        
  104.                 b=table0[i];
  105.                
  106.                 D9=b&0x01;
  107.                 D10=b&0x02;
  108.                 D11=b&0x04;
  109.         D12=b&0x08;
  110.                 delay10us(20000);
  111.         }
  112.         D12=1;
  113. }


  114. /**************************************/
  115. /*****    点阵数据送入显存程序    *****/
  116. void xianshi(uchar *p,uchar shu)
  117. {
  118.         uchar i;
  119.         for(i=0;i<(shu/2-(shu/2-96));i++)                  
  120.         {
  121.                 xiancun[i*2]=p[i*2];
  122.                 xiancun[i*2+1]=p[i*2+1];
  123.         }
  124.         for(i=(shu/2);i<96;i++)
  125.         {
  126.                 xiancun[i*2]=0xff;
  127.                 xiancun[i*2+1]=0xff;       
  128.         }       
  129. }
  130.                   
  131. /*******************************************************
  132. ****************主函数程序****************************/
  133. void main()
  134. {
  135.         uchar cs=0,i;
  136.         EA=1;                        //开总中断
  137.         EX0=1;                //允许使用外中断
  138.         IT0=1;                //负跳变触发方式(下降沿)
  139.         Timer0Init();        //1毫秒@11.0592MHz
  140.        
  141.         if(key==0){cs=1;}        //按住按键再上电
  142.         while(cs){ceshi();}        //进入测试模式(LED流水,以检查LED有无问题)
  143.        
  144.                

  145.        
  146.         while(1)
  147.         {
  148.           
  149.         if(key==0)
  150.          {
  151.                  delay(30);
  152.                 if(key==0)
  153.                 {
  154.                         xuanze+=1;
  155.                                  
  156.                         LED=0;
  157.                 }
  158.                 while(!key);
  159.                 LED=1;

  160.          }
  161. ////////////////////
  162.          switch(xuanze)
  163.                 {        //文字
  164.                         case(0):xianshi(wenzi0,sizeof(wenzi0));break;
  165.                         case(1):xianshi(wenzi1,sizeof(wenzi1));break;
  166.                         case(2):xianshi(wenzi2,sizeof(wenzi2));break;
  167.                         case(3):xianshi(wenzi3,sizeof(wenzi3));break;
  168.                         //图案
  169. //                        case(4):xianshi(tuan0,sizeof(tuan0));break;
  170. //                        case(5):xianshi(tuan1,sizeof(tuan1));break;
  171. //                        case(6):xianshi(tuan2,sizeof(tuan2));break;
  172. //                        case(7):xianshi(tuan3,sizeof(tuan3));break;
  173. //                        case(8):xianshi(tuan4,sizeof(tuan4));break;
  174.                         default:xuanze=0;break;                         
  175.                 }
  176.         //////////////////
  177.                  if(P32==0)
  178.                  {        tt=t;
  179.                         t=0;

  180.                         t1=0;  //转动时爆闪指示灯不工作
  181.                         t2=0;  //转动时掉电模式不工作
  182.                         if(tt>8000)tt=8000;
  183.                          
  184.                            for(i=0;i<96;i++)
  185.                           {
  186.                                 a=xiancun[i*2];
  187.                                 b=xiancun[i*2+1];
  188.                                 D1=a&0x01;
  189.                                 D2=a&0x02;
  190.                                 D3=a&0x04;
  191.                                 D4=a&0x08;
  192.                                 D5=a&0x10;
  193.                                 D6=a&0x20;
  194.                                 D7=a&0x40;
  195.                                 D8=a&0x80;

  196.                                 D9=b&0x01;
  197.                                 D10=b&0x02;
  198.                                 D11=b&0x04;
  199.                 D12=b&0x08;
  200.                                 delay10us(tt/(60*3));                //显示延时
  201.                                
  202.                          }
  203.             P1=P3=0xff;
  204. //                   a=b=0xff;
  205. //                           D1=a&0x01;
  206. //                        D2=a&0x02;
  207. //                        D3=a&0x04;
  208. //                        D4=a&0x08;
  209. //                        D5=a&0x10;
  210. //                        D6=a&0x20;
  211. //                        D7=a&0x40;
  212. //                        D8=a&0x80;

  213. //                        D9=b&0x01;
  214. //                        D10=b&0x02;
  215. //                        D11=b&0x04;
  216. //            D12=b&0x08;
  217.            }
  218.            if(t2>=10000)                //10秒进入掉电模式
  219.            {
  220.                            t2=0;
  221.                         D11=D1=1;                //进入掉电模式前关闭LED灯
  222.                         PCON=0x02;                 //进入掉电模式
  223.                         _nop_();
  224.                         _nop_();
  225.                         _nop_();
  226.                         D11=0;
  227.            }
  228.         }
  229. }


  230. /**************************************/
  231. /*定时器T0中断服务*/
  232. void Timer0(void) interrupt 1
  233. {         
  234.          
  235.          t++;
  236.        
  237. }
  238. /*定时器T2中断服务*/
  239. void interrupt_timer2() interrupt 12
  240. {         
  241.          
  242.          t1++;
  243.          t2++;
  244.          
  245.          switch(ms)
  246.          {
  247.                  case 0:
  248.                 D1=0;
  249.                 if(t1==50)         //D10亮200ms后转到模式1
  250.                 {
  251.                         ms=1;       
  252.                 }
  253.                 break;
  254.         //
  255.                 case 1:
  256.                 D1=1;
  257.                 if(t1>=950)         //D10灭500ms后转到模式0
  258.                 {
  259.                         t1=0;
  260.                         ms=0;
  261.                 }
  262.                 break;
  263.          }
  264. }
  265. /**************************************/                  
  266. /*外中断0服务程序*/       
  267. void zhongduan(void) interrupt 0
  268. {
  269.          
  270. }
复制代码

Keil代码下载(附件内只含代码,不含其他任何文件): Keil代码.7z (21.04 KB, 下载次数: 25)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

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

使用道具 举报

沙发
ID:16255 发表于 2022-9-26 22:48 | 只看该作者
显示分辨率还可以再提升提升。
回复

使用道具 举报

板凳
ID:281065 发表于 2022-9-26 22:52 | 只看该作者
mengsiu 发表于 2022-9-26 22:48
显示分辨率还可以再提升提升。

我用的灯珠是0603,间隔0.5毫米。还可以贴近一点,或者换小一号灯珠。
回复

使用道具 举报

地板
ID:16255 发表于 2022-9-27 19:02 | 只看该作者
柠檬绿茶 发表于 2022-9-26 22:52
我用的灯珠是0603,间隔0.5毫米。还可以贴近一点,或者换小一号灯珠。

我是想说,12个灯珠太少了,可以再多点。(显示汉字用16行的比较合适)
回复

使用道具 举报

5#
ID:281065 发表于 2022-9-27 20:42 | 只看该作者
mengsiu 发表于 2022-9-27 19:02
我是想说,12个灯珠太少了,可以再多点。(显示汉字用16行的比较合适)

IO不够了,我选的这款单片机只有14个IO。12个用来显示,一个按键,一个转速检测,刚好用完。再换型号又要重新设计。
回复

使用道具 举报

6#
ID:430492 发表于 2022-10-19 15:22 | 只看该作者
楼主,外部霍尔传感器中断程序啥也没写呀?能好使吗?
回复

使用道具 举报

7#
ID:430492 发表于 2022-10-19 15:25 | 只看该作者
这个电路可以改为16个LED的模式,就是用两个管脚作为公共脚,再用8个管脚作为LED的驱动脚,用两个公共管脚来切换,实现每次显示16位。
回复

使用道具 举报

8#
ID:430492 发表于 2022-10-19 15:38 | 只看该作者
cooleaf 发表于 2022-10-19 15:22
楼主,外部霍尔传感器中断程序啥也没写呀?能好使吗?

原来是循环判断霍尔管脚低电位,没有采用外部中断模式。
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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