单片机初级应用:时钟+闹钟+秒表+定时器作者:AntoniotheFuture关键词:单片机,时钟,C语言,C51开发平台:Keil μVersion4平台版本上限:未知平台版本下限:未知开发语言:C简介: 用单片机实现一个具有四大功能(时钟,闹钟,秒表,定时器)的时钟,可以记录8组秒表,8个闹钟。不同的单片机需要作不同的设置>>led.c#include
#include
#include
#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
#include
#include
//硬件映射
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
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);
共同学习,共同提高!