找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 2790|回復(fù): 7
打印 上一主題 下一主題
收起左側(cè)

STC15W408AS單片機(jī)顯字陀螺制作 附程序

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
完成效果圖:

電路原理圖如下:


PCB布線圖:


PCB實(shí)物圖:


這款指尖陀螺跟常見(jiàn)的顯字陀螺不同點(diǎn)在于,多了一顆LED,不要小看一顆LED,顯示效果會(huì)好很多。
顯示效果對(duì)比圖:
11顆LED:


12顆LED:


會(huì)減少很多粘連的筆畫。

單片機(jī)源程序如下:
  1. /************旋轉(zhuǎn)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點(diǎn)陣,黑體,低位先,從左至右,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. ........省略 見(jiàn)附件........
  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};//從低位往高位移一個(gè)燈
  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. *****  延時(shí)子程序            *****/

  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延時(shí)子程序        *****/

  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. ***** 定時(shí)器初始化程序 ********/
  65. void Timer0Init(void)                //10u秒@11.0592MHz
  66. {
  67.         AUXR |= 0x80;                //定時(shí)器時(shí)鐘1T模式
  68.         TMOD &= 0xF0;                //設(shè)置定時(shí)器模式
  69.         TL0 = 0x91;                //設(shè)置定時(shí)初值
  70.         TH0 = 0xFF;                //設(shè)置定時(shí)初值
  71.         TF0 = 0;                //清除TF0標(biāo)志
  72.         TR0 = 1;                //定時(shí)器0開(kāi)始計(jì)時(shí)
  73.         ET0 = 1;                //定時(shí)器T0中斷允許


  74.        
  75.         IE2  |= 0x04;
  76.         AUXR |= 0x04;                //定時(shí)器時(shí)鐘1T模式
  77.         T2L = 0xCD;                //設(shè)置定時(shí)初值
  78.         T2H = 0xD4;                //設(shè)置定時(shí)初值
  79.         AUXR |= 0x10;                //定時(shí)器2開(kāi)始計(jì)時(shí)
  80. }

  81. /********************************************/
  82. /*   LED測(cè)試程序,按住按鍵再開(kāi)機(jī),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. /*****    點(diǎn)陣數(shù)據(jù)送入顯存程序    *****/
  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. ****************主函數(shù)程序****************************/
  133. void main()
  134. {
  135.         uchar cs=0,i;
  136.         EA=1;                        //開(kāi)總中斷
  137.         EX0=1;                //允許使用外中斷
  138.         IT0=1;                //負(fù)跳變觸發(fā)方式(下降沿)
  139.         Timer0Init();        //1毫秒@11.0592MHz
  140.        
  141.         if(key==0){cs=1;}        //按住按鍵再上電
  142.         while(cs){ceshi();}        //進(jìn)入測(cè)試模式(LED流水,以檢查L(zhǎng)ED有無(wú)問(wèn)題)
  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;  //轉(zhuǎn)動(dòng)時(shí)爆閃指示燈不工作
  181.                         t2=0;  //轉(zhuǎn)動(dòng)時(shí)掉電模式不工作
  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));                //顯示延時(shí)
  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秒進(jìn)入掉電模式
  219.            {
  220.                            t2=0;
  221.                         D11=D1=1;                //進(jìn)入掉電模式前關(guān)閉LED燈
  222.                         PCON=0x02;                 //進(jìn)入掉電模式
  223.                         _nop_();
  224.                         _nop_();
  225.                         _nop_();
  226.                         D11=0;
  227.            }
  228.         }
  229. }


  230. /**************************************/
  231. /*定時(shí)器T0中斷服務(wù)*/
  232. void Timer0(void) interrupt 1
  233. {         
  234.          
  235.          t++;
  236.        
  237. }
  238. /*定時(shí)器T2中斷服務(wù)*/
  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后轉(zhuǎn)到模式1
  250.                 {
  251.                         ms=1;       
  252.                 }
  253.                 break;
  254.         //
  255.                 case 1:
  256.                 D1=1;
  257.                 if(t1>=950)         //D10滅500ms后轉(zhuǎn)到模式0
  258.                 {
  259.                         t1=0;
  260.                         ms=0;
  261.                 }
  262.                 break;
  263.          }
  264. }
  265. /**************************************/                  
  266. /*外中斷0服務(wù)程序*/       
  267. void zhongduan(void) interrupt 0
  268. {
  269.          
  270. }
復(fù)制代碼

Keil代碼下載(附件內(nèi)只含代碼,不含其他任何文件): Keil代碼.7z (21.04 KB, 下載次數(shù): 28)

評(píng)分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評(píng)分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏3 分享淘帖 頂1 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:16255 發(fā)表于 2022-9-26 22:48 | 只看該作者
顯示分辨率還可以再提升提升。
回復(fù)

使用道具 舉報(bào)

板凳
ID:281065 發(fā)表于 2022-9-26 22:52 | 只看該作者
mengsiu 發(fā)表于 2022-9-26 22:48
顯示分辨率還可以再提升提升。

我用的燈珠是0603,間隔0.5毫米。還可以貼近一點(diǎn),或者換小一號(hào)燈珠。
回復(fù)

使用道具 舉報(bào)

地板
ID:16255 發(fā)表于 2022-9-27 19:02 | 只看該作者
檸檬綠茶 發(fā)表于 2022-9-26 22:52
我用的燈珠是0603,間隔0.5毫米。還可以貼近一點(diǎn),或者換小一號(hào)燈珠。

我是想說(shuō),12個(gè)燈珠太少了,可以再多點(diǎn)。(顯示漢字用16行的比較合適)
回復(fù)

使用道具 舉報(bào)

5#
ID:281065 發(fā)表于 2022-9-27 20:42 | 只看該作者
mengsiu 發(fā)表于 2022-9-27 19:02
我是想說(shuō),12個(gè)燈珠太少了,可以再多點(diǎn)。(顯示漢字用16行的比較合適)

IO不夠了,我選的這款單片機(jī)只有14個(gè)IO。12個(gè)用來(lái)顯示,一個(gè)按鍵,一個(gè)轉(zhuǎn)速檢測(cè),剛好用完。再換型號(hào)又要重新設(shè)計(jì)。
回復(fù)

使用道具 舉報(bào)

6#
ID:430492 發(fā)表于 2022-10-19 15:22 | 只看該作者
樓主,外部霍爾傳感器中斷程序啥也沒(méi)寫呀?能好使嗎?
回復(fù)

使用道具 舉報(bào)

7#
ID:430492 發(fā)表于 2022-10-19 15:25 | 只看該作者
這個(gè)電路可以改為16個(gè)LED的模式,就是用兩個(gè)管腳作為公共腳,再用8個(gè)管腳作為L(zhǎng)ED的驅(qū)動(dòng)腳,用兩個(gè)公共管腳來(lái)切換,實(shí)現(xiàn)每次顯示16位。
回復(fù)

使用道具 舉報(bào)

8#
ID:430492 發(fā)表于 2022-10-19 15:38 | 只看該作者
cooleaf 發(fā)表于 2022-10-19 15:22
樓主,外部霍爾傳感器中斷程序啥也沒(méi)寫呀?能好使嗎?

原來(lái)是循環(huán)判斷霍爾管腳低電位,沒(méi)有采用外部中斷模式。
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表