完成效果圖:
IMG_20220826_135315.jpg (3.43 MB, 下載次數: 42)
下載附件
2022-9-26 15:35 上傳
電路原理圖如下:
屏幕截圖 2022-08-21 014522.png (147.87 KB, 下載次數: 40)
下載附件
2022-9-26 15:35 上傳
PCB布線圖:
屏幕截圖 2022-08-21 014600.png (119.72 KB, 下載次數: 40)
下載附件
2022-9-26 15:35 上傳
PCB實物圖:
IMG_20220826_151844.jpg (7.24 MB, 下載次數: 45)
下載附件
2022-9-26 15:36 上傳
這款指尖陀螺跟常見的顯字陀螺不同點在于,多了一顆LED,不要小看一顆LED,顯示效果會好很多。
顯示效果對比圖:
11顆LED:
屏幕截圖 2022-08-26 140857.png (34.95 KB, 下載次數: 40)
下載附件
2022-9-26 15:36 上傳
12顆LED:
屏幕截圖 2022-08-26 140447.png (37.61 KB, 下載次數: 45)
下載附件
2022-9-26 15:36 上傳
會減少很多粘連的筆畫。
單片機源程序如下:
- /************旋轉LED指尖陀螺程序**************/
- //----------|D1 |D2 | D3|D4 | D5| D6| D7|D8 |D9 |D10|D11||P32 | P55 |
- //----------| | | | | | | | | | | || | |
- //----------|P10|P11|P12|P13|P14|P15|P30|P31|P33|P36|P37||霍爾| 按鍵 |
- //----------字模取12x11點陣,黑體,低位先,從左至右,0有效
- #include <STC15F2K60S2.H>
- #include"intrins.h"
- #define uchar unsigned char //宏定義
- #define uint unsigned int //宏定義
- /***********************************
- ******** 文字 ***************/
- uchar code wenzi0[]={
- 0xFD,0xF7,0xDD,0xF7,0xDD,0xF1,
- ........省略 見附件........
- //0xFE,0xFB,0xFC,0xF9,0x01,0xFC,/*"回",0*/
- ///* (12 X 11 ) */
- //};
- /////////////////////////////////////////////////////////////////////////////////////
- uchar code table0[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//從低位往高位移一個燈
- uchar idata xiancun[192];
- sbit key=P5^5;
- sbit LED=P5^4;
- sbit D1=P1^0;
- sbit D2=P1^1;
- sbit D3=P1^2;
- sbit D4=P1^3;
- sbit D5=P1^4;
- sbit D6=P1^5;
- sbit D7=P3^0;
- sbit D8=P3^1;
- sbit D9=P3^3;
- sbit D10=P3^6;
- sbit D11=P3^7;
- sbit D12=P5^4;
- uchar xuanze,a,b;
- uint t,tt;
- uint t1,t2;
- uchar ms=0;
- /**********************************
- ***** 延時子程序 *****/
- void delay(uint a)
- {
- uchar x;
- while(a--)
- {
- for(x=0;x<150;x++);
- }
- }
-
- /**********************************
- ***** 10us延時子程序 *****/
- void delay10us(uint b) //@11.0592MHz
- {
- unsigned int a;
- uchar i;
- for(a=b;a>0;a--)
- {
- _nop_();
- i = 25;
- while (--i);
- }
- }
- /*******************************
- ***** 定時器初始化程序 ********/
- void Timer0Init(void) //10u秒@11.0592MHz
- {
- AUXR |= 0x80; //定時器時鐘1T模式
- TMOD &= 0xF0; //設置定時器模式
- TL0 = 0x91; //設置定時初值
- TH0 = 0xFF; //設置定時初值
- TF0 = 0; //清除TF0標志
- TR0 = 1; //定時器0開始計時
- ET0 = 1; //定時器T0中斷允許
-
- IE2 |= 0x04;
- AUXR |= 0x04; //定時器時鐘1T模式
- T2L = 0xCD; //設置定時初值
- T2H = 0xD4; //設置定時初值
- AUXR |= 0x10; //定時器2開始計時
- }
- /********************************************/
- /* LED測試程序,按住按鍵再開機,LED流水 */
- void ceshi()
- {
- uchar i,a,b;
- IE2 = 0x00; //不允許T2中斷
- for(i=0;i<8;i++)
- {
- a=table0[i];
- D1=a&0x01;
- D2=a&0x02;
- D3=a&0x04;
- D4=a&0x08;
- D5=a&0x10;
- D6=a&0x20;
- D7=a&0x40;
- D8=a&0x80;
- delay10us(20000);
- }
- D8=1;
- for(i=0;i<4;i++)
- {
-
- b=table0[i];
-
- D9=b&0x01;
- D10=b&0x02;
- D11=b&0x04;
- D12=b&0x08;
- delay10us(20000);
- }
- D12=1;
- }
- /**************************************/
- /***** 點陣數據送入顯存程序 *****/
- void xianshi(uchar *p,uchar shu)
- {
- uchar i;
- for(i=0;i<(shu/2-(shu/2-96));i++)
- {
- xiancun[i*2]=p[i*2];
- xiancun[i*2+1]=p[i*2+1];
- }
- for(i=(shu/2);i<96;i++)
- {
- xiancun[i*2]=0xff;
- xiancun[i*2+1]=0xff;
- }
- }
-
- /*******************************************************
- ****************主函數程序****************************/
- void main()
- {
- uchar cs=0,i;
- EA=1; //開總中斷
- EX0=1; //允許使用外中斷
- IT0=1; //負跳變觸發方式(下降沿)
- Timer0Init(); //1毫秒@11.0592MHz
-
- if(key==0){cs=1;} //按住按鍵再上電
- while(cs){ceshi();} //進入測試模式(LED流水,以檢查LED有無問題)
-
-
-
- while(1)
- {
-
- if(key==0)
- {
- delay(30);
- if(key==0)
- {
- xuanze+=1;
-
- LED=0;
- }
- while(!key);
- LED=1;
-
- }
- ////////////////////
- switch(xuanze)
- { //文字
- case(0):xianshi(wenzi0,sizeof(wenzi0));break;
- case(1):xianshi(wenzi1,sizeof(wenzi1));break;
- case(2):xianshi(wenzi2,sizeof(wenzi2));break;
- case(3):xianshi(wenzi3,sizeof(wenzi3));break;
- //圖案
- // case(4):xianshi(tuan0,sizeof(tuan0));break;
- // case(5):xianshi(tuan1,sizeof(tuan1));break;
- // case(6):xianshi(tuan2,sizeof(tuan2));break;
- // case(7):xianshi(tuan3,sizeof(tuan3));break;
- // case(8):xianshi(tuan4,sizeof(tuan4));break;
- default:xuanze=0;break;
- }
- //////////////////
- if(P32==0)
- { tt=t;
- t=0;
- t1=0; //轉動時爆閃指示燈不工作
- t2=0; //轉動時掉電模式不工作
- if(tt>8000)tt=8000;
-
- for(i=0;i<96;i++)
- {
- a=xiancun[i*2];
- b=xiancun[i*2+1];
- D1=a&0x01;
- D2=a&0x02;
- D3=a&0x04;
- D4=a&0x08;
- D5=a&0x10;
- D6=a&0x20;
- D7=a&0x40;
- D8=a&0x80;
- D9=b&0x01;
- D10=b&0x02;
- D11=b&0x04;
- D12=b&0x08;
- delay10us(tt/(60*3)); //顯示延時
-
- }
- P1=P3=0xff;
- // a=b=0xff;
- // D1=a&0x01;
- // D2=a&0x02;
- // D3=a&0x04;
- // D4=a&0x08;
- // D5=a&0x10;
- // D6=a&0x20;
- // D7=a&0x40;
- // D8=a&0x80;
- // D9=b&0x01;
- // D10=b&0x02;
- // D11=b&0x04;
- // D12=b&0x08;
- }
- if(t2>=10000) //10秒進入掉電模式
- {
- t2=0;
- D11=D1=1; //進入掉電模式前關閉LED燈
- PCON=0x02; //進入掉電模式
- _nop_();
- _nop_();
- _nop_();
- D11=0;
- }
- }
- }
- /**************************************/
- /*定時器T0中斷服務*/
- void Timer0(void) interrupt 1
- {
-
- t++;
-
- }
- /*定時器T2中斷服務*/
- void interrupt_timer2() interrupt 12
- {
-
- t1++;
- t2++;
-
- switch(ms)
- {
- case 0:
- D1=0;
- if(t1==50) //D10亮200ms后轉到模式1
- {
- ms=1;
- }
- break;
- //
- case 1:
- D1=1;
- if(t1>=950) //D10滅500ms后轉到模式0
- {
- t1=0;
- ms=0;
- }
- break;
- }
- }
- /**************************************/
- /*外中斷0服務程序*/
- void zhongduan(void) interrupt 0
- {
-
- }
復制代碼
Keil代碼下載(附件內只含代碼,不含其他任何文件):
Keil代碼.7z
(21.04 KB, 下載次數: 28)
2022-9-26 15:50 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|