标题: [求助]谁能帮我编写个时钟的程序啊 [打印本页]
作者: yyj531338365 时间: 2008-6-6 05:46
标题: [求助]谁能帮我编写个时钟的程序啊
要求:1.能显示时间和日期,而且是交替显示
2.带蜂鸣器的,每隔10分钟想下
作者: xb_crazyman 时间: 2008-6-9 19:15
上学期写的一个时钟程序
可能很多可以优化的
不过你可以参考一下
#include<reg51.h>
unsigned char shows1[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
unsigned char shows2[10]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef};
unsigned char i,j,num,temp;
unsigned int hour,minute,second,tens,units,second1,minute1,hour1;
void delay(unsigned int n)
{
for(i=n;i>0;i--)
for(j=0;j<110;j++);
}
void showtime(int x)
{
tens=x/10;
units=x%10;
}
void debughour()
{
if(P3==0xbf)
{
delay(1);
while(P3==0xbf);
hour++;
if(hour==24)
hour=0;
showtime(hour);
P0=shows1[tens];
P2=0x01;
delay(1);
P2=0x00;
P0=shows2[units];
P2=0x02;
delay(1);
P2=0x00;
}
if(P3==0xdf)
{
delay(1);
while(P3==0xdf);
hour--;
if(hour==-1)
hour=23;
showtime(hour);
P0=shows1[tens];
P2=0x01;
delay(1);
P2=0x00;
P0=shows2[units];
P2=0x02;
delay(1);
P2=0x00;
}
if(P3==0x7f)
{
delay(1);
while(P3==0x7f);
temp++;
}
}
void debugminute()
{
if(P3==0xbf)
{
delay(1);
while(P3==0xbf);
minute++;
if(minute==60)
minute=0;
showtime(minute);
P0=shows1[tens];
P2=0x04;
delay(1);
P2=0x00;
P0=shows2[units];
P2=0x08;
delay(1);
P2=0x00;
}
if(P3==0xdf)
{
delay(1);
while(P3==0xdf);
minute--;
if(minute==-1)
minute=59;
showtime(minute);
P0=shows1[tens];
P2=0x04;
delay(1);
P2=0x00;
P0=shows2[units];
P2=0x08;
delay(1);
P2=0x00;
}
if(P3==0x7f)
{
delay(1);
while(P3==0x7f);
temp++;
}
}
void keyscan1()
{
while(temp<=2)
{
if(P3==0x7f)
{
delay(1);
while(P3==0x7f);
temp++;
}
TR0=0;
showtime(second);
P0=shows1[tens];
P2=0x10;
delay(1);
P2=0x00;
P0=shows1[units];
P2=0x20;
delay(1);
P2=0x00;
showtime(minute);
P0=shows1[tens];
P2=0x04;
delay(1);
P2=0x00;
P0=shows2[units];
P2=0x08;
delay(1);
P2=0x00;
showtime(hour);
P0=shows1[tens];
P2=0x01;
delay(1);
P2=0x00;
P0=shows2[units];
P2=0x02;
delay(1);
P2=0x00;
if(temp==1)
debughour();
if(temp==2)
debugminute();
if(temp==3)
{
TR0=1;
temp=0;
break;
}
}
}
void keyscan2()
{
while(temp<=1)
{
if(P3==0xef)
{
delay(1);
while(P3==0xef);
temp++;
}
if(num==18)
{
num=0;
P1=~P1;
second1++;
if(second1==60)
{
second1=0;
minute1++;
if(minute1==60)
{
minute1=0;
hour1++;
if(hour1==100)
hour1=0;
}
}
second++;
if(second==60)
{
second=0;
minute++;
if(minute==60)
{
minute=0;
hour++;
if(hour==24)
hour=0;
}
}
}
showtime(second1);
P0=shows1[tens];
P2=0x10;
delay(1);
P2=0x00;
P0=shows1[units];
P2=0x20;
delay(1);
P2=0x00;
showtime(minute1);
P0=shows1[tens];
P2=0x04;
delay(1);
P2=0x00;
P0=shows2[units];
P2=0x08;
delay(1);
P2=0x00;
showtime(hour1);
P0=shows1[tens];
P2=0x01;
delay(1);
P2=0x00;
P0=shows2[units];
P2=0x02;
delay(1);
P2=0x00;
if(temp==2)
{
temp=0;
hour1=0;
minute1=0;
second1=0;
break;
}
}
}
void runtime()
{
if(num==18)
{
num=0;
P1=~P1;
second++;
if(second==60)
{
second=0;
minute++;
if(minute==60)
{
minute=0;
hour++;
if(hour==24)
hour=0;
}
}
}
}
main()
{
TMOD=0x01;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
EA=1;
ET0=1;
TR0=1;
P3=0xff;
temp=0;
hour=3;
minute=58;
while(1)
{
runtime();
showtime(second);
P0=shows1[tens];
P2=0x10;
delay(1);
P2=0x00;
P0=shows1[units];
P2=0x20;
delay(1);
P2=0x00;
showtime(minute);
P0=shows1[tens];
P2=0x04;
delay(1);
P2=0x00;
P0=shows2[units];
P2=0x08;
delay(1);
P2=0x00;
showtime(hour);
P0=shows1[tens];
P2=0x01;
delay(1);
P2=0x00;
P0=shows2[units];
P2=0x02;
delay(1);
P2=0x00;
if(P3==0x7f)
keyscan1();
if(P3==0xef)
keyscan2();
}
}
void timer0() interrupt 1 using 1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
num++;
}
作者: hanguijia 时间: 2013-10-5 22:34
#include<reg52.h> #define uchar unsigned char #define uint unsigned int uchar code table[]=" 2013-09-23 MON"; //设定开始显示的时间 uchar code table1[]=" 00:00:01"; uchar code table2[7][3]= {{"MON"},{"TUE"},{"WED"},{"THU"},{"FRI"},{"SAT"},{"SUN"}}; //定义二维字符数组 sbit wr=P1^1; // 1602液晶的读/写端 sbit lcden=P1^2; // 1602液晶使能端 sbit lcdrs=P1^0; // 1602液晶命令/数据端 sbit key1=P3^2; // 声明s1按键时间调整 sbit key2=P3^3; // 声明s2按键+1 sbit key3=P3^4; // 声明s3按键-1 sbit key4=P3^5; // 声明s4按键闹钟调整 sbit beep=P1^4; // 声明蜂鸣器 uchar num1,shi=00,fen=00,miao=01,yue=9,ri=23,shi1,fen1,miao1,keynum1,week; //定义时分秒变量 uint nian=2013; //定义年变量 void delayms(uint x) { uint i,j; for(i=x;i>0;i--) //定义带参数延时函数 for(j=110;j>0;j--); } void write_com(uchar com) //1602液晶写指令函数 { wr=0; lcdrs=0; P0=com; delayms(1); lcden=1; delayms(1); lcden=0; } void write_date(uchar date) //1602液晶写数据函数 { wr=0; lcdrs=1; P0=date; delayms(1); lcden=1; delayms(1); lcden=0; } void write_addate1(uchar add,uint date) //定义显示年的函数 { uint qian; uchar bai,shi,ge; qian=date/1000; bai=date%1000/100; shi=date%1000%100/10; ge=date%10; write_com(add+0x80); write_date(0x30+qian); write_date(0x30+bai); write_date(0x30+shi); write_date(0x30+ge); } void write_addate2(uchar add,uchar date) //定义显示月、日、时、分、秒函数 { uchar shi,ge; shi=date/10; ge=date%10; write_com(add+0x80); write_date(0x30+shi); write_date(0x30+ge); } void write_rq(uchar i) //定义显示星期的函数 { uchar x; for(x=0;x<3;x++) { write_date(table2[i][x]); delayms(1); } } void init () //定义初始化函数 { TMOD=0x01; // 定时器0工作方式为11.0592M晶振 16位 TH0=(65536-45566)/256; // 装初值 TL0=(65536-45566)%256; EA=1; // 开总中断 ET0=1; // 开定时器0中断 write_com(0x38); // 设置16*2显示,5*7点阵,8位数据口 write_com(0x06); // 写一个字符后地址指针加1 write_com(0x0c); // 设置开显示,不显示光标 write_com(0x01); // 显示清0,数据清0 write_com(0x80); // 使指针指向第1行第1列 } void keyscan() // 定义按键函数 { uchar keynum; if(key1==0) //s1按键被按下 { delayms(3); //去抖延时 if(key1==0) //确认s4按键被按下,进入调时间模式 { keynum++; while(!key1); //松手检测 } if(keynum==1) //s1按下一次 { TR0=0; //关闭定时器0 write_com(0x81); //指针指向第1行2列 write_com(0x0f); //开启光标显示,光标闪烁 } if(keynum==2) { write_com(0x86); //光标跳到月份 } if(keynum==3) { write_com(0x89); //光标跳到日 } if(keynum==4) { write_com(0x8c); //光标跳到星期 } if(keynum==5) { write_com(0xc4); //光标跳到时 } if(keynum==6) { write_com(0xc7); //光标跳到分 } if(keynum==7) { write_com(0xca); //光标跳到秒 } if(keynum==8) { keynum=0; //退出调时间模式 TR0=1; //开启定时器0 write_com(0x0c); //关闭光标显示 } } if(keynum) //当进入调时间模式时 { if(key2==0) //s2按键按下 { delayms(3); //去抖延时 if(key2==0) { if(keynum==1) { nian++; //s2每按下一次年份加1 if(nian==10000) // 加满清0 nian=0; write_addate1(1,nian); // 显示年份 write_com(0x81); //写完数据指针指向年份原来位置 } if(keynum==2) { yue++; //s2每按下一次月份加1 if(yue==13) yue=0; //加满清0 write_addate2(6,yue); //显示月份 write_com(0x86); //写完数据指针指向月份原来位置 } if(keynum==3) { ri++; if(yue==1||yue==3||yue==5||yue==7||yue==8||yue==10||yue==12) //1,3,5,7,8,10,12月有31天 if(ri==32) //加满还原 ri=1; if(yue==4||yue==6||yue==9||yue==11) //4,6,9,11月有30天 if(ri==31) ri=1; if(yue==2&&((nian%4==0&&nian%100!=0)||nian%400==0)) //闰年2月有30天 if(ri==30) ri=1; if(yue==2&&(nian%4!=0)||(nian%100==0&&nian%400!=0)) //非闰年2月有31天 if(ri==29) ri=1; write_addate2(9,ri); //显示日 write_com(0x89); //写完数据指针指向日原来位置 } if(keynum==4) { week++; //s2每按下一次星期加1 if(week==7) //加满还原 week=0; write_rq(week); //显示星期 write_com(0x8c); //写完数据指针指向星期原来位置 } if(keynum==5) { shi++; //s2每按下一次时加1 if(shi==24) shi=0; //加满还原 write_addate2(0x44,shi); //显示时 write_com(0xc4); //写完数据指针指向时原来位置 } if(keynum==6) { fen++; //s2每按下一次分加1 if(fen==60) fen=0; //加满还原 write_addate2(0x47,fen); //显示分 write_com(0xc7); //写完数据指针指向分原来位置 } if(keynum==7) { miao++; //s2每按下一次秒加1 if(miao==60) miao=0; //加满还原 write_addate2(0x4a,miao); //显示秒 write_com(0xca); //写完数据指针指向秒原来位置 } while(!key2); //松手检测 } } if(key3==0) { delayms(3); if(key3==0) { //s3按下时减1 if(keynum==1) { nian--; if(nian==-1) nian=9999; write_addate1(1,nian); write_com(0x81); } if(keynum==2) { yue--; if(yue==-1) yue=12; write_addate2(6,yue); write_com(0x86); } if(keynum==3) { ri--; if(ri==0) { if(yue==1||yue==3||yue==5||yue==7||yue==8||yue==10||yue==12) ri=31; if(yue==4||yue==6||yue==9||yue==11) ri=30; if(yue==2&&((nian%4==0&&nian%100!=0)||nian%400==0)) ri=29; if(yue==2&&(nian%4!=0)||(nian%100==0&&nian%400!=0)) ri=28; } write_addate2(9,ri); write_com(0x89); } if(keynum==4) { week--; if(week==-1) week=6; write_rq(week); write_com(0x8c); } if(keynum==5) { shi--; if(shi==-1) shi=23; write_addate2(0x44,shi); write_com(0xc4); } if(keynum==6) { fen--; if(fen==-1) fen=59; write_addate2(0x47,fen); write_com(0xc7); } if(keynum==7) { miao--; if(miao==-1) miao=59; write_addate2(0x4a,miao); write_com(0xca); } while(!key3); //松手检测 } } } if(key4==0) //s4被按下进入调闹钟模式 { delayms(3); if(key4==0) { keynum1++; while(!key4); } if(keynum1==1) { write_com(0x01); //清屏,指针清0 write_com(0xc6); //在时分之间显示“:” write_date(':'); write_com(0xc9); //在分秒之间显示“:” write_date(':'); write_com(0x0f); //开启光标 write_com(0xc4); //光标指向时 } if(keynum1==2) { write_com(0xc7); //光标指向分 } if(keynum1==3) { write_com(0xca); //光标指向秒 } if(keynum1==4) { keynum1=0; write_com(0x0c); //关闭光标 } } if(keynum1) { if(key2==0) //s2按下加1 { delayms(3); if(key2==0) { if(keynum1==1) { shi1++; if(shi1==24) shi1=0; write_addate2(0x44,shi1); write_com(0xc4); } if(keynum1==2) { fen1++; if(fen1==60) fen1=0; write_addate2(0x47,fen1); write_com(0xc7); } if(keynum1==3) { miao1++; if(miao1==60) miao1=0; write_addate2(0x4a,miao1); write_com(0xca); } while(!key2); } } if(key3==0) //s3每按一次减1 { delayms(3); if(key3==0) { if(keynum1==1) { shi1--; if(shi1==-1) shi1=23; write_addate2(0x44,shi1); write_com(0xc4); } if(keynum1==2) { fen1--; if(fen1==-1) fen1=59; write_addate2(0x47,fen1); write_com(0xc7); } if(keynum1==3) { miao1--; if(miao1==-1) miao1=59; write_addate2(0x4a,miao1); write_com(0xca); } while(!key3); //松手检测 } } } } void main() { uchar num; init(); for(num=0;num<15;num++) { write_date(table[num]); delayms(5); } //显示初始时间 write_com(0xc0); for(num=0;num<12;num++) { write_date(table1[num]); delayms(5); } TR0=1; //开启定时器0 while(1) { if(shi==shi1&&fen==fen1&&miao==miao1) //闹钟到了蜂鸣器响 beep=0; if(shi==shi1&&fen==fen1&&miao==miao1+30) //闹钟到了蜂鸣器响 beep=1; keyscan(); //扫描键盘 } } void time() interrupt 1 //中断函数 { TH0=(65536-45566)/256; TL0=(65536-45566)%256; //进入中断装初值 num1++; if(num1==20) //一秒到了 { num1=0; //清0 miao++; if(miao==60) //一分到了 { miao=0; fen++; } if(!keynum1) write_addate2(0x4a,miao); //当调闹钟模式按下时不显示当前时间 if(fen==60) { fen=0; shi++; } if(!keynum1) write_addate2(0x47,fen); //当调闹钟模式按下时不显示当前时间 if(shi==24) { shi=0; ri++; week++; } if(!keynum1) write_addate2(0x44,shi); //当调闹钟模式按下时不显示当前时间 if(yue==1||yue==3||yue==5||yue==7||yue==8||yue==10||yue==12) if(ri==32) { ri=1; yue++; } if(yue==4||yue==6||yue==9||yue==11) if(ri==31) { ri=1; yue++; } if(yue==2&&((nian%4==0&&nian%100!=0)||nian%400==0)) if(ri==30) { ri=1; yue++; } if(yue==2&&(nian%4!=0)||(nian%100==0&&nian%400!=0)) if(ri==29) { ri=1; yue++; } if(!keynum1) write_addate2(9,ri); //当调闹钟模式按下时不显示当前时间 if(week==7) week=0; if(!keynum1) //当调闹钟模式按下时不显示当前时间 { write_com(0x8c); write_rq(week); } if(yue==13) { yue=0; nian++; } if(!keynum1) //当调闹钟模式按下时不显示当前时间 { write_addate2(6,yue); write_com(0x88); write_date('-'); } if(nian==10000) nian=0; if(!keynum1) { write_addate1(1,nian); //当调闹钟模式按下时不显示当前时间 write_com(0x85); write_date('-'); } } }
作者: 13620819446 时间: 2013-10-13 23:47
支持支持!!
欢迎光临 (http://www.51hei.com/bbs/) |
Powered by Discuz! X3.1 |