单片机初级应用:时钟+闹钟+秒表+定时器

单片机初级应用:时钟+闹钟+秒表+定时器

作者:AntoniotheFuture

关键词:单片机,时钟,C语言,C51

开发平台:Keil μVersion4

平台版本上限:未知

平台版本下限:未知

开发语言:C

简介: 用单片机实现一个具有四大功能(时钟,闹钟,秒表,定时器)的时钟,可以记录8组秒表,8个闹钟。

不同的单片机需要作不同的设置

>>led.c

#include<reg52.h>
#include<Timer.h>
#include<STCc52.h>
#define uchar unsigned char
#define uint unsigned int
//时间计数
uchar count=0;
uchar SWCount=0;
uchar TCount = 0;

//状态控制
uint LEDP = 1;
uchar SMOD = 1; //显示模式  1-1 时钟运行 1-2 调整时 1-3 调整分 1-4重置时间 2-1闹钟查看 2-2闹钟设置时 2-3闹钟设置分 2-4删除当前闹钟  3-1 秒表5键开始/计数、4键停止/继续 3-2秒表查看 3-3清空秒表 4-1定时器准备 4-2定时器设置分 4-3定时器设置秒 4-4删除定时器
uchar FMOD = 1; //功能模式 1:时钟 2:秒表 3:闹钟 4:定时器
bit SWRUN = 0;
bit keyp2 =0;
bit keyp3 =0;
bit keyp4 =0;
bit keyp5 =0;
bit ACRun = 0;
bit TACRUN = 0;
bit TRUN = 0;
uchar dot;
bit show = 1;

//时间参数
uint SWMSEC = 0;
int TSEC = 0;
int TMIN = 0;
char SEC = 30;
char MIN = 25;
char HOR = 17;

//循环参数

uchar x = 0;
uchar y = 0;
uchar swy = 0;
uchar swdy = 0;
uchar i;

//硬件映射
sbit fm = P2^3;

//闹钟数组:时分、0 = 启用。
uint ACs[8][3] = {{8,0,0},{0,0,1},{0,0,1},{0,0,1},{0,0,1},{0,0,1},{0,0,1},{0,0,1}};
uint SWs[8] = {0};

//计时器
void timer0()interrupt 1{
	TH0=(65536-46080)/256;
	TL0=(65536-46080)%256;
	count++;
	if (SWRUN){SWCount++;}
	if (TRUN){TCount++;}	 
}

//流水灯
void TLED(){
	if (TRUN&TCount%2 == 0 ){LEDP++;
		if (LEDP == 9){LEDP = 0;}
   	LEDSW (LEDP,0);
	}}

