51单片机实例9——简易时钟

简易时钟

1、设计目的

        简易时钟

2、仿真电路

3、程序设计(C语言)

#include<reg51.h>
#include<math.h>
sbit U_74HC138_A=P3^0;
sbit U_74HC138_B=P3^1;
sbit U_74HC138_C=P3^2;
int t0_num=0;  //定义T0中断响应次数
int number_hour=23;
int number_hour1=0;	//定义时间小时十位
int number_hour2=0;	//定义时间小时个位
int number_minute=59;
int number_minute1=0;	//定义时间分钟十位
int number_minute2=0;	//定义时间分钟个位
int number_second=50;
int number_second1=0;	//定义时间秒十位
int number_second2=0;	//定义时间秒个位
/****************************************
函数功能:两位十进制数拆分为十位(place=0)与个位(place=1)
*****************************************/
int double_split(int number,int place)
{
	int num=0;
	switch(place)
	{
		case 0: num=number/10;
		break;
		case 1: num=number%10;
		break;
	}
	return num;
}
/****************************************
函数功能:数码管初始值设置
*****************************************/
void init_led_8CC()
{
	P2=0x00;
	U_74HC138_A=0;
	U_74HC138_B=0;
	U_74HC138_C=0;
}
/****************************************
函数功能:8段共阴极led显示数字
		a								 —
	f		b							| |
		g								 —
	e		c							| |
		d		 h					 — .
*****************************************/
int led_8CC_number(int number)
{
	int led;
	int num[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};	//8段共阳极led数字显示段码编码
	switch(number)
	{
		case 0:led=num[0];
		break;
		case 1:led=num[1];
		break;
		case 2:led=num[2];
		break;
		case 3:led=num[3];
		break;
		case 4:led=num[4];
		break;
		case 5:led=num[5];
		break;
		case 6:led=num[6];
		break;
		case 7:led=num[7];
		break;
		case 8:led=num[8];
		break;
		case 9:led=num[9];
		break;
		default:led=0x00;
		break;
	}
	return led;
}
/****************************************
函数功能:延时
*****************************************/
void delay(unsigned int num)
{
	int i=0;
	if(num>0)
	{
		for(num;num>0;num--)
			for(i=250;i>0;i--);
	}
}
/****************************************
函数功能:时间显示
*****************************************/
void time_show()
{
	number_hour1=double_split(number_hour,0);
	number_hour2=double_split(number_hour,1);
	number_minute1=double_split(number_minute,0);
	number_minute2=double_split(number_minute,1);
	number_second1=double_split(number_second,0);
	number_second2=double_split(number_second,1);
	switch(0)
	{
		case 0:
		{
			U_74HC138_A=0;
			U_74HC138_B=0;
			U_74HC138_C=0;
			P2=led_8CC_number(number_hour1);
			delay(1);
		}
		case 1:
		{
			U_74HC138_A=1;
			U_74HC138_B=0;
			U_74HC138_C=0;
			P2=led_8CC_number(number_hour2);
			delay(1);
		}
		case 2:
		{
			U_74HC138_A=0;
			U_74HC138_B=1;
			U_74HC138_C=0;
			P2=0x40;
			delay(1);
		}	
		case 3:
		{
			U_74HC138_A=1;
			U_74HC138_B=1;
			U_74HC138_C=0;
			P2=led_8CC_number(number_minute1);
			delay(1);
		}	
		case 4:
		{
			U_74HC138_A=0;
			U_74HC138_B=0;
			U_74HC138_C=1;
			P2=led_8CC_number(number_minute2);
			delay(1);
		}	
		case 5:
		{
			U_74HC138_A=1;
			U_74HC138_B=0;
			U_74HC138_C=1;
			P2=0x40;
			delay(1);
		}	
		case 6:
		{
			U_74HC138_A=0;
			U_74HC138_B=1;
			U_74HC138_C=1;
			P2=led_8CC_number(number_second1);
			delay(1);
		}	
		case 7:
		{
			U_74HC138_A=1;
			U_74HC138_B=1;
			U_74HC138_C=1;
			P2=led_8CC_number(number_second2);
			delay(1);
		}	
	}
}
/****************************************
函数功能:定时器T0的初始值设置
*****************************************/
void t0_init_value(int t)
{
	TH0=((int) (pow(2,16)-t*pow(10,-3)*12*pow(10,6)/12))/256; 
	TL0=((int) (pow(2,16)-t*pow(10,-3)*12*pow(10,6)/12))%256;  //设置定时器初值
}
/****************************************
函数功能:定时器T0的定时初始化
*****************************************/
void t0_init(int t)
{
	TMOD=0x01;  //设置T0工作于定时工作方式1
	t0_init_value(t);
	IE=0x00;	//禁止中断
	ET0=1;	//开启T0溢出中断
	EA=1;	//开启总中断
	TR0=1;	//启动T0
}
/****************************************
函数功能:定时器T0的中断服务子程序,1s定时闪烁
*****************************************/
void second_1s() interrupt 1
{
	TH0=15536/256; 
	TL0=15536%256;  //设置定时器初值
	if(t0_num==20)
	{
		t0_num=0;
		number_second++;
		if(number_second==60)
		{
			number_second=0;
			number_minute++;
			if(number_minute==60)
			{
				number_minute=0;
				number_hour++;
				if(number_hour==24)
					number_hour=0;
			}
		}
	}
	else
		t0_num++;		//中断次数计数
}
/****************************************
函数功能:主函数
*****************************************/
void main()
{
	init_led_8CC();
	t0_init(50);	//调用定时初始化函数
	while(1)	//持续运行
	{
		time_show();
	}
}

文章来源地址https://uudwc.com/A/3rywR

原文地址:https://blog.csdn.net/m0_63445811/article/details/125887383

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请联系站长进行投诉反馈,一经查实,立即删除!

上一篇 2023年06月27日 14:01
ArcGis系列-坐标系转换
下一篇 2023年06月27日 14:03