|
1.png (59.27 KB, 下載次數: 37)
下載附件
2021-1-20 12:46 上傳
5.png (11.44 KB, 下載次數: 61)
下載附件
2021-1-20 12:46 上傳
6.png (27.4 KB, 下載次數: 52)
下載附件
詳細程序 以及詳細的程序功能描述
2021-1-20 12:46 上傳
學習制作低階光立方的參考資料,以及以前課程中制作的一些光立方參考資料,有興趣的可以互相討論,目前正在開發加入人機互動,智能互聯功能。添加了幾個自己當時在做光立方的時候的幾種AD圖 有pad軟件的圖 有疑惑可以互相討論,或者提出意見,資料太多,無法一次傳完,有興趣的留言 交流傳給你
單片機源程序如下:
- /*---------------------------------------------------------------------------------------------------
- -----------------------------------------------------------------------------------------------------
- * 艾羅
- Build target 'Target 1'
- compiling main.c...
- linking...
- Program Size: data=111.7 xdata=1017 code=55161
- creating hex file from "最新app光立方源程序"...
- "最新app光立方源程序" - 0 Error(s), 0 Warning(s).
- ------------------------------------------------------------------------------------------------------
- -----------------------------------------------------------------------------------------------------*/
- #include "STC12C5A.H" //包含單片機的頭文件使用KEIL必須添加進來否則編譯不了
- #include "intrins.h" //包含NOP延時頭文件
- #include "main.h" //主程序頭文件
- #include "shuju.h" //包含字模數據數組
- #include "flash.h" //動畫部分程序
- #include "hongwai.h" //紅外部分程序
- #include "key.h" //按鍵部分程序
- #include "pinpu.h" //音樂頻譜部分程序
- #include "jiance.h" //開機檢測模式程序
- #include "moshi.h" //模式控制程序
- /*@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@定義變量@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@*/
- uchar xdata display[8][8];
- uchar data msd=0;
- uint ld=700;
- uchar data key2=0,key3=0;
- uchar data xsdsq=0;
- uchar data sj_read_flag=0;
- uchar data read_flag=0; //電腦上位機讀標記
- uchar data cnt=0;
- uchar data cot=0;
- uchar data cd=0,layerr=0,saom=0;
- uint liangdu = 400; //亮度
- uint donghua_shudu=500; //動畫速度調節
- int date=0; //串口2數據
- bit busy = 0; //串口判斷標記
- uchar data moshi=0; // 模式
- bit start3 = 0; //旋轉字母模式標記
- bit key1=0;
- uchar data abc_falg=0; //旋轉字母標記
- bit start1=1;//頻譜選擇標記
- uchar data ping=2; //頻譜選擇標記
- uchar data dong=2; //動畫選擇標記
- uchar data gai=2;// 選擇標記
- uchar data gaizi=2;//選擇標記
- bit start2=1;// 動畫選擇標記
- uchar data pingpu=0; //選擇哪個頻譜動畫
- uchar data donghua1=0; //選擇哪個脫機動畫
- bit start_shuju=0; //wifi接收數據開始標記
- bit abcd=0;//旋轉字母
- bit moshi_falg=0;
- uchar data dhms_falg=0;
- uchar data ppms_falg=0;
- uchar data sjms_falg=0;
- uchar data dnms_falg=0;
- uchar data gzms_falg=0;
- uchar data ldjian_falg=0;
- uchar data ldjia_falg=0;
- uchar data sdjia_falg=0;
- uchar data sdjian_falg=0;
- uchar data gzdh3_falg=0;
- uchar gzdh3=0;
- bit gaizi1_flag=1; //開機檢測有沒有保存過內容
- bit gaizi2_flag=1;
- bit gaizi3_flag=1;
- bit gaizi4_flag=1;
- uchar gaizi_geshu1=0; //改字的字數
- uchar gaizi_geshu2=0;
- uchar gaizi_geshu3=0;
- uchar jcount=0; //收到字母的個數
- bit kaiji_flag=0;//
- bit gaizhiflag=0;
- uchar gzms_falg1=0;
- uchar gzms_falg2=0;
- uchar gzms_falg3=0;
- uchar gzms_falg4=0;
- uchar gzms_falg5=0;
- /*##########################################################################################*/
- //************************************艾羅************************************
- //函數名稱:void init();
- //功 能:定義IO口功能
- //出口參數:無
- //編 寫 人:艾羅
- //編寫日期:2015-08-1
- //修改歷史:V1.0
- //************************************艾羅************************************
- void init()
- {
- P4SW=0xff; //定義P4口為I/O口
- P0M1=0x00;
- P0M0=0xff; //定義P0為強上拉輸出.
- P1M1=0x01;
- P1M0=0xfe; //定義P1為強上拉輸出. P1.0作為AD此時不能作為強上蠟
- P2M1=0x00;
- P2M0=0xff; //定義P2為強上拉輸出.
- P3M1=0x00;
- P3M0=0xf8; //定義P3為強上拉輸出.
- P4M1=0x00;
- P4M0=0xff; //定義P4為強上拉輸出.
- }
- /********************* AD初始化************************/
- void ADC0_Init (void)
- {
- uchar i;
- P1ASF = 0x01; //Open 8 channels ADC function
- ADC_RES = 0; //Clear previous result 清零ADC的8位數據
- AUXR1 &=0xFB; //1111,1011, 令 ADRJ=0 (10位A/D轉換結果的高8位放在ADC_RES寄存器, 低2位放在ADC_RESL寄存器)
- ADC_CONTR = ADC_POWER | ADC_SPEEDLL;//配置ADC寄存器
- for(i=0;i<24;i++)
- {
- _nop_();
- }
- }
- /*##########################################################################################*/
- //************************************艾羅************************************
- //函數名稱:void sinter()
- //功 能:中斷初始化
- //出口參數:無
- //編 寫 人:艾羅
- //編寫日期:2015-08-1
- //修改歷史:V1.0
- //************************************艾羅************************************
- void sinter()
- {
- TCON=0x01;
- TH0=0x10;
- TL0=0x00;
- IPH = 0xfc;
- ET0 = 1;
- TR0 = 1;
- }
- /********************* 串口初始化************************/
- void init_uart(void)
- {
- PCON |= 0x80;
- SCON = 0x50;
- AUXR |= 0x40;
- AUXR &= 0xFE;
- TMOD &= 0x0F;
- TMOD |= 0x20;
- TL1 = 0xE8;
- TH1 = 0xE8;
- ET1 = 0;
- TR1 = 1;
- ES=1;
- EA=1;
- }
- /*##########################################################################################*/
- //************************************艾羅************************************
- //函數名稱:void delayus(unsigned int yanshi);
- //功 能:根據yanshi值的大小進行延時等待操作,1默認為2uS
- //入口參數:yanshi的值,范圍0-65535
- //出口參數:無
- //編 寫 人:艾羅
- //編寫日期:2015-08-1
- //修改歷史:V1.0
- //************************************艾羅************************************
- void delayus(unsigned int yanshi)
- {
- unsigned int wmys; //定義延時循環控制變量
- for(wmys=0;wmys<=yanshi;wmys++); //根據延時參數進行空循環操作,達到延時功能
- }
- void delay10us(void) //誤差 -0.026765046296us STC 1T 22.1184Mhz
- {
- unsigned char a,b;
- for(b=1;b>0;b--)
- for(a=2;a>0;a--); //默認的速度為5,變速1-5-25-125
- }
- void delay5us(void) //誤差 -0.026765046296us STC 1T 22.1184Mhz
- {
- unsigned char a,b;
- for(b=1;b>0;b--)
- for(a=5;a>0;a--); //默認的速度為5,變速1-5-25-125
- }
- void delay(uint ihk)
- {
- if(key3==2){return;}
- else
- {
- while(ihk--)
- {
- delay5us(); //12t的mcu 注釋這個延時即可
- if(dong == 1){return;} if(gai == 1){return;}if(gaizhiflag==1){return;}
- }
- }
- }
- void delays(int t)
- {
- int i;
- while(t--)
- for(i=0;i<700;i++);
- }
- /*##########################################################################################*/
- //************************************艾羅************************************
- //函數名稱:void hansao(unsigned char hs);
- //功 能:根據入口參數hs的值,進行判斷選擇哪一行,選通1-8行的選通
- //入口參數:hs的值,范圍0-7
- //出口參數:無
- //編 寫 人:艾羅
- //************************************艾羅************************************
- void hansao(unsigned char hs)
- {
- if(hs<8) //判斷hs的值是否在行掃描的值范圍內,不在范圍內不執行任何操作
- {
- if(M_EN == 0)
- {
- if(hs==7) //選通第1行
- {
-
- P2=0Xfe;
- delayus(liangdu);
- P2 = 0xff; //消影
- return;
- }
- if(hs==6) //選通第2行
- {
- P2=0Xfd;
- delayus(liangdu);
- P2 = 0xff;
- return;
- }
- if(hs==5) //選通第3行
- {
- P2=0Xfb;
- delayus(liangdu);
- P2 = 0xff;
- return;
- }
- if(hs==4) //選通第4行
- {
- P2=0Xf7;
- delayus(liangdu);
- P2 = 0xff;
- return;
- }
- if(hs==3) //選通第5行
- {
- P2=0Xef;
- delayus(liangdu);
- P2 = 0xff;
- return;
- }
- if(hs==2) //選通第6行
- {
- P2=0Xdf;
- delayus(liangdu);
- P2 = 0xff;
- return;
- }
- if(hs==1) //選通第7行
- {
- P2=0Xbf;
- delayus(liangdu);
- P2 = 0xff;
- return;
- }
- if(hs==0) //選通第8行
- {
- P2=0X7f;
- delayus(liangdu);
- P2 = 0xff;
- return;
- }
- }
- }
- }
- //************************************595芯片驅動程序1 頻譜模式和后面動畫模式************************************
- void sendbyte(unsigned int num1,unsigned int num2,unsigned int num3,unsigned int num4)
- {
- unsigned char c;
- for(c=0;c<8;c++)
- {
- CLK=0;
- M_LR_DS0=num1&0x80;
- M_LG_DS0=num2&0x80;
- M_HR_DS0=num3&0x80;
- M_HG_DS0=num4&0x80;
- CLK=1;
- num1<<=1;
- num2<<=1;
- num3<<=1;
- num4<<=1;
- }
- }
- //************************************595芯片驅動程序2 //前面動畫************************************
- void sendbyte1(unsigned int num1,unsigned int num2,unsigned int num3,unsigned int num4)
- {
- unsigned char c;
- for(c=0;c<8;c++)
- {
- CLK=0; //模擬時鐘控制端口
- M_LR_DS0=num1&0x01; //模擬數據發送端口
- M_LG_DS0=num2&0x01;
- M_HR_DS0=num3&0x01;
- M_HG_DS0=num4&0x01;
- CLK=1;
- num1>>=1;
- num2>>=1;
- num3>>=1;
- num4>>=1;
- }
- }
- //************************************595芯片驅動程序3 上位機控制部分***********************************
- void sendbyteck(unsigned int num1,unsigned int num2,unsigned int num3,unsigned int num4)
- {
- unsigned char c;
- for(c=0;c<8;c++)
- {
- CLK=0;
- M_LR_DS0=num1&0x01;
- M_LG_DS0=num2&0x01;
- M_HR_DS0=num3&0x01;
- M_HG_DS0=num4&0x01;
- CLK=1;
- num1>>=1;
- num2>>=1;
- num3>>=1;
- num4>>=1;
- }
- }
- void fvb() //電腦上位機數據處理
- {
- if(read_flag)
- {
- read_flag=0;
- for(saom=0;saom<8;saom++)
- {
- displayck[saom+0]=((shuzu8X8[saom*8]>>7)&0x01)+(((shuzu8X8[saom*8+1]>>7)&0x01)<<1)+(((shuzu8X8[saom*8+2]>>7)&0x01)<<2)+(((shuzu8X8[saom*8+3]>>7)&0x01)<<3)+(((shuzu8X8[saom*8+4]>>7)&0x01)<<4)+(((shuzu8X8[saom*8+5]>>7)&0x01)<<5)+(((shuzu8X8[saom*8+6]>>7)&0x01)<<6)+(((shuzu8X8[saom*8+7]>>7)&0x01)<<7);
- displayck[saom+8]=((shuzu8X8[saom*8]>>6)&0x01)+(((shuzu8X8[saom*8+1]>>6)&0x01)<<1)+(((shuzu8X8[saom*8+2]>>6)&0x01)<<2)+(((shuzu8X8[saom*8+3]>>6)&0x01)<<3)+(((shuzu8X8[saom*8+4]>>6)&0x01)<<4)+(((shuzu8X8[saom*8+5]>>6)&0x01)<<5)+(((shuzu8X8[saom*8+6]>>6)&0x01)<<6)+(((shuzu8X8[saom*8+7]>>6)&0x01)<<7);
- displayck[saom+16]=((shuzu8X8[saom*8]>>5)&0x01)+(((shuzu8X8[saom*8+1]>>5)&0x01)<<1)+(((shuzu8X8[saom*8+2]>>5)&0x01)<<2)+(((shuzu8X8[saom*8+3]>>5)&0x01)<<3)+(((shuzu8X8[saom*8+4]>>5)&0x01)<<4)+(((shuzu8X8[saom*8+5]>>5)&0x01)<<5)+(((shuzu8X8[saom*8+6]>>5)&0x01)<<6)+(((shuzu8X8[saom*8+7]>>5)&0x01)<<7);
- displayck[saom+24]=((shuzu8X8[saom*8]>>4)&0x01)+(((shuzu8X8[saom*8+1]>>4)&0x01)<<1)+(((shuzu8X8[saom*8+2]>>4)&0x01)<<2)+(((shuzu8X8[saom*8+3]>>4)&0x01)<<3)+(((shuzu8X8[saom*8+4]>>4)&0x01)<<4)+(((shuzu8X8[saom*8+5]>>4)&0x01)<<5)+(((shuzu8X8[saom*8+6]>>4)&0x01)<<6)+(((shuzu8X8[saom*8+7]>>4)&0x01)<<7);
- displayck[saom+32]=((shuzu8X8[saom*8]>>3)&0x01)+(((shuzu8X8[saom*8+1]>>3)&0x01)<<1)+(((shuzu8X8[saom*8+2]>>3)&0x01)<<2)+(((shuzu8X8[saom*8+3]>>3)&0x01)<<3)+(((shuzu8X8[saom*8+4]>>3)&0x01)<<4)+(((shuzu8X8[saom*8+5]>>3)&0x01)<<5)+(((shuzu8X8[saom*8+6]>>3)&0x01)<<6)+(((shuzu8X8[saom*8+7]>>3)&0x01)<<7);
- displayck[saom+40]=((shuzu8X8[saom*8]>>2)&0x01)+(((shuzu8X8[saom*8+1]>>2)&0x01)<<1)+(((shuzu8X8[saom*8+2]>>2)&0x01)<<2)+(((shuzu8X8[saom*8+3]>>2)&0x01)<<3)+(((shuzu8X8[saom*8+4]>>2)&0x01)<<4)+(((shuzu8X8[saom*8+5]>>2)&0x01)<<5)+(((shuzu8X8[saom*8+6]>>2)&0x01)<<6)+(((shuzu8X8[saom*8+7]>>2)&0x01)<<7);
- displayck[saom+48]=((shuzu8X8[saom*8]>>1)&0x01)+(((shuzu8X8[saom*8+1]>>1)&0x01)<<1)+(((shuzu8X8[saom*8+2]>>1)&0x01)<<2)+(((shuzu8X8[saom*8+3]>>1)&0x01)<<3)+(((shuzu8X8[saom*8+4]>>1)&0x01)<<4)+(((shuzu8X8[saom*8+5]>>1)&0x01)<<5)+(((shuzu8X8[saom*8+6]>>1)&0x01)<<6)+(((shuzu8X8[saom*8+7]>>1)&0x01)<<7);
- displayck[saom+56]=((shuzu8X8[saom*8]>>0)&0x01)+(((shuzu8X8[saom*8+1]>>0)&0x01)<<1)+(((shuzu8X8[saom*8+2]>>0)&0x01)<<2)+(((shuzu8X8[saom*8+3]>>0)&0x01)<<3)+(((shuzu8X8[saom*8+4]>>0)&0x01)<<4)+(((shuzu8X8[saom*8+5]>>0)&0x01)<<5)+(((shuzu8X8[saom*8+6]>>0)&0x01)<<6)+(((shuzu8X8[saom*8+7]>>0)&0x01)<<7);
- }
- }
- for(layerr=0;layerr<8;layerr++)
- {
- key_baihei_scan();
- hansao(layerr);
- sendbyteck(~displayck[layerr*8+0],~displayck[layerr*8+2],~displayck[layerr*8+4],~displayck[layerr*8+5]);
- sendbyteck(~displayck[layerr*8+3],~displayck[layerr*8+1],~displayck[layerr*8+6],~displayck[layerr*8+7]);
- SUO=0; //模擬鎖存信號端口
- _nop_();
- SUO=1;
- M_EN=0;
- hansao(layerr);
- delayus(ld);
- M_EN=1;
- if(key2==1||key2==2||key2==4||key2==5)
- {
- break;
- }
- }
- }
- void zhen(uchar *a,uchar v) //前面動畫數據處理
- {
- char layer;
- while(v--)
- {
- for(layer=0;layer<8;layer++)
- {
- if(xsdsq==1){;}
- else
- {
- key_baihei_scan();
- if(msd==2||msd==6)
- {
- if(key2==1||key2==3||key2==5||key2==4)
- {
- key3=1;
- M_EN=1;
- break;
- }
- }
- if(msd==4)
- {
- if(key2==1||key2==3||key2==5||key2==2)
- {
- key3=1;
- M_EN=1;
- break;
- }
- }
- }
- sendbyte1(~a[layer*8+7],~a[layer*8+5],~a[layer*8+3],~a[layer*8+2]);
- sendbyte1(~a[layer*8+4],~a[layer*8+6],~a[layer*8+1],~a[layer*8+0]);
- SUO=0;
- _nop_();
- SUO=1;
- M_EN=0;
- hansao(7-layer);
- delayus(donghua_shudu);
- M_EN=1;
- if(dong == 1){ break;}
- if(abcd == 1){break;}
- if(gai == 1){break;}
- }
- delays(2);
- }
- }
- void W_side(uchar *tab,char num,char v)
- {
- uchar a[64]={0};
- int i,j;
- for(j=0;j<num;j++)
- {
- for(i=0;i<8;i++)
- a[i*8+7]=tab[j*8+i];
- if(key3==1){break;}
- else{zhen(a,v);}
- delay(50);
- }
- }
- /*@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 主函數 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@*/
- void main()
- {
- unsigned char p=0,k=0,l=0; //定義
- init();
- start_shuju = 1;
- IDelay(100);
- IRInit();
- ADC0_Init();
- clear(0);
- PWM_LED();//開啟PWM呼吸燈功能
- moshi = 0;
- key2 = 0;
- ping=2;
- dong=2;
- gai=2;
- gaizi=0;
- pingpu = 0;
- donghua1 = 0;
- start1 = 1;
- start2 = 1;
- turn_on(10);
- H_scan(10); // 左向右掃描檢測
- V_scan(10); //下向上掃描檢測
- W_scan(10); //前向后掃描檢測
- PWM_POW=0; //打開電源指示燈
- sinter();
- TR0=0; //關閉定時器顯示掃描 相當于關閉頻譜模式顯示和后面部分動畫顯示
- while(1) //開機檢測模式
- {
- H_scan(40); // 左向右掃描檢測
- V_scan(40); //下向上掃描檢測
- W_scan(40); //前向后掃描檢測
- if(key1 == 1)
- {
- msd=2;
- break;
- }
- if(key2==3||key2==1||key2==4||key2==5||key2==2)
- {
- if(key2==3)
- {
- msd=3;break;
- }
- else
- {
- if(key2==1)
- {
- msd=1;break;
- }
- if(key2==4)
- {
- msd=4;
- break;
- }
- if(key2==5)
- {
- msd=5;
- break;
- }
- if(key2==2)
- {
- msd=2;
- break;
- }
- }
- }
- }
- delay(10); //如果是前面動畫和上機模式需要延時下
- while(1) /*play list*/
- {
- kaiji_flag = 1; //開機后
- yinyue_moshi();//音樂頻譜模式
- donghua_moshi();//動畫模式
- shangweiji_moshi(); //上位機模式
- xiugaidonghua_moshi(); //顯示文字動畫
- }
- }
- /************************************串口中斷1************************************/
- void serial (void) interrupt 4 using 1
- {
- uchar tempbuff;ES=0;
- if(RI)
- {
- RI=0;tempbuff=SBUF;
- switch(cnt)
- {
- case 0:if(tempbuff==0xf2)cnt=1;else {cnt=0;}break;
- case 1:shuzu8X8[cd++]=tempbuff;
- if(cd==64)
- {
- cnt=0;
- cd=0;
- read_flag=1;
- }
- else
- {
- break;
- }
- default:break;
- }
- }
- ES=1;
- }
- /************************************定時中斷1************************************/
- void print1() interrupt 1
- {
- static uchar layert=0;
- TR0 = 0;
- ET0= 0;
- if(msd==1) //頻譜模式
- {
- sendbyte(~display[layert][0],~display[layert][2],~display[layert][4],~display[layert][5]);
- sendbyte(~display[layert][3],~display[layert][1],~display[layert][6],~display[layert][7]);
- SUO=0;
- _nop_();
- SUO=1;
- M_EN=0;
- hansao(7-layert);
- delayus(ld);
- M_EN=1;
- if (layert<7)
- layert++;
- else
- layert=0;
- key_baihei_scan();
- if(msd==1)
- {
- if(key2==2||key2==3||key2==4||key2==5)
- {
- key3=2;
- return;
- }
- }
- TH0=0xef;
- TL0=0x00;
- }
- if(msd==2) //后部分動畫
- {
- sendbyte(~display[layert][0],~display[layert][2],~display[layert][4],~display[layert][5]);
- sendbyte(~display[layert][3],~display[layert][1],~display[layert][6],~display[layert][7]);
-
- SUO=0;
- _nop_();
- SUO=1;
- M_EN=0;
- hansao(layert);
- delayus(donghua_shudu);
- M_EN=1;
- if (layert<7)
- layert++;
- else
- layert=0;
- key_baihei_scan();
- if(msd==2)
- {
- if(key2==1||key2==3||key2==4||key2==5)
- {
- key3=2;
- return;
- }
- }
- TH0=0xef;
- TL0=0x00;
- }
- if(msd==4) //文字動畫部分
- {
- sendbyte(~display[layert][0],~display[layert][2],~display[layert][4],~display[layert][5]);
- sendbyte(~display[layert][3],~display[layert][1],~display[layert][6],~display[layert][7]);
-
- SUO=0;
- _nop_();
- SUO=1;
- M_EN=0;
- hansao(layert);
- delayus(donghua_shudu);
- M_EN=1;
- if (layert<7)
- layert++;
- ……………………
- …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼
|
-
2.png
(52.06 KB, 下載次數: 56)
下載附件
2021-1-20 12:46 上傳
-
3.png
(57.67 KB, 下載次數: 47)
下載附件
2021-1-20 12:46 上傳
-
4.png
(81.66 KB, 下載次數: 49)
下載附件
2021-1-20 12:46 上傳
單片機pcb pdf布線以及連線圖 僅供參考
-
-
資料.zip
2021-1-20 12:52 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
1.69 MB, 下載次數: 13, 下載積分: 黑幣 -5
另外的光立方布板
-
-
app.zip
2021-1-20 12:52 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
3.37 MB, 下載次數: 7, 下載積分: 黑幣 -5
度娘尋找的app上位機 僅供學習
-
-
光立方帶引腳注解.7z
2021-1-20 12:52 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
175.18 KB, 下載次數: 9, 下載積分: 黑幣 -5
程序 中包含成熟的引腳設置以及程序描述
評分
-
查看全部評分
|