找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 7659|回复: 3
收起左侧

[求助]谁能帮我编写个时钟的程序啊

[复制链接]
ID:2567 发表于 2008-6-6 05:46 | 显示全部楼层 |阅读模式
要求:1.能显示时间和日期,而且是交替显示
        2.带蜂鸣器的,每隔10分钟想下
回复

使用道具 举报

ID:7 发表于 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++;
}


回复

使用道具 举报

ID:55629 发表于 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('-');                                                                                          }                                                                                                                                   }                                                         }                                                                                                                                                                 
回复

使用道具 举报

ID:52286 发表于 2013-10-13 23:47 | 显示全部楼层
支持支持!!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表