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

2019-04-15 16:13发布

单片机初级应用:时钟+闹钟+秒表+定时器作者: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);
共同学习,共同提高!