單片機源程序如下:
- //============================================================================
- //================翼芯科技 紅外遙控LED========================================
- //============================================================================
- // 此源碼版權屬 翼芯科技 全權享有,如欲引用,敬請署名并告知
- // 嚴禁隨意用于商業目的,違者必究,后果自負
- //程序說明:本程序用于實現紅外遙控LED,IC插到U9位置.
- //文件名稱:main.C
- //版本: 1.0
- //C編譯器: keil 8.05
- // FFH FEH FDH FCH
- // FBH FAH F9H F8H
- // F7H F6H F5H F4H
- // F3H F2H F1H F0H
- // EFH EEH EDH ECH
- // EBH EAH E9H E8H
- //=============================================================================
- #include <STC12C5AXX.H>
- #define uchar unsigned char
- #define uint unsigned int
- #define BIT_32 32
- sbit RED1 = P0^0; //紅色IO口定義
- sbit GREEN1 = P0^1; //綠色IO口定義
- sbit BLUE1 = P0^2; //藍色IO口定義
- sbit IRIN = P3^7;
- bit SYNOK,ADDROK,FLAGERR,LOK;
- bit FLAG_MODE;
- bit FLAG_ON;
- unsigned long int BYTE1;
- uchar LCOUNT,HCOUNT,HLCOUNT,BITCOUNT;
- uchar code TAB1[7]={1,2,4,3,6,5,7}; //跳變數據
- uchar code TAB_RGB[3]={200,150,100}; //單色紅綠藍白數據
- uchar code TAB_DAT1[3][4]={{184,154,124, 94},
- {138,118, 98, 78},
- { 88, 74, 60, 46}};
- uchar code TAB_DAT2[3][4]={{ 26, 50, 74, 98},
- { 18, 36, 54, 72},
- { 12, 24, 36, 48}};
- uchar DPTR;
- uchar PWM_HL;
- uchar REPEAT;
- uchar MODE;
- uchar IR_CODE;
- uint T_DELAY;
- uchar DIM1,DIM2;
- uchar COL1;
- uchar R_DAT,G_DAT;B_DAT;
- uchar R_BUF,G_BUF,B_BUF;
- /******************************************************************
- - 功能描述:紅外按鍵函數
- - 隸屬模塊:無
- - 函數屬性:無
- - 參數說明:無
- - 返回說明:無
- - 注:.....
- ******************************************************************/
- KEY_SET()
- {
- IR_CODE=(BYTE1>>24);
- if(IR_CODE==0xF4) // 跳變1
- {
- FLAG_MODE=1;
- MODE=0;
- T_DELAY=1000;
- return;
- }
- if(IR_CODE==0xF0) // 跳變2
- {
- FLAG_MODE=1;
- MODE=0;
- T_DELAY=3000;
- return;
- }
- if(IR_CODE==0xEC) // 漸變1
- {
- FLAG_MODE=1;
- MODE=1;
- REPEAT=4;
- return;
- }
- if(IR_CODE==0xE8) // 漸變2
- {
- FLAG_MODE=1;
- MODE=1;
- REPEAT=12;
- return;
- }
- if(IR_CODE==0xFD) //OFF
- {
- FLAG_ON=0;
- return;
- }
- if(IR_CODE==0xFC) //ON
- {
- FLAG_ON=1;
- }
-
-
-
-
- if(IR_CODE==0xFB) //紅色
- {
- MODE=2;
- FLAG_MODE=1;
- R_DAT=250;G_DAT=0;B_DAT=0;
- }
- if(IR_CODE==0xFA) //綠色
- {
- MODE=2;
- FLAG_MODE=1;
- R_DAT=0;G_DAT=250;B_DAT=0;
- }
- if(IR_CODE==0xF9) //藍色
- {
- MODE=2;
- FLAG_MODE=1;
- R_DAT=0;G_DAT=0;B_DAT=250;
- }
- if(IR_CODE==0xF8) //白色
- {
- MODE=2;
- FLAG_MODE=1;
- R_DAT=250;G_DAT=250;B_DAT=250;
- }
- if(IR_CODE==0xF7) //黃1
- {
- MODE=2;
- FLAG_MODE=1;
- R_DAT=200;G_DAT=200;B_DAT=0;
- }
- if(IR_CODE==0xF3) //黃2
- {
- MODE=2;
- FLAG_MODE=1;
- R_DAT=200;G_DAT=100;B_DAT=0;
- }
- if(IR_CODE==0xEF) //黃3
- {
- MODE=2;
- FLAG_MODE=1;
- R_DAT=200;G_DAT=150;B_DAT=0;
- }
- if(IR_CODE==0xEB) //黃4
- {
- MODE=2;
- FLAG_MODE=1;
- R_DAT=200;G_DAT=200;B_DAT=0;
- }
-
- if(IR_CODE==0xF6) //青1
- {
- MODE=2;
- FLAG_MODE=1;
- R_DAT=0;G_DAT=200;B_DAT=200;
- }
- if(IR_CODE==0xF2) //青2
- {
- MODE=2;
- FLAG_MODE=1;
- R_DAT=0;G_DAT=200;B_DAT=100;
- }
- if(IR_CODE==0xEE) //青3
- {
- MODE=2;
- FLAG_MODE=1;
- R_DAT=0;G_DAT=200;B_DAT=150;
- }
- if(IR_CODE==0xEA) //青4
- {
- MODE=2;
- FLAG_MODE=1;
- R_DAT=0;G_DAT=200;B_DAT=200;
- }
-
-
- if(IR_CODE==0xF5) //紫1
- {
- MODE=2;
- FLAG_MODE=1;
- R_DAT=200;G_DAT=0;B_DAT=200;
- }
- if(IR_CODE==0xF1) //紫2
- {
- MODE=2;
- FLAG_MODE=1;
- R_DAT=100;G_DAT=0;B_DAT=200;
- }
- if(IR_CODE==0xED) //紫3
- {
- MODE=2;
- FLAG_MODE=1;
- R_DAT=150;G_DAT=0;B_DAT=200;
- }
- if(IR_CODE==0xE9) //紫4
- {
- MODE=2;
- FLAG_MODE=1;
- R_DAT=200;G_DAT=0;B_DAT=200;
- }
- }
- /******************************************************************
- - 功能描述:R G B輸出
- - 隸屬模塊:無
- - 函數屬性:無
- - 參數說明:無
- - 返回說明:無
- - 注:.....
- ******************************************************************/
- SET_RGB(uchar LED_REG)
- {
- uchar LEDDATA;
- LEDDATA=LED_REG;
- if(LEDDATA&0X01) //輸出紅色
- RED1=1;
- else
- RED1=0;
- if(LEDDATA&0X02) //輸出綠色
- GREEN1=1;
- else
- GREEN1=0;
- if(LEDDATA&0X04) //輸出藍色
- BLUE1=1;
- else
- BLUE1=0;
- }
- /******************************************************************
- - 功能描述:延時函數
- - 隸屬模塊:無
- - 函數屬性:無
- - 參數說明:無
- - 返回說明:無
- - 注:.....
- ******************************************************************/
- delayms(uint x)
- {
- uint t;
- while(x--)
- for(t=1500;t>0;t--)
- {
- while(FLAG_ON==0)
- {RED1=0;GREEN1=0;BLUE1=0;}
- if(FLAG_MODE)return;
- }
- }
- /******************************************************************
- - 功能描述:PWM_輸出
- - 隸屬模塊:無
- - 函數屬性:無
- - 參數說明:無
- - 返回說明:無
- - 注:.....
- ******************************************************************/
- SHADE()
- {
- uchar i,CNT;
- for(i=REPEAT;i>0;i--)
- {
- while(FLAG_ON==0)
- {RED1=0;GREEN1=0;BLUE1=0;}
- for(CNT=0;CNT<=PWM_HL;CNT++)
- {
- (R_DAT>CNT)? (RED1=1): (RED1=0);
- (G_DAT>CNT)? (GREEN1=1):(GREEN1=0);
- (B_DAT>CNT)? (BLUE1=1):(BLUE1=0);
- if(FLAG_MODE)return;
- }
- }
- }
- /******************************************************************
- - 功能描述:定時器0中斷,中斷時間為0.1MS,實現按鍵檢測.
- - 隸屬模塊:無
- - 函數屬性:無
- - 參數說明:無
- - 返回說明:無
- - 注:.....
- ******************************************************************/
- void TIME0_INT() interrupt 1
- {
- TH0 = (65535-200)/256;
- TL0 = (65535-200)%256;
- //=====================檢測高電平====================================================
- if(FLAGERR==1) //解碼失敗,初始化參數
- {
- LCOUNT=0;
- HCOUNT=0;
- LOK=0;
- FLAGERR=0;
- SYNOK=0;
- BITCOUNT=BIT_32;
- }
- if(IRIN==0)
- {
- LCOUNT++; //高電平計數器++
- if(LOK==1) //第一個高電平
- {
- LOK=0;
- if(SYNOK==1) //同步碼 Ok
- {
- HLCOUNT=LCOUNT+HCOUNT; //檢測高低計數值判定
- if((3<HLCOUNT)&&(HLCOUNT<40)); //高低電平小于2560,大于1152,ok; 18
- else
- {
- FLAGERR=1; //錯誤退出
- return;
- }
- if(12<HCOUNT)
- BYTE1=(BYTE1>>1)|0x80000000; //為1
- else
- BYTE1=(BYTE1>>1)|0x00000000; //為0
- LCOUNT=0;
- HCOUNT=0;
- BITCOUNT--;
- if(BITCOUNT==0) //解出了一次碼
- {
- SYNOK=0; //同步清零
- BITCOUNT=BIT_32; //碼的位數
- KEY_SET();
- }
- }
- else
- {
- if((10<HCOUNT)&(HCOUNT<60)) //低電平大于6.4ms,小于12.8ms,同步碼電平ok; 80-100,OK
- {
- SYNOK=1;
- LCOUNT=0;
- HCOUNT=0;
- }
- else
- {
- FLAGERR=1;
- }
- }
- }//end LOK
- }//END IRIN==0;
- else //檢測高電平的寬度==低電平計數
- {
- HCOUNT++;
- if(LOK==1)
- return;
- if(SYNOK)
- {
- if((1<LCOUNT)&(LCOUNT<25)) //低電平大于256us,小于2048,高電平ok;
- {
- LOK=1;
- }
- else
- {
- FLAGERR=1;
- }
- }
- else
- {
- if((60<LCOUNT)&(LCOUNT<120)) //低電平大于6MS,小于9MS, 同步低電平ok;
- {
- LOK=1;
- }
- else
- {
- FLAGERR=1;
- }
- } //END ELSE
- } //EDN ELSE
- }
- /******************************************************************
- - 功能描述:主函數
- - 隸屬模塊:無
- - 函數屬性:無
- - 參數說明:無
- - 返回說明:無
- - 注:.....
- ******************************************************************/
- void main()
- {
- TMOD = 0x01; //定時器0工作在16位的定時模式.
- TH0 = (65535-200)/256; //定時器0高位設定
- TL0 = (65535-200)%256; //定時器0低位設定
- IE = 0x82; //開總中斷和定時器0中斷
- TR0 = 1; //開定時器0
- P0M1=0x00; //設置P2輸出口為推挽輸出
- P0M0=0x07;
- P3M1=0X80; //P3.7為輸入
- P3M0=0X00;
- P0=0;
- PWM_HL=200;
- REPEAT=8;
- T_DELAY=2000;
- FLAG_ON=1;
- DIM1=1;
- while(1)
- {
- switch (MODE)
- {
- case 0:
- for(DPTR=0;DPTR<7;DPTR++) //跳變
- {
- SET_RGB(TAB1[DPTR]);
- delayms(T_DELAY); //延時1秒
- if(FLAG_MODE)
- {
- FLAG_MODE=0;
- break;
- }
- }break;
- case 1:
- R_DAT=PWM_HL;G_DAT=0;B_DAT=0;
- for(G_DAT=0;G_DAT<=PWM_HL;G_DAT++) //紅變黃
- {
- SHADE();
- }if(FLAG_MODE){FLAG_MODE=0;break;}
- for(R_DAT=PWM_HL;R_DAT>0;R_DAT--) //黃變綠
- {
- SHADE();
- }if(FLAG_MODE){FLAG_MODE=0;break;}
- for(B_DAT=0;B_DAT<=PWM_HL;B_DAT++) //綠變青
- {
- SHADE();
- }if(FLAG_MODE){FLAG_MODE=0;break;}
- for(G_DAT=PWM_HL;G_DAT>0;G_DAT--) //青變藍
- {
- SHADE();
- }if(FLAG_MODE){FLAG_MODE=0;break;}
- for(R_DAT=0;R_DAT<=PWM_HL;R_DAT++) //藍變紫
- {
- SHADE();
- }if(FLAG_MODE){FLAG_MODE=0;break;}
- for(G_DAT=0;G_DAT<=PWM_HL;G_DAT++) //紫變白
- {
- SHADE();
- }if(FLAG_MODE){FLAG_MODE=0;break;}
- for(G_DAT=PWM_HL;G_DAT>0;G_DAT--) //白變紅
- {
- B_DAT--;
- SHADE();
- }if(FLAG_MODE){FLAG_MODE=0;break;}
- case 2:
- SHADE();if(FLAG_MODE){FLAG_MODE=0;break;}
- default:break;
- }//mode
-
- }
- }
復制代碼
所有資料51hei提供下載(含原理圖):
http://www.zg4o1577.cn/bbs/dpj-137471-1.html
|