石头

深入浅出玩转51单片机——学习笔记:数码管简易时钟

0
阅读(3131)

/**********************************************
实现功能:数码管简易时钟
硬件平台:基于MGMC-V1.0实验板
晶振频率:11.0592Mhz
时间:2014年5月16日
***********************************************/

#include<reg52.h>

typedef unsigned char uint8;
typedef unsigned int  uint16;

sbit We_En = P1^6;
sbit Du_En = P1^7;

uint8 Bit_Tab[8] = {0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe};	//数码管位选
uint8 SEG_Tab[10] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,	 
                          0x7f,0x6f};		                    //数码管段选
uint8 time[3];
uint8 Dis_Buff[6];
uint8 We_Cnt = 0;
uint8 time_2ms_ok = 0;
uint8 time_1s_ok = 0;
uint16 i = 0;

void initial_myself();			 //上电初始化
void initial_peripheral();		 //外围设备初始化
void Dleay_Ms(uint16 z);
void Dis_Buffer();				 //时间分离函数
void SEG_Display();				 //数码管刷新函数
void Time_Service();			 //时间计时函数

void main()
{
    initial_myself();
	Dleay_Ms(10);
    initial_peripheral();
	time[0] = 56;
	time[1]	= 34;
	time[2]	= 12;
	while(1)
	{
		Dis_Buffer();
		SEG_Display();
		Time_Service();	
	}
}

void Time_Service()		 //时间计时函数
{
    if(1 == time_1s_ok)
	{
		time_1s_ok = 0;
		if(++time[0] >= 60)
		{
		    time[0] = 0;
			if(++time[1] >= 60)
			{
			    time[1] = 0;
				if(++time[2] >= 24)
				{
				    time[2] = 0;
				}
			}
		}
	}
}

void SEG_Display()	 //数码管刷新函数
{
    if(1 == time_2ms_ok)
	{
		time_2ms_ok = 0;
		switch(We_Cnt)
		{
		    case 0:		 //刷新第一个数码管
			Du_En = 1; P0 = 0x00; Du_En = 0;
			We_En = 1; P0 = Bit_Tab[We_Cnt]; We_En = 0;
			P0 = 0x00;
			Du_En = 1; P0 = SEG_Tab[Dis_Buff[0]]; Du_En = 0;
			We_Cnt++;
			break;

			case 1:		 //刷新第二个数码管
			Du_En = 1; P0 = 0x00; Du_En = 0;
			We_En = 1; P0 = Bit_Tab[We_Cnt]; We_En = 0;
			P0 = 0x00;
			Du_En = 1; P0 = SEG_Tab[Dis_Buff[1]]; Du_En = 0;
			We_Cnt++;
			break;

			case 2:		 //刷新第三个数码管
			Du_En = 1; P0 = 0x00; Du_En = 0;
			We_En = 1; P0 = Bit_Tab[We_Cnt]; We_En = 0;
			P0 = 0x00;
			Du_En = 1; P0 = 0x40; Du_En = 0;
			We_Cnt++;
			break;

			case 3:		 //刷新第四个数码管
			Du_En = 1; P0 = 0x00; Du_En = 0;
			We_En = 1; P0 = Bit_Tab[We_Cnt]; We_En = 0;
			P0 = 0x00;
			Du_En = 1; P0 = SEG_Tab[Dis_Buff[2]]; Du_En = 0;
			We_Cnt++;
			break;

			case 4:		 //刷新第五个数码管
			Du_En = 1; P0 = 0x00; Du_En = 0;
			We_En = 1; P0 = Bit_Tab[We_Cnt]; We_En = 0;
			P0 = 0x00;
			Du_En = 1; P0 = SEG_Tab[Dis_Buff[3]]; Du_En = 0;
			We_Cnt++;
			break;

			case 5:		 //刷新第六个数码管
			Du_En = 1; P0 = 0x00; Du_En = 0;
			We_En = 1; P0 = Bit_Tab[We_Cnt]; We_En = 0;
			P0 = 0x00;
			Du_En = 1; P0 = 0x40; Du_En = 0;
			We_Cnt++;
			break;

			case 6:		 //刷新第七个数码管
			Du_En = 1; P0 = 0x00; Du_En = 0;
			We_En = 1; P0 = Bit_Tab[We_Cnt]; We_En = 0;
			P0 = 0x00;
			Du_En = 1; P0 = SEG_Tab[Dis_Buff[4]]; Du_En = 0;
			We_Cnt++;
			break;

			case 7:		 //刷新第八个数码管
			Du_En = 1; P0 = 0x00; Du_En = 0;
			We_En = 1; P0 = Bit_Tab[We_Cnt]; We_En = 0;
			P0 = 0x00;
			Du_En = 1; P0 = SEG_Tab[Dis_Buff[5]]; Du_En = 0;
			We_Cnt = 0;
			break;
		}	    
	}    
}

void Dis_Buffer()        //时间分离函数
{
	Dis_Buff[0] = time[0]%10;
	Dis_Buff[1] = time[0]/10;
	Dis_Buff[2] = time[1]%10;
	Dis_Buff[3] = time[1]/10;
	Dis_Buff[4] = time[2]%10;
	Dis_Buff[5] = time[2]/10;
}

void initial_myself()	//上电初始化
{
	P0 = 0xff;
	We_En = 0;
	Du_En = 0;
	TMOD &= 0xf0;
	TMOD |= 0x01;
	TH0 = 0xf8;
	TL0 = 0xcd;
}

void initial_peripheral()	 //外围设备初始化
{
    EA = 1;		//开总中断
	ET0 = 1;	//使能T0中断
	TR0 = 1;	//使能T0
}

void T0_interrupt() interrupt 1	   //中断服务函数
{
    TF0 = 0;
	TH0 = 0xf8;
	TL0 = 0xcd;
    time_2ms_ok = 1;	//2ms时间到
	if(++i >= 500)
	{
	    i = 0;
		time_1s_ok = 1;	 //1s时间到
	}
}

void Dleay_Ms(uint16 z)
{
    uint16 x,y;
	for(x = 0; x < z; x++)
	  for(y = 0; y < 100; y++);
}