⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 clock.c

📁 这个是一个时钟的代码
💻 C
字号:
/************************************************************************************/
/*     程序名:数码管显示的时钟代码                                                 */
/*                                                                                  */
/*     晶振:12.0 M                                        CPU型号:AT89S52         */
/*                                                                                  */
/*                                                                                  */
/*     功能描述: 数码管时钟显示,需将J2跳线帽插上                                   */
/*                    但是要拔去LCD12864和LCD1602!      			                */
/*                                                                                  */
/*     http://www.mculover.net                                                      */
/*     http://www.mculover.net/bbs                                                  */
/*   													 					    	*/
/*                                                                                  */
/*                                                湘灵电子工作室 版权所有           */     
/*                                                         2006-03-20               */
/************************************************************************************/ 
#include<reg51.h>

#define _TH0_TL0_ 		(65536 - 50000)  
#define HI 			(_TH0_TL0_ / 256) //给高8位赋值
#define LO 			(_TH0_TL0_ % 256) //给低8位赋值
#define M 			20                //(1000/50)1秒要50个中断的累计

sbit P2_0 = P2 ^ 0;
sbit P2_1 = P2 ^ 1;
sbit P2_2 = P2 ^ 2;
sbit P2_3 = P2 ^ 3;
sbit P2_4 = P2 ^ 4;
sbit P2_5 = P2 ^ 5;
sbit P2_6 = P2 ^ 6;
sbit P2_7 = P2 ^ 7;

unsigned char hour = 12, min = 20, sec = 20; //初始化时分秒的值
unsigned char SEG_TAB[] = {0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8, 0x80, 0x90};//0-9数字

/*********************************************************************************************/
void Delay(unsigned char a)//延时程序
{
	unsigned char j; 
	while(--a != 0)
	{
		for (j = 0; j < 125; j++);
	}
}

/*********************************************************************************************/
void Disp(void)//数码管显示
{
		P2_7 = 0;   //第一个数码管显示时的十位
		P0 = SEG_TAB[ hour / 10 ];	
		Delay(4);
		P2_7 = 1;

		P2_6 = 0;//第2个数码管显示时的个位
		P0 = SEG_TAB[ hour % 10 ];
		Delay(4);
		P2_6 = 1;

		P2_4 = 0;//第4个数码管显示分的十位
		P0 = SEG_TAB[ min / 10 ];	
		Delay(4);	
		P2_4 = 1;

		P2_3 = 0;//第5个数码管显示分的个位
		P0 =SEG_TAB[ min % 10 ];		
		Delay(4);
		P2_3 = 1;

		P2_1 = 0;//第7个数码管显示秒的十位
		P0 = SEG_TAB[ sec / 10 ];	
		Delay(4);	
		P2_1 = 1;

		P2_0 = 0;//第8个数码管显示秒的各位。
		P0 = SEG_TAB[ sec % 10 ];	
		Delay(4);	
		P2_0 = 1;
}
			
/********************************************************************************************/
void IsrTimer0(void) interrupt 1 using 1    //定时器0中断服务程序
{
	static unsigned char count = 0;	//定义静态变量count

	TR0 = 0;               //以下调整出栈入栈的时间误差
    TL0 += (_TH0_TL0_ + 9) % 256;
   	TH0 += (_TH0_TL0_ + 9) / 256 + (char)CY;
    TR0 = 1;

	count++;
	if(count == M)//1秒种时间到
	{
		count = 0;	
		sec++;		
		if(sec == 60)//1分钟时间到
		{
			min++;
			sec = 0;
			if(min == 60)//1小时时间到
			{
				hour++;
				min = 0;
				if(hour == 24)//24小时时间到
				{
					hour = 0;
					min = 0;
					sec = 0;
				}
			}
		}
	}//if
}

/******************************************************************************************/
void Timer0Init(void)  //初始化定时器0程序
{
	TMOD = 0x01; //设置模式1 定时器0 工作方式0

	TH0 = HI; //给TH0,TL0赋初始值
	TL0 = LO;

	TR0 = 1;  //启动定时器0
	ET0 = 1;  //定时器中断开
	EA = 1;	//总中断开
}

/******************************************************************************************/
void main(void)//主函数
{
	Timer0Init();//初始化定时器0

	while(1)
	{
		Disp();//显示时间
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -