|
【第八個程序-紅外遙控全彩LED控制器】
原理圖

樂云兄 辛苦了, 來頂一下。
還缺一個亮度加減或者是漸變速度加減功能沒有加進去哦
- //////////////////////////////////////
- C語言
- //////////////////////////////////////
- //*******************************************************************************************/
- //* 紅外遙控LED R-G-B全彩控制器程序 */
- //*遙 控 器:市面上通用24鍵超薄帶單色指示遙控器,功能控制器 FLASH STROBE FADE SMOOTH */
- //*單片機型號:STC90C52RC PWM輸出端口:R=P1.3 G=P1.4 B=1.5 遙控接收頭(HS0038)P3.2 */
- //*程序作者 : 高山云先生 2012年3月31日 重慶 */
- //*程序版本 :VER:2.0 */
- //*程序功能 :本版本程序在原VER:1.0 VER:1.1 VER:1.2的基礎上增加了EEROM斷電數據記憶功能, */
- //* watchdog_timer看門狗定時器功能,確保程序跑飛時自動復位。 */
- //*******************************************************************************************/
- //*******************************************************************************************/
- #include "STC90.h"
- #include < intrins.h >
- #define uchar unsigned char
- #define uint unsigned int
- #define led_port P1
- sbit IR_RE = P3^2;
- sbit led_r = P1^3;
- sbit led_g = P1^4;
- sbit led_b = P1^5;
- sbit led_wd = P1^7;
- sbit K1 =P3^0 ; //增加鍵
- sbit K2 =P3^1 ; //減少鍵
- sbit BEEP =P3^7 ; //蜂鳴器
- uchar temp,temp1;
- bit k=0; //紅外解碼判斷標志位,為0則為有效信號,為1則為無效
- bit Flag2;
- uchar date[4]={0,0,0,0}; //date數組為存放地址原碼,反碼,數據原碼,反碼
- uint lade_1,lade_2,lade_3,lade_4;
- uint num;
- uchar date_ram,ee_temp,ee_temp1;
- uchar WDT_NUM=0;
- uchar const dofly[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};// 顯示段碼值01234567
- uchar code seg[]={7,6,5,4,3,2,1,0};//分別對應相應的數碼管點亮,即位碼
- unsigned long disp_date;
- void fade();
- void fade1();
- /*************************** 看門狗子程序*************************/
- void watchdog_timer()
- {
- if(WDT_NUM==5)
- {
- WDT_NUM=0;
- led_wd=!led_wd;
- }
- WDT_NUM++;
- WDT_CONTR=0x3f;
- }
- /******************************************************************/
- void delay(unsigned int cnt)
- {
- while(--cnt);
- }
- /*--------------------------延時1ms程子程序-----------------------*/
- void delay_1ms(uint z)
- {
- uint x,y;
- for(x=z;x>0;x--)
- for(y=126;y>0;y--);
- }
- /*--------------------------延時1ms程子程序-----------------------*/
- delay1000()
- {
- uchar i,j;
- i=5;
- do{j=95;
- do{j--;}
- while(j);
- i--;
- }
- while(i);
- }
- /*---------------------------延時882us子程序-----------------------*/
- delay882()
- {
- uchar i,j;
- i=6;
- do{j=71;
- do{j--;}
- while(j);
- i--;
- }while(i);
- }
- /*--------------------------延時2400us程子程序-----------------------*/
- delay2400()
- {
- uchar i,j;
- i=5;
- do{j=237;
- do{j--;}
- while(j);
- i--;
- }while(i);
- }
- /**********************************************************************/
- /*
- void display()
- {
- uchar i;
- for(i=0;i<8;i++)
- {
- P0=dofly[disp_date%10];//取顯示數據,段碼
- P2=seg[i]; //取位碼
- delay_1ms(1);
- disp_date/=10;
- }
- }
- */
- /*********************************************************************/
- uchar EEPROM_read(uint addr)//EEPROM字節讀
- {
- ISP_CONTR=0x83; //系統時鐘<12M時,對ISP_CONTR寄存器設置的值,本電路為11.0592M
- ISP_CMD=1; //字節讀
- ISP_ADDRH=(addr&0xff00)>>8;
- ISP_ADDRL=addr&0x00ff;
- ISP_TRIG=0x46;
- ISP_TRIG=0xb9;
- _nop_();
- _nop_();
- return ISP_DATA;
- }
- //--------------------------------------------------------------------
- void EEPROM_write(uint addr,uchar dat)//EEPROM字節寫
- {
- ISP_CONTR=0x83; //系統時鐘<12M時,對ISP_CONTR寄存器設置的值,本電路為11.0592M
- ISP_CMD=2; //字節編程
- ISP_ADDRH=(addr&0xff00)>>8;
- ISP_ADDRL=addr&0x00ff;
- ISP_DATA=dat;
- ISP_TRIG=0x46;
- ISP_TRIG=0xb9;
- _nop_();
- _nop_();
- }
- //--------------------------------------------------------------------
- void EEPROM_ERASE(uint addr)//EEPROM扇區擦除
- {
- ISP_CONTR=0x83; //系統時鐘<12M時,對ISP_CONTR寄存器設置的值,本電路為11.0592M
- ISP_CMD=3; //扇區擦除
- ISP_ADDRH=(addr&0xff00)>>8;
- ISP_ADDRL=addr&0x00ff;
- ISP_TRIG=0x46;
- ISP_TRIG=0xb9;
- _nop_();
- _nop_();
- }
- //**************************************************************
- /*----------------------------------------------------------*/
- /*-----------------------紅外解碼程序(核心)-----------------*/
- /*----------------------------------------------------------*/
- void IR_decode()
- {
- uchar i,j;
- while(IR_RE==0);
- delay2400();
- if(IR_RE==1) //延時2.4ms后如果是高電平則是新碼
- {
- delay1000();
- delay1000();
- for(i=0;i<4;i++)
- {
- for(j=0;j<8;j++)
- {
- while(IR_RE==0); //等待地址碼第1位高電平到來
- delay882(); //延時882us判斷此時引腳電平
- ///CY=IR_RE;
- if(IR_RE==0)
- {
- date[i]>>=1;
- date[i]=date[i]|0x00;
- }
- else if(IR_RE==1)
- {
- delay1000();
- date[i]>>=1;
- date[i]=date[i]|0x80;
- }
- } //1位數據接收結束
- } //32位二進制碼接收結束
- }
- }
- /*
- void LED_PWM()
- {
- lade_2=num; //384
- lade_4=num; //384
- while(lade_2!=0&Flag2==1)
- {
- for(lade_3=512;lade_3>lade_4;lade_3--)
- //512
- {
- led_port=0x00;
- delay(1);
- }
- lade_3=512; //512
- lade_4--;
- for(lade_1=0;lade_1<lade_2;lade_1++)
- {
- led_port=0x38; //c7
- delay(1);
- }
- lade_1=0;
- lade_2--;
- if(temp!=0x0c&Flag2==1)
- {
- lade_2=0;
- }
- lade_2=num; //384
- lade_4=num; //384
- }
- }
- */
- void calc()
- {
- EEPROM_read(0x2000);
- ee_temp1=ISP_DATA;
- ee_temp=ee_temp1&0x0f;
- //************************************* 1
- /*
- if(date[3]==0xff&Flag2==1)
- {
- if(num>=20)
- {
- num=num-80;
- }
- //else num=1;
- LED_PWM();
- }
- if(date[3]==0xfe&Flag2==1)
- {
- if(num<=500)
- {
- num=num+80;
- }
- // else num=511;
- LED_PWM();
- }
- if(ee_temp1==0xfd)
- {
- led_port=0x00;
- watchdog_timer();
- }
- if(ee_temp1==0xfc)
- {
- led_port=0x00;
- led_r=1;
- led_g=1;
- led_b=1;
- watchdog_timer();
- }
- */
- //********************************************** 2
- if(ee_temp1==0xfb)
- {
- led_port=0x00;
- led_r=1;
- watchdog_timer();
- }
- if(ee_temp1==0xfa)
- {
- led_port=0x00;
- led_g=1;
- watchdog_timer();
- }
- if(ee_temp1==0xf9)
- {
- led_port=0x00;
- led_b=1;
- watchdog_timer();
- }
- if(ee_temp1==0xf8)
- {
- led_port=0x00;
- led_r=1;
- led_g=1;
- led_b=1;
- watchdog_timer();
- }
- //************************************** 3
- if(ee_temp1==0xf7)
- {
- uint fade_1,fade_2,fade_3,fade_4;
- fade_2=448; //384
- fade_4=448; //384
- while(fade_2!=0&ee_temp==0x07)
- {
- for(fade_3=512;fade_3>fade_4;fade_3--)
- //512
- {
- led_port=0x10;
- delay(1);
- }
- fade_3=512; //512
- fade_4--;
- watchdog_timer();
- for(fade_1=0;fade_1<fade_2;fade_1++)
- {
- led_port=0x08;
- delay(1);
- }
- fade_1=0;
- fade_2--;
- if(ee_temp!=0x07)
- {
- fade_2=0;
- }
- watchdog_timer();
- fade_2=448; //384
- fade_4=448; //384
- }
- }
- if(ee_temp1==0xf6)
- {
- uint fade_1,fade_2,fade_3,fade_4;
- fade_2=448; //384
- fade_4=448; //384
- while(fade_2!=0&ee_temp==0x06)
- {
- for(fade_3=512;fade_3>fade_4;fade_3--)
- //512
- {
- led_port=0x20;
- delay(1);
- }
- fade_3=512; //512
- fade_4--;
- watchdog_timer();
- for(fade_1=0;fade_1<fade_2;fade_1++)
- {
- led_port=0x10;
- delay(1);
- }
- fade_1=0;
- fade_2--;
- if(ee_temp!=0x06)
- {
- fade_2=0;
- }
- watchdog_timer();
- fade_2=448; //384
- fade_4=448; //384
- }
- }
- if(ee_temp1==0xf5)
- {
- uint fade_1,fade_2,fade_3,fade_4;
- fade_2=448; //384
- fade_4=448; //384
- while(fade_2!=0&ee_temp==0x05)
- {
- for(fade_3=512;fade_3>fade_4;fade_3--)
- //512
- {
- led_port=0x08;
- delay(1);
- }
- fade_3=512; //512
- fade_4--;
- watchdog_timer();
- for(fade_1=0;fade_1<fade_2;fade_1++)
- {
- led_port=0x20;
- delay(1);
- }
- fade_1=0;
- fade_2--;
- if(ee_temp!=0x05)
- {
- fade_2=0;
- }
- watchdog_timer();
- fade_2=448; //384
- fade_4=448; //384
- }
- }
- if(ee_temp1==0xf4)
- {
- while(ee_temp==4)
- {
- led_port=0x00;
- led_r=1;
- delay_1ms(200);
- led_port=0x00;
- led_r=1;
- led_g=1;
- delay_1ms(200);
- led_port=0x00;
- led_g=1;
- delay_1ms(200);
- watchdog_timer();
- led_port=0x00;
- led_g=1;
- led_b=1;
- delay_1ms(200);
- led_port=0x00;
- led_b=1;
- delay_1ms(200);
- led_port=0x00;
- led_b=1;
- led_r=1;
- delay_1ms(200);
- watchdog_timer();
- }
- }
- //************************************** 4
- if(ee_temp1==0xf3)
- {
- uint fade_1,fade_2,fade_3,fade_4;
- fade_2=416; //384
- fade_4=416; //384
- while(fade_2!=0&ee_temp==0x03)
- {
- for(fade_3=512;fade_3>fade_4;fade_3--)
- //512
- {
- led_port=0x10;
- delay(1);
- }
- fade_3=512; //512
- fade_4--;
- watchdog_timer();
- for(fade_1=0;fade_1<fade_2;fade_1++)
- {
- led_port=0x08;
- delay(1);
- }
- fade_1=0;
- fade_2--;
- if(ee_temp!=0x03)
- {
- fade_2=0;
- }
- watchdog_timer();
- fade_2=416; //384
- fade_4=416; //384
- }
- }
- if(ee_temp1==0xf2)
- {
- uint fade_1,fade_2,fade_3,fade_4;
- fade_2=384; //384
- fade_4=384; //384
- while(fade_2!=0&ee_temp==0x02)
- {
- for(fade_3=512;fade_3>fade_4;fade_3--)
- //512
- {
- led_port=0x20;
- delay(1);
- }
- fade_3=512; //512
- fade_4--;
- watchdog_timer();
- for(fade_1=0;fade_1<fade_2;fade_1++)
- {
- led_port=0x10;
- delay(1);
- }
- fade_1=0;
- fade_2--;
- if(ee_temp!=0x02)
- {
- fade_2=0;
- }
- watchdog_timer();
- fade_2=384; //384
- fade_4=384; //384
- }
- }
- if(ee_temp1==0xf1)
- {
- uint fade_1,fade_2,fade_3,fade_4;
- fade_2=348; //384
- fade_4=348; //384
- while(fade_2!=0&ee_temp==0x01)
- {
- for(fade_3=512;fade_3>fade_4;fade_3--)
- //512
- {
- led_port=0x08;
- delay(1);
- }
- fade_3=512; //512
- fade_4--;
- watchdog_timer();
- for(fade_1=0;fade_1<fade_2;fade_1++)
- {
- led_port=0x20;
- delay(1);
- }
- fade_1=0;
- fade_2--;
- if(ee_temp!=0x01)
- {
- fade_2=0;
- }
- watchdog_timer();
- fade_2=348; //384
- fade_4=348; //384
- }
- }
- if(ee_temp1==0xf0)
- {
- while(ee_temp==0)
- {
- led_port=0x00;
- led_r=1;
- delay_1ms(500);
- watchdog_timer();
- led_port=0x00;
- led_g=1;
- delay_1ms(500);
- led_port=0x00;
- led_b=1;
- delay_1ms(500);
- watchdog_timer();
- }
- }
- //******************************************** 5
- if(ee_temp1==0xef)
- {
- uint fade_1,fade_2,fade_3,fade_4;
- fade_2=384; //384
- fade_4=384; //384
- while(fade_2!=0&ee_temp==0x0f)
- {
- for(fade_3=512;fade_3>fade_4;fade_3--)
- //512
- {
- led_port=0x10;
- delay(1);
- }
- fade_3=512; //512
- fade_4--;
- watchdog_timer();
- for(fade_1=0;fade_1<fade_2;fade_1++)
- {
- led_port=0x08;
- delay(1);
- }
- fade_1=0;
- fade_2--;
- if(ee_temp!=0x0f)
- {
- fade_2=0;
- }
- watchdog_timer();
- fade_2=384; //384
- fade_4=384; //384
- }
- }
- if(ee_temp1==0xee)
- {
- uint fade_1,fade_2,fade_3,fade_4;
- fade_2=320; //384
- fade_4=320; //384
- while(fade_2!=0&ee_temp==0x0e)
- {
- for(fade_3=512;fade_3>fade_4;fade_3--)
- //512
- {
- led_port=0x20;
- delay(1);
- }
- fade_3=512; //512
- fade_4--;
- watchdog_timer();
- for(fade_1=0;fade_1<fade_2;fade_1++)
- {
- led_port=0x10;
- delay(1);
- }
- fade_1=0;
- fade_2--;
- if(ee_temp!=0x0e)
- {
- fade_2=0;
- }
- watchdog_timer();
- fade_2=320; //384
- fade_4=320; //384
- }
- }
- if(ee_temp1==0xed)
- {
- uint fade_1,fade_2,fade_3,fade_4;
- fade_2=320; //384
- fade_4=320; //384
- while(fade_2!=0&ee_temp==0x0d)
- {
- for(fade_3=512;fade_3>fade_4;fade_3--)
- //512
- {
- led_port=0x08;
- delay(1);
- }
- fade_3=512; //512
- fade_4--;
- watchdog_timer();
- for(fade_1=0;fade_1<fade_2;fade_1++)
- {
- led_port=0x20;
- delay(1);
- }
- fade_1=0;
- fade_2--;
- if(ee_temp!=0x0d)
- {
- fade_2=0;
- }
- watchdog_timer();
- fade_2=320; //384
- fade_4=320; //384
- }
- }
- if(ee_temp1==0xec)
- fade();
- //******************************************* 6
- if(ee_temp1==0xeb)
- {
- led_port=0x00;
- led_r=1;
- led_g=1;
- watchdog_timer();
- }
- if(ee_temp1==0xea)
- {
- led_port=0x00;
- //led_r=0;
- led_g=1;
- led_b=1;
- watchdog_timer();
- }
- if(ee_temp1==0xe9)
- {
- led_port=0x00;
- led_r=1;
- //led_g=0;
- led_b=1;
- watchdog_timer();
- }
- if(ee_temp1==0xe8)
- fade1();
- }
- void fade()
- {
- // uchar i;
- uint fade_1,fade_2,fade_3,fade_4;
- fade_2=512;
- fade_4=511;
- while(fade_2!=0&ee_temp==0x0c)
- {
- for(fade_3=512;fade_3>fade_4;fade_3--)
- {
- led_port=0x10;
- delay(1);
- }
- fade_3=512;
- fade_4--;
- watchdog_timer();
- for(fade_1=0;fade_1<fade_2;fade_1++)
- {
- led_port=0x08;
- delay(1);
- }
- fade_1=0;
- fade_2--;
- if(ee_temp!=0x0c)
- {
- fade_2=0;
- }
- }
- watchdog_timer();
- fade_2=512;
- fade_4=511;
- while(fade_2!=0&ee_temp==0x0c)
- {
- if(ee_temp!=0x0c)
- {
- fade_2=0;
- }
- for(fade_3=512;fade_3>fade_4;fade_3--)
- {
- led_port=0x20;
- delay(1);
- // watchdog_timer();
- }
- fade_3=512;
- fade_4--;
- watchdog_timer();
- for(fade_1=0;fade_1<fade_2;fade_1++)
- {
- led_port=0x10;
- delay(1);
- // watchdog_timer();
- }
- fade_1=0;
- fade_2--;
- }
- watchdog_timer();
- fade_2=512;
- fade_4=511;
- while(fade_2!=0&ee_temp==0x0c)
- {
- if(ee_temp!=0x0c)
- {
- fade_2=0;
- }
- for(fade_3=512;fade_3>fade_4;fade_3--)
- {
- led_port=0x08;
- delay(1);
- watchdog_timer();
- }
- fade_3=512;
- fade_4--;
- watchdog_timer();
- for(fade_1=0;fade_1<fade_2;fade_1++)
- {
- led_port=0x20;
- delay(1);
- watchdog_timer();
- }
- fade_1=0;
- fade_2--;
- }
- watchdog_timer();
- }
- void fade1()
- {
- // uchar i;
- uint fade_1,fade_2,fade_3,fade_4;
- fade_2=128;
- fade_4=127;
- while(fade_2!=0&ee_temp==0x08)
- {
- for(fade_3=128;fade_3>fade_4;fade_3--)
- {
- led_port=0x10;
- delay(1);
- }
- fade_3=128;
- fade_4--;
- for(fade_1=0;fade_1<fade_2;fade_1++)
- {
- led_port=0x08;
- delay(1);
- }
- fade_1=0;
- fade_2--;
- if(ee_temp!=0x08)
- {
- fade_2=0;
- }
- }
- watchdog_timer();
- fade_2=128;
- fade_4=127;
- while(fade_2!=0&ee_temp==0x08)
- {
- if(ee_temp!=0x08)
- {
- fade_2=0;
- }
- for(fade_3=128;fade_3>fade_4;fade_3--)
- {
- led_port=0x20;
- delay(1);
- }
- fade_3=128;
- fade_4--;
- for(fade_1=0;fade_1<fade_2;fade_1++)
- {
- led_port=0x10;
- delay(1);
- }
- fade_1=0;
- fade_2--;
- }
- watchdog_timer();
- fade_2=128;
- fade_4=127;
- while(fade_2!=0&ee_temp==0x08)
- {
- if(ee_temp!=0x08)
- {
- fade_2=0;
- }
- for(fade_3=128;fade_3>fade_4;fade_3--)
- {
- led_port=0x08;
- delay(1);
- }
- fade_3=128;
- fade_4--;
- for(fade_1=0;fade_1<fade_2;fade_1++)
- {
- led_port=0x20;
- delay(1);
- }
- fade_1=0;
- fade_2--;
- }
- watchdog_timer();
- }
- void init()
- {
- led_port=0x00;
- /*
- led_r=1;
- delay_1ms(500);
- led_port=0x00;
- led_g=1;
- delay_1ms(500);
- led_port=0x00;
- led_b=1;
- delay_1ms(500);
- led_port=0x00;
- */
- delay_1ms(2);
- WDT_CONTR=0x3f;
- delay_1ms(500);
- }
- //********************************
- void main()
- {
- init();
- Flag2=0;
- SP=0x60; //堆棧指針
- EX0=1; //允許外部中斷0,用于檢測紅外遙控器按鍵
- EA=1;
- num=255;
- while(1)
- {
- calc();
- }
- }
- //********************************************************************
- /*------------------------外部中斷0程序-------------------------*/
- /*------------------主要用于處理紅外遙控鍵值--------------------*/
- void int0() interrupt 0
- {
- uchar i;
- Flag2=0; ///////
- k=0;
- EX0=0; //檢測到有效信號關中斷,防止干擾
- for(i=0;i<4;i++)
- {
- delay1000();
- if(IR_RE==1){k=1;} //剛開始為9ms的引導碼.
- }
- led_port=0x00;
- if(k==0)
- {
- IR_decode(); //如果接收到的是有效信號,則調用解碼程序
- if(date[3]>=0xe8)
- {
- if(date[3]<=0xfb)
- {
- temp1=date[3];
- EEPROM_ERASE(0x2000); //STC_EEROM_0X2000 temp1
- EEPROM_write(0x2000,temp1);
- EEPROM_read(0x2000);
- ee_temp1=ISP_DATA;
- ee_temp=ee_temp1&0x0f;
- /*
- temp=date[3]&0x0f;
- EEPROM_ERASE(0x2004); //STC_EEROM_0X2004 temp
- EEPROM_write(0x2004,temp);
- */
- }
- else
- {
- EEPROM_read(0x2000);
- ee_temp1=ISP_DATA;
- ee_temp=ee_temp1&0x0f;
- }
- }
- delay2400();
- delay2400();
- delay2400();
- delay_1ms(500);
- }
- EX0=1; //開外部中斷,允許新的遙控按鍵
- }
- //*********************************************************************
復制代碼
|
|