|
是用51hei單片機(jī)開發(fā)板 電路圖詳見:http://www.zg4o1577.cn/f/51hei-5.pdf 的數(shù)碼管部分, 用2個74hc573 鎖存,p0口作為數(shù)據(jù)口 ,p3.6和p3.7分別是段和位的鎖存端口.
- #include<reg52.h> //52單片機(jī)頭文件
- #define uint unsigned int
- #define uchar unsigned char
- sbit dula=P3^6; //數(shù)碼管段位選
- 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;//檢測到紅外標(biāo)志位
- uchar a,t,cnt;//
- uchar hour1,minute1,o;// 2路定時變量
- uchar hour2,minute2,s;
- uint ta,ta1;//2路定時時長
- uchar irdata[33];//紅外時間數(shù)組
- uchar bitnum;//第幾位
- uchar irreceok;//紅外接收完標(biāo)志
- uchar irprosok; //紅外處理完標(biāo)志
- uchar ircode[4];//存有4個字節(jié)紅外數(shù)組
- uchar disp[8]; //數(shù)碼管顯示數(shù)組
- 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)//延時函數(shù)
- {
- 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進(jìn)制變成十進(jìn)制
- {
- 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()//定時處理函數(shù)
- {
- 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)//紅外接收處理函數(shù)
- {
- 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用來當(dāng)時鐘
- {
- TH1=(65536-50000)/256;
- TL1=(65536-50000)%256;
- t++;
- }
- void time0() interrupt 1//定時器0用來當(dāng)紅外
- {
- 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;
-
- }
- }
復(fù)制代碼
|
|