基于51单片机做的可调时钟,适合新手操作,有详细代码注释

基于51单片机做的可调时钟,适合新手操作,有详细代码注释

1. 最左边两个数码管是显示“时”,中间两个和右边两个分别是“分”“秒”
2. 左边的按钮是调时的,右边的按钮是调分的,每按一下就会加一
3.每次启动单片机就是从00:00:00开始的

现在显示的时间是7:09:15
在这里插入图片描述
细节描述:
1.时钟的计时功能是用了51单片机的定时器模式2:8位自动装载模式,其定时时间为(以定时器0为例):
T=(256-T0初值)X机器周期=(256-T0初值)X振荡周期X12

2. 调时调分功能分别是用了外部中断1和外部中断0

代码块

#include "reg52.h" 
typedef unsigned char uchar;
typedef unsigned int uint;

void delay(uint z);		//延时
void write_address(uchar address);		//选择数码管
void write_data(uint n);	//选择显示的内容
void flicker();			//主要显示函数

uint date[7]={0,0,0,0,0,0,0};	//为了便于编程,忽略掉date[0],只使用date[1]~date[6]
uint n=0;		//计数,计定时器中断的次数
uint second1=0,minute1=0,hour1=0;		//用于flicker函数

uchar TIMECODE[11]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,
0x7d,0x07,0x7f,0x6f,0x00};		//字形码表
uchar WEICODE[7]={~0,~0x01,~0x02,~0x04,~0x08,
~0x10,~0x20};					//选中数码管表
 
void main()
{
	TMOD=0x02;	//把定时器模式设为模式2
	TH0=0x56;	//设置初值
	TL0=0x56;	//设置初值
	TR0=1;		//启动定时器
	EA=1;		//打开总中断开关
	ET0=1;		//打开定时器中断允许位

	EX0=1;		//打开外部中断0
	IT0=1;		//设置外部中断0的模式是下降沿触发

	EX1=1;		//打开外部中断1
	IT1=1;		//设置外部中断1的模式是下降沿触发

	while(1)
	{
		flicker();
	}
}

void delay(uint z)//z等于1,就是延时1ms
{
	uint x,y;
	for(x=z;x>0;x--)
		for(y=114;y>0;y--)
		;
}

void write_address(uchar address)//显示数码管
{
	P2=address;

}

void  write_data(uint n)//显示数据
{
	
	P0=TIMECODE[n];
	
}

void flicker()//使数码管动态显示
{	
	write_address(WEICODE[1]);//最左边数码管亮
	write_data(date[1]);	//date[1]的值就是最左边数码管显示的值
	delay(1);//延时	 
	P0=~0xff;//消影			  

	write_address(WEICODE[2]);//同上理
	write_data(date[2]);
	delay(1);
	P0=~0xff;	

	write_address(WEICODE[3]);
	write_data(date[3]);
	
	delay(1);
	P0=~0xff;
	write_address(WEICODE[4]);
	write_data(date[4]);
	
	delay(1);
	P0=~0xff;
	write_address(WEICODE[5]);
	write_data(date[5]);

	delay(1);
	P0=~0xff;	
	write_address(WEICODE[6]);
	write_data(date[6]);
	delay(1);
	P0=~0xff;
}

void serve()interrupt 1//定时器中断响应
{
	 n++;										        
	 if(n==5000)		//当n=5000时,表示过了1s
	 {	 
	     n=0;					                        
	     second1++;
		 if(second1==60)
		 {
		     second1=0;
		     minute1++;
			 if(minute1==60)
			 {
			     minute1=0;
				 hour1++;
				 if(hour1==24)
				 {	    
				    hour1=0;
				 }
			 }
		 }
		 date[6]=second1%10;
		 date[5]=second1/10;
		 date[4]=minute1%10;
		 date[3]=minute1/10;
		 date[2]=hour1%10;
		 date[1]=hour1/10;
	
	 }

}

void tiaofen() interrupt 0//外部中断,按键调分响应
{	
	minute1++;
	if(minute1==60)
		minute1=0;
		
}

void tiaoshi() interrupt 2//外部中断,按键调时响应
{
	hour1++;
	if(hour1==24)
		hour1=0;
}		

新人博客,要是觉得有用给个赞呗嘻嘻

发布了1 篇原创文章 · 获赞 6 · 访问量 61

猜你喜欢

转载自blog.csdn.net/weixin_46438614/article/details/105389633