完成效果图:
电路原理图如下:
PCB布线图:
PCB实物图:
这款指尖陀螺跟常见的显字陀螺不同点在于,多了一颗LED,不要小看一颗LED,显示效果会好很多。
显示效果对比图:
11颗LED:
12颗LED:
会减少很多粘连的笔画。
单片机源程序如下:
- /************旋转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)
|