|
紅外遙控程序源碼
單片機(jī)源程序如下:
- /**********************************************黎明途電子************************************************************/
- /**********************************************紅外遙控器測試程序*******************************************/
- /*撥輪按鍵左顯示心形 撥輪按鍵中全亮顯示 撥輪按鍵右單層向上動(dòng)態(tài)*/
- #include <STC12C5A60S2.H>
- #define uchar unsigned char
- #define uint unsigned int
- char data menu,out,amenu,bb,num,cheng; //menu按鍵左, out按鍵右, amenu按鍵中, bb延時(shí)變量, num頻譜顯示,cheng行掃描變量,
- uchar data buffer[8]; //光立方顯示一層的數(shù)據(jù)暫存數(shù)組
- /*定義管腳定義單片機(jī)用于發(fā)送數(shù)據(jù)給74HC595引腳和數(shù)據(jù)移位控制*/
- sbit SH_CP = P3^4; //SCK
- sbit ST_CP = P3^3;//RCK
- sbit DS = P3^5;//SER
- sbit CH340 = P0^3;//SE
- sbit SH_CP2 = P2^6; //SCK2
- sbit ST_CP2 = P2^5;//RCK2
- sbit DS2 = P2^3;//SER2
- sbit RR=P3^6;//紅
- sbit GG=P2^2;//綠
- sbit BB=P2^4;//藍(lán)
- sbit ABL=P4^3;//亮度
- sbit k1=P0^4;//播放、暫停
- sbit k2=P0^5;//音量減
- sbit k3=P0^6;//音量加
- bit receive_sta=0; //接受狀態(tài),表示數(shù)據(jù)是否接受完成
- sbit IRIN = P3^2; //紅外接收器數(shù)據(jù)線
- void IRdelay(char x); //x*0.14MS
- unsigned char IRCOM[7];
- /*******************************************************************/
- /**************************************************************************************************************************************/
- uchar code display1[8][8]={ //圖形1 全亮模式
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//第1層
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//第2層
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//第3層
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//第4層
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//第5層
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//第6層
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//第7層
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//第8層
- };
- uchar code display2[8][8]={ //圖形2 心形模式
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//第1層
- 0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//第2層
- 0x24,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//第3層
- 0x42,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//第4層
- 0x81,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//第5層
- 0x81,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//第6層
- 0x99,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//第7層
- 0x66,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//第8層
- };
- uchar code display3[8][8]={ //圖形3 每次亮一層動(dòng)態(tài)模式
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//第1層
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//第2層
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//第3層
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//第4層
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//第5層
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//第6層
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//第7層
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//第8層
- };
- /*--------------- 初始化 --------------*/
- void timer0init(void)
- {
- TMOD=0X12;
- EX0=1;
- ET0=1;
- EX1=0;
- ET1=1;//定時(shí)器1開中斷
- EA=1;
- TH1=0xc0;
- TL1=0;
- IPH|=0X01;
- PX0=1;
- IT0=1;
- P1M0=0X7F;
- P1M1=0X80;
- P0M0=0xf8; //P0口開漏輸出
- P0M1=0xf0;
- P3M0=0x00; //P3口準(zhǔn)雙向輸出
- P3M1=0X00;
- P2M0=0x00; //P2口準(zhǔn)雙向輸出
- P2M1=0X00;
- }
- void initial595() //列驅(qū)動(dòng)初始化
- {
- SH_CP = 0;
- ST_CP = 0;
- DS = 0;
- }
- void initial5952() //行驅(qū)動(dòng)初始化
- {
- SH_CP2 = 0;
- ST_CP2 = 0;
- DS2 = 0;
- }
- /************************************延時(shí)函數(shù)**************************************************************/
- void IRdelay(unsigned char x)//延時(shí)子程序
- {
- unsigned char a,b;
- while(x--)
- {
- for(b=6;b>0;b--)
- for(a=127;a>0;a--);
- }
- } //cheng行掃描變量,yanse顏色控制, liangdu亮度控制
- void delay(uint i)
- {
- char b;
- while (i--)
- {
- b=bb;
- while(b--);
- }
- }
- void delay2(uint t)
- {
- int i;
- while(t--)
- for(i=0;i<5;i++);
- }
- /************************************ 發(fā)送數(shù)據(jù) ***************************************************************/
- void send_data(unsigned char d)//發(fā)送一層當(dāng)中的一行顯示數(shù)據(jù),8位
- {
- unsigned char i;
- for(i=0;i<8;i++)
- {
- DS = d&0x80;//發(fā)送最低位
- SH_CP = 1;
- SH_CP = 0; //移位寄存器移位
- d = d<<1; //數(shù)據(jù)移位f
- }
- }
- void xiansi1() //一次發(fā)送1層,8行的顯示數(shù)據(jù),64位
- {
- send_data(buffer[0]); //u9
- send_data(buffer[1]); //u8
- send_data(buffer[2]); //u7
- send_data(buffer[3]); //u6
- send_data(buffer[4]); //u5
- send_data(buffer[5]); //u4
- send_data(buffer[6]); //u3
- send_data(buffer[7]); //u2
- }
- /*************************************************主函數(shù)*******************************************************************/
- void main()
- {
- uchar d,dd,i,j,cheng;
- timer0init();
- initial595();
- initial5952();
- ABL=0;
- menu=1;
- out=0;
- bb=0;
- RR=1; //紅色控制
- GG=1; //綠色控制
- BB=0; //藍(lán)色控制
- d=60000;
- dd=60000;
-
- while(menu==1) //顯示全亮
- {
- static uchar layer=0;
- for(j=0;j<8;j++) //LED正極驅(qū)動(dòng)循環(huán)掃描8層
- {
- for (i=0;i<8;i++) //循環(huán)8次,每一次將光立方的一層動(dòng)畫數(shù)據(jù)裝入buffer[]數(shù)組
- {
- buffer[i]=display1[layer][i]; //調(diào)用層暫存數(shù)組將用于光立方顯示的二維數(shù)組里的一層顯示數(shù)據(jù)裝入其中
- }
- xiansi1(); //單片機(jī)發(fā)送數(shù)據(jù)給74HC595
- cheng=0x01<<layer; //行移位,
- DS2 = ~cheng&0x01; //發(fā)送層掃描數(shù)據(jù)
- SH_CP2 = 1;
- SH_CP2 = 0; //移位寄存器移位
- ST_CP=1;
- ST_CP=0; //控制顯示列
- ST_CP2=1;
- ST_CP2=0; //控制顯示層
- if (layer<7)
- layer++; //為掃面上一層 做準(zhǔn)備(光立方一個(gè)靜止圖形是從最底層開始掃描)
- else
- layer=0;
- delay(2);
-
- }
-
- }
- while(amenu==1) //顯示心形
- {
- static uchar layer=0;
- for(j=0;j<8;j++) //LED正極驅(qū)動(dòng)循環(huán)掃描8層
- {
- for (i=0;i<8;i++) //循環(huán)8次,每一次將光立方的一層動(dòng)畫數(shù)據(jù)裝入buffer[]數(shù)組
- {
- buffer[i]=~display2[layer][i]; //調(diào)用層暫存數(shù)組將用于光立方顯示的二維數(shù)組里的一層顯示數(shù)據(jù)裝入其中
- }
- xiansi1(); //單片機(jī)發(fā)送數(shù)據(jù)給74HC595
- cheng=0x01<<layer; //行移位,
- DS2 = ~cheng&0x01; //發(fā)送層掃描數(shù)據(jù)
- SH_CP2 = 1;
- SH_CP2 = 0; //移位寄存器移位
- ST_CP=1;
- ST_CP=0; //控制顯示列
- ST_CP2=1;
- ST_CP2=0; //控制顯示層
- if (layer<7)
- layer++; //為掃面上一層 做準(zhǔn)備(光立方一個(gè)靜止圖形是從最底層開始掃描)
- else
- layer=0;
- delay(2);
-
- }
-
- }
- while(out==1) //一層一層的動(dòng)態(tài)顯示
- {
- static uchar layer=0;
- for(j=0;j<8;j++) //LED正極驅(qū)動(dòng)循環(huán)掃描8層
- {
- for (i=0;i<8;i++) //循環(huán)8次,每一次將光立方的一層動(dòng)畫數(shù)據(jù)裝入buffer[]數(shù)組
- {
- buffer[i]=display3[layer][i]; //調(diào)用層暫存數(shù)組將用于光立方顯示的二維數(shù)組里的一層顯示數(shù)據(jù)裝入其中
- }
- xiansi1(); //單片機(jī)發(fā)送數(shù)據(jù)給74HC595
- cheng=0x01<<layer; //行移位,
- DS2 = ~cheng&0x01; //發(fā)送層掃描數(shù)據(jù)
- SH_CP2 = 1;
- SH_CP2 = 0; //移位寄存器移位
- ST_CP=1;
- ST_CP=0; //控制顯示列
- ST_CP2=1;
- ST_CP2=0; //控制顯示層
- if (layer<7)
- layer++; //為掃面上一層 做準(zhǔn)備(光立方一個(gè)靜止圖形是從最底層開始掃描)
- else
- layer=0;
-
- if(out==0)
- {
- break;
- }
- delay(65535);
- delay(65535);
- delay(65535);
- delay(65535);
- }
-
- }
- }
- void IR_IN(void) interrupt 0
- {
- unsigned char j,k,N=0;
- EX0 = 0;
-
- IRdelay(15);
- if (IRIN==1)
- { EX0 =1;
- return;
- }
- //確認(rèn)IR信號(hào)出現(xiàn)
- while (!IRIN) //等IR變?yōu)楦唠娖剑^9ms的前導(dǎo)低電平信號(hào)。
- {IRdelay(1);}
- for (j=0;j<4;j++) //收集四組數(shù)據(jù)
- {
- for (k=0;k<8;k++) //每組數(shù)據(jù)有8位
- {
- while (IRIN) //等 IR 變?yōu)榈碗娖剑^4.5ms的前導(dǎo)高電平信號(hào)。
- {IRdelay(1);}
- while (!IRIN) //等 IR 變?yōu)楦唠娖?br />
- {IRdelay(1);}
- while (IRIN) //計(jì)算IR高電平時(shí)長
- {
- IRdelay(1);
- N++;
- if (N>=30)
- { EX0=1;
-
- return;} //0.14ms計(jì)數(shù)過長自動(dòng)離開。
- } //高電平計(jì)數(shù)完畢
- IRCOM[j]=IRCOM[j] >> 1; //數(shù)據(jù)最高位補(bǔ)“0”
- if (N>=8) {IRCOM[j] = IRCOM[j] | 0x80;} //數(shù)據(jù)最高位補(bǔ)“1”
- N=0;
- }//end for k
-
- }//end for j
-
- if (IRCOM[2]!=~IRCOM[3])
- { EX0=1;
- return;
- }
-
- if(IRCOM[2]==0x0c) //1鍵
- { //復(fù)位-音頻
-
- menu=1;
- out=0;
- amenu=0;
- }
- if(IRCOM[2]==0x18 ) //2鍵
- { //上位機(jī)
- menu=0;
- out=0;
- amenu=1;
- }
- if(IRCOM[2]==0x5e) //3鍵
- { // 脫機(jī)動(dòng)畫
- menu=0;
- out=1;
- amenu=0;
- }
- if(IRCOM[2]==0x4a) //9鍵
- {
-
- }
- if(IRCOM[2]==0x09) //EQ鍵
- {
-
-
- }
- if(IRCOM[2]==0x44) //<<鍵
- { //上一曲
- k3=0;
- delay2(20000);
- k3=1;
-
- }
- if(IRCOM[2]==0x40) //>>鍵
- { //下一曲
- k2=0;
- delay2(20000);
- k2=1;
- ……………………
- …………限于本文篇幅 余下代碼請從51黑下載附件…………
復(fù)制代碼
所有資料51hei提供下載:
紅外遙控程序源碼.zip
(39.92 KB, 下載次數(shù): 17)
2017-12-19 15:42 上傳
點(diǎn)擊文件名下載附件
紅外遙控程序源碼
|
評(píng)分
-
查看全部評(píng)分
|