欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

基于51单片机的时钟设计

程序员文章站 2022-06-08 19:58:01
...

今天小刚做了一个基于51单片机的时钟,本来想把数码管显示动态扫描放到定时器1的中断里到但是,一按按键,就卡住了,效果不是很理想。所以就放弃了这种方案。不过最后也实现了功能。
以下是程序代码
4个按键功能:
1.切换
2.时间+
3.时间-
4.清零
注意TMOD |=0x01的使用!
最后,大家一起加油吧!.jpg

#include <reg52.h>
#define uint unsigned int
#define uchar unsigned char
sbit du=P2^6;
sbit wei=P2^7;
sbit key_s2=P3^0;
sbit key_s3=P3^1;
sbit key_s4=P3^2;
sbit key_s5=P3^3;

uchar code duantabel[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//数码管断显示
uchar code weitabel[]={0xfe,0xfd,0xfb,0xf7};  
static uchar m,i,miao,fen,fenge,fenshi,miaoge,miaoshi,timer,shi,shishi,shige,flag;
void delay(uint z)//延时1ms
{
	uchar x,y;
	for(x=z;x>0;x--)
	for(y=114;y>0;y--);
}
void display1()//数码管显示函数1,显示分钟和秒钟
{
	
	miaoge=miao%10;
	miaoshi=miao/10;
	fenge=fen%10;
	fenshi=fen/10;
	P0=0Xff;//清除段码,防止之前段码影响
	wei=1;
	P0=0xfe;
	wei=0;
	
	du=1;
	P0=duantabel[fenshi];
	du=0;
	delay(2);
	
	P0=0Xff;//清除段码,防止之前段码影响
	wei=1;
	P0=0xfd;
	wei=0;
	
	du=1;
	P0=duantabel[fenge];
	du=0;
	delay(2);
	
	P0=0Xff;//清除段码,防止之前段码影响
	wei=1;
	P0=0xfb;
	wei=0;
	
	du=1;
	P0=duantabel[miaoshi];
	du=0;
	delay(2);
		
	P0=0Xff;//清除段码,防止之前段码影响
	wei=1;
	P0=0xf7;
	wei=0;
	
	du=1;
	P0=duantabel[miaoge];
	du=0;
	delay(2);
}

void display2()//数码管显示函数显示小时和分钟
{
	fenge=fen%10;
	fenshi=fen/10;
	shige=shi%10;
	shishi=shi/10;
	P0=0Xff;//清除段码,防止之前段码影响
	wei=1;
	P0=0xfe;
	wei=0;
	
	du=1;
	P0=duantabel[shishi];
	du=0;
	delay(2);
	
	P0=0Xff;//清除段码,防止之前段码影响
	wei=1;
	P0=0xfd;
	wei=0;
	
	du=1;
	P0=duantabel[shige];
	du=0;
	delay(2);
	
	P0=0Xff;//清除段码,防止之前段码影响
	wei=1;
	P0=0xfb;
	wei=0;
	
	du=1;
	P0=duantabel[fenshi];
	du=0;
	delay(2);
		
	P0=0Xff;//清除段码,防止之前段码影响
	wei=1;
	P0=0xf7;
	wei=0;
	
	du=1;
	P0=duantabel[fenge];
	du=0;
	delay(2);
}

void timer0Init()//定时器定时
{
	TR0=1;
	TMOD |= 0X01;
	TH0=0X2c;//定时器赋初值50ms
	TL0=0X15;
}

//void timer1Init()//开定时器中断1
//{
//	TMOD |= 0x10;  //定时器16为计数工作模式
//	TH1 =0xFC;
//	TL1 =0xFF; //5ms
//	EA = 1;	//开总中断
//	ET1 = 1; //开定时器1中断
//	TR1 = 1;//启动定时器1
//}
void main()
{
	timer0Init();
//	timer1Init();
	while(1)
	{
		if(TF0==1)
		{
			TF0=0;
			TH0=0X2c;//定时器赋初值50ms
			TL0=0X15;
			m++;
		}
		if(m>15)
		{
			m=0;
			miao++;
		}
		if(miao>=60)
		{
			miao=0;
			fen++;
		}
		if(fen>=60)
		{
			fen=0;
			shi++;
		}
		if(shi>=24)
		{
			miao=0;
			fen=0;
			shi=0;
		}
			if(flag%2==0)
		{
			display1();
		}
		else
		{
			display2();
		}	
		if(key_s2==0)//先检测,消抖,检测,执行,松手检测
		{
			delay(20);//按键消抖
					if(key_s2==0)
					{
						flag++;
						while(!key_s2);//松手检测
					}
		}
		if(key_s3==0)//先检测,消抖,检测,执行,松手检测
		{
			delay(20);//按键消抖
					if(key_s3==0)
					{
						miao++;
						while(!key_s3);//松手检测
					}
		}
		if(key_s4==0)//先检测,消抖,检测,执行,松手检测
		{
			delay(20);//按键消抖
					if(key_s4==0)
					{
						miao=miao-1;
						while(!key_s4);//松手检测
					}
		}
		if(key_s5==0)//先检测,消抖,检测,执行,松手检测
		{
			delay(20);//按键消抖
					if(key_s5==0)
					{
						miao=0;
						fen=0;
						shi=0;
						while(!key_s5);//松手检测
					}
		}
	}
}
//void timer1() interrupt 3
//{
//	TH1 =0xFC;
//	TL1 =0x17; //5ms  模式1非自动重装需要手动重装
//	
//	if(flag%2==0)
//		{
//			display1();
//		}
//		else
//		{
//			display2();
//		}	
//}		

基于51单片机的时钟设计