功能要求:显示基本的时、分、秒,并且有按键可以用于暂停(启动)、清零、调时功能。

功能实现思路:设置四个按键分别用于总开关(启动/暂停)、调时移位(切换调整的是小时还是分钟)、调时(加)、清零

电路连接:(Proteus仿真)

单片机原理及其应用课程实验作业,做的不好,代码写的很烂,仅供参考,大佬别骂qaq
Keil uVision5编程+Proteus 8 Professional仿真

AT89C51、7SEG-MPX6-CA、BUTTON、LED-BLUE、RES

代码部分:

#include <reg51.h>
#define uchar unsigned char

sbit P20=P2^0;
sbit P21=P2^1;
sbit P22=P2^2;
sbit P23=P2^3;
sbit P24=P2^4;
sbit P25=P2^5;
sbit P26=P2^6;
sbit P27=P2^7;
sbit bt4=P3^0;
sbit bt3=P3^1;
sbit bt2=P3^2;
sbit bt1=P3^3;
sbit LED=P1^2;
sbit LED2=P1^1;
sbit LED3=P1^0;

char code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};

uchar dgt[8]={2,1,5,9,5,5,0,0};
uchar i=0,j=0;

unsigned int t0=0,t1=0,k=1;

void delay(unsigned int d)     
{ 
	while(d--);
}

void Timer0Init(void)
{
	TMOD &=0xf0;
	TMOD |=0x01;
	TL0=t0;
	TH0=t0>>8;
	ET0=1;
	TR0=1;
}	
void Timer1Init(void)
{
	TMOD &=0x0f;
	TMOD |=0x10;
	TL1=t1;
	TH1=t1>>8;
	ET1=1;
	TR1=1;
}	

void ButtonScan(void)
{
static bit flag=0;
	if(bt1 == 0)			
	{
		delay(300);	
		while(bt1 == 0);
		if(flag==0)
		{
			flag=1,TR1=0;
			LED = !LED;
		}
		else
		{
			flag=0,TR1=1;
			LED = !LED;
		}
 	}
	if(bt2 == 0)
	{
		delay(300);	
		while(bt2 == 0);
		if(k>=3)
		{
			k=1;
			LED2=!LED2;
			LED3=!LED3;
		}
		else 
		{
			k=k+2;
			LED3=!LED3;
			LED2=!LED2;
		}
		
	}
		if(bt3 == 0)
	{
		delay(300);	
		while(bt3 == 0);
		{
			if(k==1&dgt[0]<3&dgt[1]<9)
			{
				dgt[1]++;
			}
			else if(k==1&dgt[0]<3&dgt[1]==9)
			{
			dgt[1]=0;
			dgt[0]++;
			}
			else if(k==1&dgt[0]==2&dgt[1]>3)
			{
			dgt[1]=0;
			dgt[0]=0;
			}
			else if(k==3&dgt[2]<6&dgt[3]<9)
			{
			dgt[3]++;
			}
			else if(k==3&dgt[2]<5&dgt[3]==9)
			{
			dgt[3]=0;
			dgt[2]++;
			}
			else if(k==3&dgt[2]==5&dgt[3]==9)
			{
			dgt[3]=0;
			dgt[2]=0;
			}
			}
	}
		if(bt4 == 0)
	{
		delay(300);	
		while(bt4 == 0);
		{
		dgt[0]=0;
		dgt[1]=0;
		dgt[2]=0;
		dgt[3]=0;
		dgt[4]=0;
		dgt[5]=0;		
		dgt[6]=0;
		dgt[7]=0;			
		}
	}
}

int main(void)
{
	P1 = 0x00; 
	t0=65536-1000;
	t1=65536-13500;
	Timer0Init();
	Timer1Init();
	EA=1;
	LED2=!LED2;
	while(1)
	{
	ButtonScan();
	}
}		
void Time0(void) interrupt 1
{
	TL0=t0;
	TH0=t0>>8;
	
	switch(i)
	{
		case 0:P27=0;P20=1;P0=table[dgt[i]];break;
		case 1:P20=0;P21=1;P0=table[dgt[i]];break;
		case 2:P21=0;P22=1;P0=table[dgt[i]];break;
		case 3:P22=0;P23=1;P0=table[dgt[i]];break;
		case 4:P23=0;P24=1;P0=table[dgt[i]];break;
		case 5:P24=0;P25=1;P0=table[dgt[i]];break;
		case 6:P25=0;P26=1;P0=table[dgt[i]];break;
		case 7:P26=0;P27=1;P0=table[dgt[i]];break;
	}
	i++;
	if(i>7)
		i=0; 
	if(k==1&dgt[0]==2&dgt[1]>3)
			{
			dgt[1]=0;
			dgt[0]=0;
			}
}
void Time1(void) interrupt 3
{
	TL1=t1;
	TH1=t1>>8;
	dgt[7]++;
	if(dgt[7]>9)
{
	dgt[7]=0; dgt[6]++;
	if(dgt[6]>5)
	{
		dgt[6]=0;dgt[5]++;
		if(dgt[5]>9)
		{
			dgt[5]=0;dgt[4]++;
			if(dgt[4]>5)
			{
				dgt[4]=0;dgt[3]++;
				if(dgt[3]>9)
				{
					dgt[3]=0;dgt[2]++;
					if(dgt[2]>5)
					{
						dgt[2]=0;dgt[1]++;
						if(dgt[2]>2)
						{
						dgt[1]=0;dgt[0]++;
						dgt[0]=0;
						}
					}
				}
			}
		}
	}
}
if(dgt[0]==2&dgt[1]>3)
		{
		dgt[0]=0;
		dgt[1]=0;
		}
}
switch(i)
{
    case 0:P27=0;P20=1;P0=table[dgt[i]];break;
    case 1:P20=0;P21=1;P0=table[dgt[i]];break;
    case 2:P21=0;P22=1;P0=table[dgt[i]];break;
    case 3:P22=0;P23=1;P0=table[dgt[i]];break;
    case 4:P23=0;P24=1;P0=table[dgt[i]];break;
    case 5:P24=0;P25=1;P0=table[dgt[i]];break;
    case 6:P25=0;P26=1;P0=table[dgt[i]];break;
    case 7:P26=0;P27=1;P0=table[dgt[i]];break;
}
i++;
if(i>7)
    i=0; 
if(k==1&dgt[0]==2&dgt[1]>3)
        {
        dgt[1]=0;
        dgt[0]=0;
        }

仿真测试:

一切正常