数码管显示部分的原理图(开发板中只需要截图显示部分即可):http://www.51hei.com/f/51hei-5.pdf
电路:红外接收头接在 单片机的外部中断0口。数码管用8位共阴极数码管,2个573锁存 详见上面的51hei单片机开发板的pdf图,本人测试成了.
程序源代码:
- #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() //定时器0方式1,用于时钟定时
- {
-
- TH0=0;
- TL0=0;
- ET0=1;
- TR0=1;
- }
- //定时器1方式2,用于红外时间加数
- void timer1_init()
- {
- TMOD=0X20|0x01; //选择定时器0和定时器1
- TH1=0;
- TL1=0;
- ET1=1;
- TR1=1;
- EA=1;
- }
- //外部中断0,用于确定红外数据
- void int0_init()
- { //下降沿触发
- IT0=1;
- EX0=1;
- EA=1;
- }
- void irpros() //红外数据处理函数
- {
- 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) //比较数据,确定数据为1还是为0
- {
- value=value|0x80; //数据为一
- }
- 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; //红外数据最后一位
- }
- void clock_can() //时间调整
- {
- 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;
- }
- }
复制代码
|