是用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;
-
- }
- }
复制代码
|