紅外遙控程序源碼
單片機源程序如下:
- /**********************************************黎明途電子************************************************************/
- /**********************************************紅外遙控器測試程序*******************************************/
- /*撥輪按鍵左顯示心形 撥輪按鍵中全亮顯示 撥輪按鍵右單層向上動態*/
- #include <STC12C5A60S2.H>
- #define uchar unsigned char
- #define uint unsigned int
- char data menu,out,amenu,bb,num,cheng; //menu按鍵左, out按鍵右, amenu按鍵中, bb延時變量, num頻譜顯示,cheng行掃描變量,
- uchar data buffer[8]; //光立方顯示一層的數據暫存數組
- /*定義管腳定義單片機用于發送數據給74HC595引腳和數據移位控制*/
- 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;//藍
- sbit ABL=P4^3;//亮度
- sbit k1=P0^4;//播放、暫停
- sbit k2=P0^5;//音量減
- sbit k3=P0^6;//音量加
- bit receive_sta=0; //接受狀態,表示數據是否接受完成
- sbit IRIN = P3^2; //紅外接收器數據線
- 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 每次亮一層動態模式
- 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;//定時器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口準雙向輸出
- P3M1=0X00;
- P2M0=0x00; //P2口準雙向輸出
- P2M1=0X00;
- }
- void initial595() //列驅動初始化
- {
- SH_CP = 0;
- ST_CP = 0;
- DS = 0;
- }
- void initial5952() //行驅動初始化
- {
- SH_CP2 = 0;
- ST_CP2 = 0;
- DS2 = 0;
- }
- /************************************延時函數**************************************************************/
- void IRdelay(unsigned char x)//延時子程序
- {
- 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++);
- }
- /************************************ 發送數據 ***************************************************************/
- void send_data(unsigned char d)//發送一層當中的一行顯示數據,8位
- {
- unsigned char i;
- for(i=0;i<8;i++)
- {
- DS = d&0x80;//發送最低位
- SH_CP = 1;
- SH_CP = 0; //移位寄存器移位
- d = d<<1; //數據移位f
- }
- }
- void xiansi1() //一次發送1層,8行的顯示數據,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
- }
- /*************************************************主函數*******************************************************************/
- 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; //藍色控制
- d=60000;
- dd=60000;
-
- while(menu==1) //顯示全亮
- {
- static uchar layer=0;
- for(j=0;j<8;j++) //LED正極驅動循環掃描8層
- {
- for (i=0;i<8;i++) //循環8次,每一次將光立方的一層動畫數據裝入buffer[]數組
- {
- buffer[i]=display1[layer][i]; //調用層暫存數組將用于光立方顯示的二維數組里的一層顯示數據裝入其中
- }
- xiansi1(); //單片機發送數據給74HC595
- cheng=0x01<<layer; //行移位,
- DS2 = ~cheng&0x01; //發送層掃描數據
- SH_CP2 = 1;
- SH_CP2 = 0; //移位寄存器移位
- ST_CP=1;
- ST_CP=0; //控制顯示列
- ST_CP2=1;
- ST_CP2=0; //控制顯示層
- if (layer<7)
- layer++; //為掃面上一層 做準備(光立方一個靜止圖形是從最底層開始掃描)
- else
- layer=0;
- delay(2);
-
- }
-
- }
- while(amenu==1) //顯示心形
- {
- static uchar layer=0;
- for(j=0;j<8;j++) //LED正極驅動循環掃描8層
- {
- for (i=0;i<8;i++) //循環8次,每一次將光立方的一層動畫數據裝入buffer[]數組
- {
- buffer[i]=~display2[layer][i]; //調用層暫存數組將用于光立方顯示的二維數組里的一層顯示數據裝入其中
- }
- xiansi1(); //單片機發送數據給74HC595
- cheng=0x01<<layer; //行移位,
- DS2 = ~cheng&0x01; //發送層掃描數據
- SH_CP2 = 1;
- SH_CP2 = 0; //移位寄存器移位
- ST_CP=1;
- ST_CP=0; //控制顯示列
- ST_CP2=1;
- ST_CP2=0; //控制顯示層
- if (layer<7)
- layer++; //為掃面上一層 做準備(光立方一個靜止圖形是從最底層開始掃描)
- else
- layer=0;
- delay(2);
-
- }
-
- }
- while(out==1) //一層一層的動態顯示
- {
- static uchar layer=0;
- for(j=0;j<8;j++) //LED正極驅動循環掃描8層
- {
- for (i=0;i<8;i++) //循環8次,每一次將光立方的一層動畫數據裝入buffer[]數組
- {
- buffer[i]=display3[layer][i]; //調用層暫存數組將用于光立方顯示的二維數組里的一層顯示數據裝入其中
- }
- xiansi1(); //單片機發送數據給74HC595
- cheng=0x01<<layer; //行移位,
- DS2 = ~cheng&0x01; //發送層掃描數據
- SH_CP2 = 1;
- SH_CP2 = 0; //移位寄存器移位
- ST_CP=1;
- ST_CP=0; //控制顯示列
- ST_CP2=1;
- ST_CP2=0; //控制顯示層
- if (layer<7)
- layer++; //為掃面上一層 做準備(光立方一個靜止圖形是從最底層開始掃描)
- 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;
- }
- //確認IR信號出現
- while (!IRIN) //等IR變為高電平,跳過9ms的前導低電平信號。
- {IRdelay(1);}
- for (j=0;j<4;j++) //收集四組數據
- {
- for (k=0;k<8;k++) //每組數據有8位
- {
- while (IRIN) //等 IR 變為低電平,跳過4.5ms的前導高電平信號。
- {IRdelay(1);}
- while (!IRIN) //等 IR 變為高電平
- {IRdelay(1);}
- while (IRIN) //計算IR高電平時長
- {
- IRdelay(1);
- N++;
- if (N>=30)
- { EX0=1;
-
- return;} //0.14ms計數過長自動離開。
- } //高電平計數完畢
- IRCOM[j]=IRCOM[j] >> 1; //數據最高位補“0”
- if (N>=8) {IRCOM[j] = IRCOM[j] | 0x80;} //數據最高位補“1”
- N=0;
- }//end for k
-
- }//end for j
-
- if (IRCOM[2]!=~IRCOM[3])
- { EX0=1;
- return;
- }
-
- if(IRCOM[2]==0x0c) //1鍵
- { //復位-音頻
-
- menu=1;
- out=0;
- amenu=0;
- }
- if(IRCOM[2]==0x18 ) //2鍵
- { //上位機
- menu=0;
- out=0;
- amenu=1;
- }
- if(IRCOM[2]==0x5e) //3鍵
- { // 脫機動畫
- 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黑下載附件…………
復制代碼
所有資料51hei提供下載:
紅外遙控程序源碼.zip
(39.92 KB, 下載次數: 17)
2017-12-19 15:42 上傳
點擊文件名下載附件
紅外遙控程序源碼 下載積分: 黑幣 -5
|