基于51单片机的时钟设计

今天小刚做了一个基于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();
//		}	
//}		

在这里插入图片描述

评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值