仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
单片机源程序:
- #include<reg51.h>
- #define uchar unsigned char
- void xianshi(int bianma,int adr);
- int key(void);
- uchar table1[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0xc7,0x39,0x5e,0x79,0x71};
- uchar table2[]={0x88,0x90,0xa0,0xc0};
- sbit key1=P3^6;
- sbit key2=P3^7;
- int flag2=0,t=0,i=0,j=0,m=0,k=0,b=0,c=0,a=0;
- int anjian1();
- int anjian2();
- void delay(uchar z)
- {
- uchar x,y;
- for(x=z;x>0;x--)
- for(y=110;y>0;y--);
- }
- void main()
- {
- int kk=16;
- int set_flag=0;
- TMOD=0x11;
- TH1=(65536-50000)/256;
- TL1=(65536-50000)%256;
- TH0=(65536-10000)/256;
- TL0=(65536-10000)%256;
- ET0=1;
- ET1=1;
- EA=1;
- EX0=1;
- IT0=1;
- TR1=1;
-
-
- while(1)
- {
- if(anjian1())
- {
- flag2=1;
- }
- if(flag2)
- {
- if(anjian2())
- { a++;
- while(anjian2()==1);
- }
- while(a>0)
- {
- xianshi(b%10,3);
- xianshi(b/10,2);
- xianshi(c%10,1);
- xianshi(c/10,0);
-
- if(anjian2())
- { a++;
- while(anjian2()==1);
-
- }
- if(a==2)
- {
- TR0=1;
- }
- if(a==3)
- {
- TR0=0;
-
- }
- if(a==4)
- {
- a=0;
- b=0,c=0;
- }
- }
-
- xianshi(m,3);
- xianshi(k,2);
- xianshi(j,1);
- xianshi(i,0);
-
-
-
- }
- else
- {
- P2=0Xff;
- P0=0;
- t=0;
- m=0,k=0,j=0,i=0;
-
- }
- kk=key();
- if(kk!=16)
- {
- if(kk==15)
- {
- TR1=0;set_flag=0;
- }
- if(kk==14)
- {
- TR1=1;set_flag=0;//退出模式
- }
- if(kk==13)
- {
- set_flag=3;//设置分的个位
- }
- if(kk==12)
- {
- set_flag=4;//设置分的十位
- }
- if(kk==11)
- {
- set_flag=5;//设置时的个位
- }
- if(kk==10)
- {
- set_flag=6;//设置时的十位
- }
- if((kk<10)&&(set_flag!=0))
- {
- switch(set_flag)
- {
-
- case 3:
- m=kk;
- break;
- case 4:
- if(kk<6)
- k=kk;
- break;
- case 5:
- j=kk;
- break;
- case 6:
- if(kk<6)
- i=kk;
- break;
- }
- }
- }
- kk=16;
-
- }
- }
- void xianshi(int bianma,int adr)
- {
- P2=0xff;
- P0=0;
- P2=~table1[bianma];
- delay(1);
- P0=table2[adr];
- delay(1);
- delay(30);
-
- }
- void dingshiqi1() interrupt 3
- {
- TH1=(65536-50000)/256;
- TL1=(65536-50000)%256;
- t++;
- if(t==20)
- {
- t=0;
- m++;
- if(m==10)
- {
- k++;
- m=0;
-
- }
- if(k==6)
- {
- j++;
- k=0;
- }
- if(j==10)
- {
- i++;
- j=0;
-
- }
- if(i==6)
- {
-
- i=0;
-
- }
-
-
-
-
-
-
- }
-
-
-
- }
- void dingshiqi0() interrupt 1
- {
- TH0=(65536-10000)/256;
- TL0=(65536-10000)%256;
- b++;
- if(b==100)
- {b=0;
- c++;
- }
- if(c==60)
- {
- c=0;
-
-
- }
-
- }
- int anjian1()
- {
-
- int key;
- key=key1;
- if(key==0)
- {
- delay(20);
- key=key1;
- if(key==0)
- {
- delay(200);
- return 1;
- }
- }
- return 0;
- }
- int anjian2()
- {
-
- int keyy;
- keyy=key2;
- if(keyy==0)
- {
- delay(20);
- keyy=key2;
- if(keyy==0)
- {
- delay(200);
- return 1;
- }
- }
- return 0;
- }
- void INT0_() interrupt 0
- {
- flag2=0;
- }
- int key(void)
- {
- int k=16;
- int temp=0;
- P1=0xfe;
- temp=P1;
- if(temp!=0xfe)
- {
- delay(25);
- if(temp!=0xfe)
- {
- if(temp==0xee)
- {
- k=0;
- }
- if(temp==0xde)
- {
- k=1;
- }
- if(temp==0xbe)
- {
- k=2;
- }
- if(temp==0x7e)
- {
- k=3;
- }
- }
- delay(1000);
- }
- P1=0xfd;
- temp=P1;
- if(temp!=0xfd)
- {
- delay(25);
- if(temp!=0xfd)
- {
- if(temp==0xed)
- {
- k=4;
- }
- if(temp==0xdd)
- {
- k=5;
- }
- if(temp==0xbd)
- {
- k=6;
- }
- if(temp==0x7d)
- {
- k=7;
- }
- }
- delay(1000);
- }
- P1=0xfb;
- temp=P1;
- if(temp!=0xfb)
- {
- delay(25);
- if(temp!=0xfb)
- {
- if(temp==0xeb)
- {
- k=8;
- }
- if(temp==0xdb)
- {
- k=9;
- }
- ……………………
- …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
所有资料51hei提供下载:
基于单片机的多功能电子时钟.rar
(65.65 KB, 下载次数: 25)
|