|
數(shù)碼管顯示部分的原理圖(開(kāi)發(fā)板中只需要截圖顯示部分即可):http://www.torrancerestoration.com/f/51hei-5.pdf
電路:紅外接收頭接在 單片機(jī)的外部中斷0口。數(shù)碼管用8位共陰極數(shù)碼管,2個(gè)573鎖存 詳見(jiàn)上面的51hei單片機(jī)開(kāi)發(fā)板的pdf圖,本人測(cè)試成了.
程序源代碼:
- #include<reg52.h>
- #define uchar unsigned char
- #define uint unsigned int
- sbit wela=P2^7;
- sbit dula=P2^6;
- uchar smg_du[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
- uchar smg_we[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
- uchar miao,fen,shi,flag_set,key_can;
- uchar startflag,bitnum,irtime;
- uchar irreceok,irprosok,flag_s;
- bit flag_500ms;
- uchar dis_smg[6];
- uchar irdata[33];
- uchar ircode[4];
- uchar bdata bdat;
- sbit dat0=bdat^0;
- sbit dat1=bdat^1;
- sbit dat2=bdat^2;
- sbit dat3=bdat^3;
- sbit dat4=bdat^4;
- sbit dat5=bdat^5;
- sbit dat6=bdat^6;
- sbit dat7=bdat^7;
- void smg_s(uchar dat) //用于閃爍
- {
- bdat=dat;
- if(dat0==1)
- dis_smg[0]=0x00;
- if(dat1==1)
- dis_smg[1]=0x00;
- if(dat2==1)
- dis_smg[2]=0x00;
- if(dat3==1)
- dis_smg[3]=0x00;
- if(dat4==1)
- dis_smg[4]=0x00;
- if(dat5==1)
- dis_smg[5]=0x00;
- if(dat6==1)
- dis_smg[6]=0x00;
- if(dat7==1)
- dis_smg[7]=0x00;
- }
-
- void dis_init() //顯示初始化
- {
- dis_smg[0]=smg_du[miao%10];
- dis_smg[1]=smg_du[miao/10];
- dis_smg[2]=smg_du[fen%10]|0x80;
- dis_smg[3]=smg_du[fen/10];
- dis_smg[4]=smg_du[shi%10]|0x80;
- dis_smg[5]=smg_du[shi/10];
- }
- void display()
- {
- static uchar i;
- P0=0x00;
- dula=1;
- dula=0;
- P0=smg_we[5-i];
- wela=1;
- wela=0;
- P0=dis_smg[i];
- dula=1;
- dula=0;
- i++;
- if(i==6)
- i=0;
- }
- void timer0_init() //定時(shí)器0方式1,用于時(shí)鐘定時(shí)
- {
-
- TH0=0;
- TL0=0;
- ET0=1;
- TR0=1;
- }
- //定時(shí)器1方式2,用于紅外時(shí)間加數(shù)
- void timer1_init()
- {
- TMOD=0X20|0x01; //選擇定時(shí)器0和定時(shí)器1
- TH1=0;
- TL1=0;
- ET1=1;
- TR1=1;
- EA=1;
- }
- //外部中斷0,用于確定紅外數(shù)據(jù)
- void int0_init()
- { //下降沿觸發(fā)
- IT0=1;
- EX0=1;
- EA=1;
- }
- void irpros() //紅外數(shù)據(jù)處理函數(shù)
- {
- uchar k=1,value;
- uchar i,j;
- for(j=0;j<4;j++)
- {
- for(i=0;i<8;i++)
- {
- value=value>>1; //低位在前,高位在后
- if(irdata[k]>6) //比較數(shù)據(jù),確定數(shù)據(jù)為1還是為0
- {
- value=value|0x80; //數(shù)據(jù)為一
- }
- k++;
- }
- ircode[j]=value;
- }
- irprosok=1;
- }
- void keyinit() //按鍵初始化
- {
- switch(ircode[3])
- {
- case 0xfe:key_can=1;break; //選擇鍵
- case 0xfd:key_can=2;break; //加鍵
- case 0xff:key_can=3;break; //減鍵
- }
- ircode[3]=0; //紅外數(shù)據(jù)最后一位
- }
- void clock_can() //時(shí)間調(diào)整
- {
- if(key_can==1)
- {
- key_can=0;
- flag_set++;
- if(flag_set>=4)
- {
- flag_set=0;
- flag_s=0x00;
- }
- if(flag_set==1)
- flag_s=0x30;
- if(flag_set==2)
- flag_s=0x0c;
- if(flag_set==3)
- flag_s=0x03;
- }
- if(key_can==2)
- {
- key_can=0;
- if(flag_set==1)
- {
- shi++;
- if(shi>=24)
- shi=0;
- }
- if(flag_set==2)
- {
- fen++;
- if(fen>=60)
- fen=0;
- }
- if(flag_set==3)
- {
- miao++;
- if(miao>=60)
- miao=0;
- }
- }
- if(key_can==3)
- {
- key_can=0;
- if(flag_set==1)
- {
- if(shi==0)
- shi=24;
- shi--;
- }
- if(flag_set==2)
- {
- if(fen==0)
- fen=60;
- fen--;
- }
- if(flag_set==3)
- {
- if(miao==0)
- miao=60;
- miao--;
- }
- }
- }
- void main()
- {
- timer0_init();
- timer1_init();
- int0_init();
- dis_init();
- while(1)
- {
- if(flag_500ms)
- dis_init();
- else
- smg_s(flag_s);
- if(irreceok)
- {
- irpros();
- irreceok=0;
- }
- if(irprosok)
- {
- irprosok=0;
- dis_init();
- }
- keyinit();
- clock_can();
- display();
- }
- }
- void timer0() interrupt 1
- {
- static uchar i,j;
- TH0=0x3c;
- TL0=0xb0;
- j++;
- if(j>=10)
- {
- j=0;
- flag_500ms=~flag_500ms;
- }
- i++;
- if(flag_set==0)
- if(i>=20)
- {
- i=0;
- miao++;
- if(miao>=60)
- {
- miao=0;
- fen++;
- if(fen>=60)
- {
- fen=0;
- shi++;
- if(shi>=24)
- {
- shi=0;
- }
- }
- }
- }
- }
- void timer1() interrupt 3
- {
- irtime++;
- }
- void int0() 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ù)制代碼
|
評(píng)分
-
查看全部評(píng)分
|