资 源 简 介
#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; //开外部中断,允许新的遥控按键
}