void main()
{
	TMOD=0x01;
	TH0= (65536-46080)/256;
	TL0= (65536-46080)%256;
	EA =1;
	ET0 =1;
	TR0 = 1;
	while (1){
	//时钟
	if (count == 20){
		SEC ++;
		count = 0;
		if(SEC == 60){
			SEC = 0;
			MIN ++;
			ACRun = 1;
			TACRUN = 0;
			if(MIN == 60){
				MIN = 0;
				HOR ++;
				if (HOR == 24){
					HOR = 0;}
			}
		}
	}
	//小数点闪烁
	if (SEC%2 == 0 ) dot =1; else dot = 0;
	//闹钟
	if (ACRun&dot == 1){
		for (x = 0;x < sizeof(ACs) / sizeof(ACs[0]);x++){
			if(ACs[x][2] == 0&HOR == ACs[x][0]&MIN == ACs[x][1]){
				if(count == 0||count == 5||count == 10||count == 15){fm = 0;}
				if(count == 3||count == 8||count == 13||count == 18){fm = 1;}
			}break;
		}
	}
	//定时器闹钟
	if(TACRUN&dot == 1){
		if(TCount == 0||TCount == 10){fm = 0;}
		if(TCount == 5||TCount == 15){fm = 1;}
	}
	else {fm = 1;}
	
	//秒表
	if (SWRUN){
	if (SWCount == 2){
		SWMSEC ++;
		SWCount = 0;
		if(SWMSEC == 6000){SWRUN = 0;SWMSEC = 5999;}
		}
	}
	//定时器
	if (TRUN){
	if (TCount == 20){
		TSEC --;
		TCount = 0;
		if(TSEC == -1&TMIN == 0){TRUN = 0;TSEC = 0;TACRUN = 1;}
		else if(TSEC == -1){TSEC = 59;TMIN --;}
		}
	}
	
	//功能改变
	if (~keyp2&ShortPress(2)){FMOD++;SMOD = 1;keyp2 = 1;display (0,0,0,0,0,0,0,0);
		if (FMOD == 5){FMOD = 1;}}
	else if (~ShortPress(2)){keyp2 = 0;}

	//状态改变
	if (~keyp3&ShortPress(3)){SMOD++;keyp3 = 1;
		if (FMOD == 3&SMOD == 4){SMOD = 1;}
		else if (SMOD == 5){SMOD = 1;}
	}
	else if (~ShortPress(3)){keyp3 = 0;}
	//关闭闹钟
	if (ACRun){
		if (~keyp5&ShortPress(5)){ACRun = 0;keyp5 = 1;show=1;}
		else if (~ShortPress(5)){keyp5 = 0;}
	}	

	//显示
	switch(FMOD){
	case 1:
		switch(SMOD){
			case 1:
				TLED();
				if (show){
				display (HOR/10,0,HOR%10,dot,MIN/10,0,MIN%10,0);}
				if (~keyp5&ShortPress(4)){Delay(100);show = ~show;keyp4 = 1;refresh();}
				else if (~ShortPress(4)){keyp4 = 0;}
				break;
			case 2:
				display (HOR/10,dot,HOR%10,dot,MIN/10,0,MIN%10,0);
			   	if (~keyp4&ShortPress(4)){HOR--;keyp4 = 1;
					if (HOR == -1){HOR = 23;}}
				else if (~ShortPress(4)){keyp4 = 0;}
				if (~keyp5&ShortPress(5)){HOR++;keyp5 = 1;
					if (HOR == 24){HOR = 0;}}
				else if (~ShortPress(5)){keyp5 = 0;}show=1;break;
			case 3:
				display (HOR/10,0,HOR%10,0,MIN/10,dot,MIN%10,dot);
			   	if (~keyp4&ShortPress(4)){SEC = 0;MIN--;keyp4 = 1;
					if (MIN == -1){MIN = 59;}}
				else if (~ShortPress(4)){keyp4 = 0;}
				if (~keyp5&ShortPress(5)){SEC = 0;MIN++;keyp5 = 1;
					if (MIN == 60){MIN = 0;}}
				else if (~ShortPress(5)){keyp5 = 0;}show=1;break;
			case 4:
				display (0x7c,dot,0,dot,0,dot,0,dot);
				if (~keyp5&ShortPress(5)){keyp5 = 1;HOR = 0;MIN = 0;SEC = 0;SMOD = 1;}
				else if (~ShortPress(5)){keyp5 = 0;}show=1;break;
	}break;
	case 2:
		show=1;
		for (x = 0;x < sizeof(ACs) / sizeof(ACs[0]);x++){
			LEDSW (x+1,ACs[x][2]);}
			LEDSW (y+1,dot);
		switch(SMOD){
			case 1:
			   	if (~keyp4&ShortPress(4)){y--;keyp4 = 1;
					if (y == -1){y = 7;}}
				else if (~ShortPress(4)){keyp4 = 0;}
				if (~keyp5&ShortPress(5)){y++;keyp5 = 1;
					if (y == 8){y = 0;}}
				else if (~ShortPress(5)){keyp5 = 0;}
				display (ACs[y][0]/10,0,ACs[y][0]%10,dot,ACs[y][1]/10,0,ACs[y][1]%10,0);
				break;
			case 2:
				display (ACs[y][0]/10,dot,ACs[y][0]%10,dot,ACs[y][1]/10,0,ACs[y][1]%10,0);
				if (~keyp4&ShortPress(4)){ACs[y][0]--;keyp4 = 1;
					if (ACs[y][0] == -1){ACs[y][0] = 23;}}
				else if (~ShortPress(4)){keyp4 = 0;}
				if (~keyp5&ShortPress(5)){ACs[y][0]++;keyp5 = 1;
					if (ACs[y][0] == 24){ACs[y][0] = 0;}}
				else if (~ShortPress(5)){keyp5 = 0;}
				break;
			case 3:
				display (ACs[y][0]/10,0,ACs[y][0]%10,0,ACs[y][1]/10,dot,ACs[y][1]%10,dot);
				if (~keyp4&ShortPress(4)){ACs[y][1]--;keyp4 = 1;
					if (ACs[y][1] == -1){ACs[y][1] = 59;}}
				else if (~ShortPress(4)){keyp4 = 0;}
				if (~keyp5&ShortPress(5)){ACs[y][1]++;keyp5 = 1;
					if (ACs[y][1] == 60){ACs[y][1] = 0;}}
				else if (~ShortPress(5)){keyp5 = 0;}
				break;
			case 4:
				display (0,dot,0x7c,dot,0,dot,0,dot);
				if (~keyp5&ShortPress(5)){keyp5 = 1;
					if(ACs[y][2] == 1) ACs[y][2] = 0;
					else ACs[y][2] = 1;
					SMOD = 1;}
				else if (~ShortPress(5)){keyp5 = 0;}
				break;
		}
		for (x = 0;x < 8;x++){LEDSW (x+1,1);}
		break;
	case 3:show=1;
		for (x = 0;x < sizeof(SWs) / sizeof(SWs[0]);x++){
			if (SWs[x]>0){LEDSW (x+1,0);}
			else break;}
		switch(SMOD){
		case 1:
			if(~SWRUN) dot = 1;
			LEDSW (x+1,dot);
			display (SWMSEC/600,dot,(SWMSEC%600)/100,0,(SWMSEC%100)/10,dot,SWMSEC%10,0);
			if (~keyp4&ShortPress(4)){SWRUN = ~SWRUN;keyp4 = 1;}
			else if (~ShortPress(4)){keyp4 = 0;}
			if (x <8&SWRUN&~keyp5&ShortPress(5)){SWs[x] = SWMSEC;keyp5 = 1;}
			else if (~ShortPress(5)){keyp5 = 0;}
			swy = x;
			break;
		case 2:
			SWRUN = 0;
			LEDSW (swy+1,dot);
			if (~keyp4&ShortPress(4)){swy--;keyp4 = 1;LEDSW (x,1);}
				if (swy == -1){if (x >1) swy = x;else swy = 0;}
			else if (~ShortPress(4)){keyp4 = 0;}
			if (~keyp5&ShortPress(5)){swy++;keyp5 = 1;LEDSW (x,1);}
			else if (~ShortPress(5)){keyp5 = 0;}
			if (swy == x){display (SWMSEC/600,1,(SWMSEC%600)/100,0,(SWMSEC%100)/10,1,SWMSEC%10,0);}
			else {display (SWs[swy]/600,1,(SWs[swy]%600)/100,0,(SWs[swy]%100)/10,1,SWs[swy]%10,0);}
			if (swy == x+1){swy = 0;}
			break;
		case 3:
			display (0,dot,0,dot,0x7c,dot,0,dot);
			if (~keyp5&ShortPress(5)){
				for (x = 0;x < 8;x++){
					SWs[x] = 0;LEDSW (x+1,1);}
				keyp5 = 1;
				SWCount = 0;
				SWMSEC = 0;
				SMOD = 1;
			}
			else if (~ShortPress(5)){keyp5 = 0;}
			break;	
		}break;
	case 4:
		show=1;
		switch(SMOD){
		case 1:
			TLED();
			if(~TRUN) dot = 1;
			display (TMIN/10,0,TMIN%10,dot,TSEC/10,0,TSEC%10,0);
			if (~keyp4&ShortPress(4)){
				if (TSEC == 0 & TMIN ==0){TACRUN = 0;}
				else {TRUN = ~TRUN;}
				keyp4 = 1;}
			else if (~ShortPress(4)){keyp4 = 0;}
			if (~keyp5&ShortPress(5)){TSEC += 30;keyp5 = 1;
				if (TSEC >= 60) {TSEC = 59;TMIN ++;
					if (TMIN == 60){TMIN = 59;}}}
			else if (~ShortPress(5)){keyp5 = 0;}break;
		case 2:
			TRUN = 0;
			display (TMIN/10,dot,TMIN%10,dot,TSEC/10,0,TSEC%10,0);
			if (~keyp4&ShortPress(4)){TMIN--;keyp4 = 1;
				if(TMIN == -1){TMIN=59;}}
			else if (~ShortPress(4)){keyp4 = 0;}
			if (~keyp5&ShortPress(5)){TMIN++;keyp5 = 1;
				if(TMIN == 60){TMIN=0;}}
			else if (~ShortPress(5)){keyp5 = 0;}break;
		case 3:
			TRUN = 0;
			display (TMIN/10,0,TMIN%10,0,TSEC/10,dot,TSEC%10,dot);
			if (~keyp4&ShortPress(4)){TSEC--;keyp4 = 1;
				if(TSEC == -1){TSEC =59;}}
			else if (~ShortPress(4)){keyp4 = 0;}
			if (~keyp5&ShortPress(5)){TSEC++;keyp5 = 1;
				if(TSEC == 60){TSEC=0;}}
			else if (~ShortPress(5)){keyp5 = 0;}break;
		case 4:
			display (0,dot,0,dot,0,dot,0x7c,dot);
				if (~keyp5&ShortPress(5)){keyp5 = 1;TMIN = 0;TSEC = 0;SMOD = 1;}
				else if (~ShortPress(5)){keyp5 = 0;}show=1;break;
	break;	
	}
}
for (x = 1;x<9;x++){LEDSW (x,1);}
}
}


