电路原理图如下:
单片机源程序如下:
- #include<reg52.h>
- #define uchar unsigned char
- #define uint unsigned int
- sbit s_set=P1^0;
- sbit m_set=P1^1;
- sbit h_set=P1^2;
- sbit reset=P1^3;
- sbit led=P3^2;
- unsigned char second,minute,hour,tcnt,restar=0;
- uchar code scan[8]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
- uchar code table[13]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40,0x39,0x00};
- uchar dispbuf[8];
- void delay(unsigned int us)
- {
- while(us--);
- }
- void scandisp()
- {
- unsigned char i,value;
- for(i=0;i<8;i++)
- {
- P2=0xff;
- value=table[dispbuf[i]];
- P0=value;
- P2=scan[i];
- delay(50);
- }
- }
- void Timer0(void)interrupt 1 using 1
- {
- TH0=(65536-50000)/256;
- TL0=(65536-50000)%256;
- tcnt++;
- if(tcnt==20)
- {
- second++;
- tcnt=0;
- if(second==60)
- {
- minute++;
- second=0;
- if(minute==60)
- {
- hour++;
- minute=0;
- if(hour==24)
- {
- hour=0;
- minute=0;
- second=0;
- tcnt=0;
- }
- }
- }
- }
- }
- void display()
- {
- scandisp();
- dispbuf[6]=second/10;
- dispbuf[7]=second%10;
- dispbuf[5]=10;
- dispbuf[3]=minute/10;
- dispbuf[4]=minute%10;
- dispbuf[2]=10;
- dispbuf[0]=hour/10;
- dispbuf[1]=hour%10;
- }
- void key_test()
- {
- display();
- P1=0xff;
- restar=0;
- if(s_set==0)
- {
- delay(100);
- if(s_set==0)
- {
- second++;
- if(second==60)
- {
- second=0;
- }
- while(s_set==0) display();
- }
- }
- if(m_set==0)
- {
- delay(100);
- if(m_set==0)
- {
- minute++;
- if(minute==60)
- {
- minute=0;
- }
- while(m_set==0) display();
- }
- }
- if(h_set==0)
- {
- delay(100);
- if(h_set==0)
- {
- hour++;
- if(hour==24)
- {
- hour=0;
- }
- while(h_set==0) display();
- }
- }
- if(reset==0)
- {
- delay(100);
- if(reset==0)
- {
- restar=1;
- }
- }
- }
- void main()
- {
- while(1)
- {
- P3=0x00;
- hour=0;
- minute=0;
- second=0;
- tcnt=0;
- TMOD=0x01;
- TH0=(65536-50000)/256;
- TL0=(65536-50000)%256;
- IE=0x82;
- TR0=1;
- while(1)
- {
- if(dispbuf[1]==9&dispbuf[0]==0&dispbuf[6]<=1&dispbuf[7]<=5)
- {
- led=1;
- if(dispbuf[1]==9&dispbuf[0]==0&dispbuf[6]==1&dispbuf[7]==5)
- {
- led=0;
- }
- }
- key_test();
- if(restar==1)
- break;
- }
- }
- }
复制代码
|