标题:
2路红外遥控定时时钟程序
[打印本页]
作者:
liuda
时间:
2015-1-21 22:06
标题:
2路红外遥控定时时钟程序
是用51hei单片机开发板 电路图详见:
http://www.51hei.com/f/51hei-5.pdf
的数码管部分, 用2个74hc573 锁存,p0口作为数据口 ,p3.6和p3.7分别是段和位的锁存端口.
#include<reg52.h> //52单片机头文件
#define uint unsigned int
#define uchar unsigned char
sbit dula=P3^6; //数码管段位选
sbit wale=P3^7;
sbit menu=P2^4;//功能选择键
sbit jia=P2^5;// 加键
sbit jian=P2^6;//减键
sbit led=P1^0; //LED灯
uchar hour,minute,sec;//时 分 妙
uchar irtime;//红外时间
uchar startflag;//检测到红外标志位
uchar a,t,cnt;//
uchar hour1,minute1,o;// 2路定时变量
uchar hour2,minute2,s;
uint ta,ta1;//2路定时时长
uchar irdata[33];//红外时间数组
uchar bitnum;//第几位
uchar irreceok;//红外接收完标志
uchar irprosok; //红外处理完标志
uchar ircode[4];//存有4个字节红外数组
uchar disp[8]; //数码管显示数组
uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};// 显示段码值0~9
void delay(uint sm)//延时函数
{
uint i,j;
for(i=sm;i>0;i--)
for(j=170;j>0;j--);
}
void init()//定时器初始化,T0 T1 T2
{
TMOD=0x12;
RCAP2H=(65536-1000)/256;
RCAP2L=(65536-1000)%256;
ET2=1;
TR2=1;
TH0=0x00;
TL0=0x00;
TH1=(65536-50000)/256;
TL1=(65536-50000)%256;
EA=1;
TR0=1;
ET0=1;
TR1=1;
ET1=1;
}
void int0int(void)//外部中断0初始化
{
IT0=1;
EX0=1;
EA=1;
}
void key()//按键检测
{
if(menu==0)
{
delay(10);
if(menu==0)
{
TR1=0;
a++;
if(a==3)
{
TR1=1;
a=0;
}
while(!menu);
}
}
if(a==1)
{
if(jia==0)
{
delay(10);
if(jia==0)
{
hour++;
if(hour==24)
hour=0;
while(!jia);
}
}
if(jian==0)
{
delay(10);
if(jian==0)
{
hour--;
if(hour==-1)
hour=23;
while(!jian);
}
}
}
if(a==2)
{
if(jia==0)
{
delay(10);
if(jia==0)
{
minute++;
if(minute==60)
minute=0;
while(!jia);
}
}
if(jian==0)
{
delay(10);
if(jian==0)
{
minute--;
if(minute==-1)
minute=59;
while(!jian);
}
}
}
}
void dispose()//时间处理
{
if(t==20)
{
t=0;
sec++;
}
if(sec==60)
{
sec=0;
minute++;
}
if(minute==60)
{
minute=0;
hour++;
}
if(hour==24)
hour=0;
}
void hongwai()//红外按键检测
{
if(ircode[3]==0xf8)//0xf8 0xf6 0xea接收到的遥控按键码
{
TR1=0;
a++;
delay(10);
if(a==9)
{
TR1=1;
a=0;
}
}
if(a==1)
{
if(ircode[3]==0xf6)
{
hour++;
delay(50);
if(hour==24)
hour=0;
}
if(ircode[3]==0xea)
{
hour--;
delay(50);
if(hour==-1)
hour=23;
}
}
if(a==2)
{
if(ircode[3]==0xf6)
{
minute++;
delay(50);
if(minute==60)
minute=0;
}
if(ircode[3]==0xea)
{
minute--;
delay(50);
if(minute==-1)
minute=59;
}
}
if(a==3)
{
if(ircode[3]==0xf6)
{
hour1++;
delay(50);
if(hour1==24)
hour1=0;
}
if(ircode[3]==0xea)
{
hour1--;
delay(50);
if(hour1==-1)
hour1=23;
}
}
if(a==4)
{
if(ircode[3]==0xf6)
{
minute1++;
delay(50);
if( minute1==60)
minute1=0;
}
if(ircode[3]==0xea)
{
minute1--;
delay(50);
if( minute1==-1)
minute1=59;
}
}
if(a==5)
{
if(ircode[3]==0xf6)
{
ta++;
delay(50);
if(ta==555)
ta=0;
}
if(ircode[3]==0xea)
{
ta--;
delay(50);
if(ta==-1)
ta=554;
}
}
if(a==6)
{
if(ircode[3]==0xf6)
{
hour2++;
delay(50);
if(hour2==24)
hour2=0;
}
if(ircode[3]==0xea)
{
hour2--;
delay(50);
if(hour2==-1)
hour2=23;
}
}
if(a==7)
{
if(ircode[3]==0xf6)
{
minute2++;
delay(50);
if( minute2==60)
minute2=0;
}
if(ircode[3]==0xea)
{
minute2--;
delay(50);
if( minute2==-1)
minute2=59;
}
}
if(a==8)
{
if(ircode[3]==0xf6)
{
ta1++;
delay(50);
if(ta1==555)
ta1=0;
}
if(ircode[3]==0xea)
{
ta1--;
delay(50);
if(ta1==-1)
ta1=554;
}
}
ircode[3]=0;
}
void irwork(void)// 把16进制变成十进制
{
disp[0]=ircode[0]/16;
disp[1]=ircode[0]%16;
disp[2]=ircode[1]/16;
disp[3]=ircode[1]%16;
disp[4]=ircode[2]/16;
disp[5]=ircode[2]%16;
disp[6]=ircode[3]/16;
disp[7]=ircode[3]%16;
}
void laozhong()//定时处理函数
{
if((hour1==hour)&&(minute1==minute))
{
o=1;
}
if(o==1)
{
led=0;
while(!ta);
o=0;
led=1;
}
if((sec==60)&&(o==1))
{
ta--;
if(ta==0)
ta=0;
}
if((hour2==hour)&&(minute2==minute))
{
s=1;
}
if(s==1)
{
led=0;
while(!ta1);
s=0;
led=1;
}
if((sec==60)&&(s==1))
{
ta1--;
if(ta1==0)
ta1=0;
}
}
void irpros(void)//红外接收处理函数
{
uchar k,i,j;
uchar value;
k=1;
for(j=0;j<4;j++)
{
for(i=0;i<8;i++)
{
value=value>>1;
if(irdata[k]>6)
{
value=value|0x80;
}
k++;
}
ircode[j]=value;
}
irprosok=1;
}
void main()
{
init();
int0int();
hour1=0;minute1=1;ta=1;hour2=0;minute2=3;ta1=1;
while(1)
{
laozhong();
hongwai();
if(irreceok)
{
irpros();
irreceok=0;
}
if(irprosok)
{
irprosok=0;
irwork();
}
key();
dispose();
}
}
void time2() interrupt 5//定时器2用来显示
{
//TH1=(65536-1000)/256;
//TL1=(65536-1000)%256;
TF2=0;
if((a==0)||(a==1)||(a==2))
{
if(++cnt>7)cnt=0;
switch(cnt)
{
case 0:dula=1;/*P0=table[disp[0]];*/P0=table[hour/10];dula=0;P0=0xff;wale=1;P0=0xfe;wale=0;break;
case 1:dula=1;/*P0=table[disp[1]];*/P0=table[hour%10];dula=0;P0=0xff;wale=1;P0=0xfd;wale=0;break;
case 2:dula=1;/*P0=table[disp[2]];*/P0=0x40;dula=0;P0=0xff;wale=1;P0=0xfb;wale=0;break;
case 3:dula=1;/*P0=table[disp[3]];*/P0=table[minute/10];dula=0;P0=0xff;wale=1;P0=0xf7;wale=0;break;
case 4:dula=1;/*P0=table[disp[4]];*/P0=table[minute%10];dula=0;P0=0xff;wale=1;P0=0xef;wale=0;break;
case 5:dula=1;/*P0=table[disp[5]];*/P0=0x40;dula=0;P0=0xff;wale=1;P0=0xdf;wale=0;break;
case 6:dula=1;/*P0=table[disp[6]];*/P0=table[sec/10];dula=0;P0=0xff;wale=1;P0=0xbf;wale=0;break;
case 7:dula=1;/*P0=table[disp[7]];*/P0=table[sec%10];dula=0;P0=0xff;wale=1;P0=0x7f;wale=0;break;
}
}
if((a==3)||(a==4))
{
if(++cnt>6)cnt=0;
switch(cnt)
{
case 0:dula=1;/*P0=table[disp[0]];*/P0=table[hour1/10];dula=0;P0=0xff;wale=1;P0=0xfe;wale=0;break;
case 1:dula=1;/*P0=table[disp[1]];*/P0=table[hour1%10];dula=0;P0=0xff;wale=1;P0=0xfd;wale=0;break;
case 2:dula=1;/*P0=table[disp[2]];*/P0=0x40;dula=0;P0=0xff;wale=1;P0=0xfb;wale=0;break;
case 3:dula=1;/*P0=table[disp[3]];*/P0=table[minute1/10];dula=0;P0=0xff;wale=1;P0=0xf7;wale=0;break;
case 4:dula=1;/*P0=table[disp[4]];*/P0=table[minute1%10];dula=0;P0=0xff;wale=1;P0=0xef;wale=0;break;
case 5:dula=1;/*P0=table[disp[2]];*/P0=0x40;dula=0;P0=0xff;wale=1;P0=0xdf;wale=0;break;
case 6:dula=1;/*P0=table[disp[6]];*/P0=0x06;dula=0;P0=0xff;wale=1;P0=0xbf;wale=0;break;
}
}
if(a==5)
{
if(++cnt>5)cnt=0;
switch(cnt)
{
case 0:dula=1;/*P0=table[disp[0]];*/P0=table[ta/1000];dula=0;P0=0xff;wale=1;P0=0xfe;wale=0;break;
case 1:dula=1;/*P0=table[disp[1]];*/P0=table[(ta/100)%10];dula=0;P0=0xff;wale=1;P0=0xfd;wale=0;break;
case 2:dula=1;/*P0=table[disp[2]];*/P0=table[(ta%100)/10];dula=0;P0=0xff;wale=1;P0=0xfb;wale=0;break;
case 3:dula=1;/*P0=table[disp[3]];*/P0=table[ta%10];dula=0;P0=0xff;wale=1;P0=0xf7;wale=0;break;
case 4:dula=1;/*P0=table[disp[2]];*/P0=0x40;dula=0;P0=0xff;wale=1;P0=0xef;wale=0;break;
case 5:dula=1;/*P0=table[disp[2]];*/P0=0x06;dula=0;P0=0xff;wale=1;P0=0xdf;wale=0;break;
}
}
if((a==6)||(a==7))
{
if(++cnt>6)cnt=0;
switch(cnt)
{
case 0:dula=1;/*P0=table[disp[0]];*/P0=table[hour2/10];dula=0;P0=0xff;wale=1;P0=0xfe;wale=0;break;
case 1:dula=1;/*P0=table[disp[1]];*/P0=table[hour2%10];dula=0;P0=0xff;wale=1;P0=0xfd;wale=0;break;
case 2:dula=1;/*P0=table[disp[2]];*/P0=0x40;dula=0;P0=0xff;wale=1;P0=0xfb;wale=0;break;
case 3:dula=1;/*P0=table[disp[3]];*/P0=table[minute2/10];dula=0;P0=0xff;wale=1;P0=0xf7;wale=0;break;
case 4:dula=1;/*P0=table[disp[4]];*/P0=table[minute2%10];dula=0;P0=0xff;wale=1;P0=0xef;wale=0;break;
case 5:dula=1;/*P0=table[disp[2]];*/P0=0x40;dula=0;P0=0xff;wale=1;P0=0xdf;wale=0;break;
case 6:dula=1;/*P0=table[disp[6]];*/P0=0x5b;dula=0;P0=0xff;wale=1;P0=0xbf;wale=0;break;
}
}
if(a==8)
{
if(++cnt>5)cnt=0;
switch(cnt)
{
case 0:dula=1;/*P0=table[disp[0]];*/P0=table[ta1/1000];dula=0;P0=0xff;wale=1;P0=0xfe;wale=0;break;
case 1:dula=1;/*P0=table[disp[1]];*/P0=table[(ta1/100)%10];dula=0;P0=0xff;wale=1;P0=0xfd;wale=0;break;
case 2:dula=1;/*P0=table[disp[2]];*/P0=table[(ta1%100)/10];dula=0;P0=0xff;wale=1;P0=0xfb;wale=0;break;
case 3:dula=1;/*P0=table[disp[3]];*/P0=table[ta1%10];dula=0;P0=0xff;wale=1;P0=0xf7;wale=0;break;
case 4:dula=1;/*P0=table[disp[2]];*/P0=0x40;dula=0;P0=0xff;wale=1;P0=0xef;wale=0;break;
case 5:dula=1;/*P0=table[disp[2]];*/P0=0x5b;dula=0;P0=0xff;wale=1;P0=0xdf;wale=0;break;
}
}
}
void time1() interrupt 3// 定时器1用来当时钟
{
TH1=(65536-50000)/256;
TL1=(65536-50000)%256;
t++;
}
void time0() interrupt 1//定时器0用来当红外
{
irtime++;
}
void init0 () interrupt 0//外部中断检测红外
{
if(startflag)
{
if(irtime>32)
{
bitnum=0;
}
irdata[bitnum]=irtime;
irtime=0;
bitnum++;
if(bitnum==33)
{
bitnum=0;
irreceok=1;
}
}
else
{
startflag=1;
irtime=0;
}
}
复制代码
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1