>STCc52.c


#include<reg52.h>
#include<Timer.h>
#include<STCc52.h>
//硬件映射
sbit s1 = P2^4;
sbit s2 = P2^5;
sbit s3 = P2^6;
sbit s4 = P2^7;
sbit l1 = P1^0;
sbit l2 = P1^1;
sbit l3 = P1^2;
sbit l4 = P1^3;
sbit l5 = P1^4;
sbit l6 = P1^5;
sbit l7 = P1^6;
sbit l8 = P1^7;
sbit k2 = P3^4;
sbit k3 = P3^5;
sbit k4 = P3^6;
sbit k5 = P3^7;
bit stop =1;
#define uchar unsigned char
#define dula P0
#define wela P2
unsigned char code weitable[] = {0x8f,0x4f,0x2f,0x1f};
code unsigned char table[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
code unsigned char table1[] = {0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef};
//数显管控制
void display1 (uchar wei,uchar shu,uchar dot)//对应位显示对应数字,
{	
	wei = wei -1;
	wela |= 0xf0;
	if (dot == 1)	
		P0 = table1[shu];
	else
		P0 = table[shu];
	wela = wela&weitable[wei];
	Delay (5);	
}
//刷新数显管
void refresh(){
	s1 =0;s2 =0;s3 =0;s4 =0;Delay (100);
}

//四位数显管
void display (uchar a,uchar ad,uchar b,uchar bd,uchar c,uchar cd,uchar d,uchar dd)
{
	display1 (4,a,ad);
	display1 (3,b,bd);
	display1 (2,c,cd);
	display1 (1,d,dd);
}
		
//判断某个键是否短按
bit ShortPress(unsigned int KN)
{
	switch(KN){
	case 2:	
		if (k2 == 0){Delay(10);
			if (k2 == 0){while(k2 == 1){return 1;}}
			else{return 0;}}
		else{return 0;}
		break;
	case 3:								   
		if (k3 == 0){Delay(10);
			if (k3 == 0){while(k3 == 1){return 1;}}
			else{return 0;}}
		else{return 0;}
		break;
	case 4:
		if (k4 == 0){Delay(10);
			if (k4 == 0){while(k4 == 1){return 1;}}
			else{return 0;}}
		else{return 0;}
		break;
	case 5:
		if (k5 == 0){Delay(10);
			if (k5 == 0){while(k5 == 1){return 1;}}
			else{return 0;}}
		else{return 0;}
		break;
	default:return 0;break;
	}
}
//对应LED亮
void LEDSW (int Lwei,uchar LB)
{
	switch(Lwei){
	case 1: l1 = LB;break;
	case 2: l2 = LB;break;
	case 3: l3 = LB;break;
	case 4: l4 = LB;break;
	case 5: l5 = LB;break;
	case 6: l6 = LB;break;
	case 7: l7 = LB;break;
	case 8: l8 = LB;break;
	}
}

>>Timer.c

//时间函数
#include<Timer.h>
void Delay (unsigned int xms)
{
	unsigned int i,j;
	for (i=xms;i>0;i--)
		for (j = 112;j>0;j--);
}

>>STCC52.h

#define uchar unsigned char
void display1 (uchar wei,uchar shu,uchar dot);
void display (uchar a,uchar ad,uchar b,uchar bd,uchar c,uchar cd,uchar d,uchar dd);
bit ShortPress(unsigned int KN);
void LEDSW (int Lwei,uchar LB);
void refresh();


>>TIMER.h

//时间头文件
void Delay (unsigned int xms);


共同学习,共同提高!



评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值