找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2628|回复: 5
打印 上一主题 下一主题
收起左侧

第一次求助,51单片机定时器闹钟问题

[复制链接]
跳转到指定楼层
楼主
ID:220340 发表于 2017-7-20 10:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
这是我自己写的时钟程序,没有用芯片只用了51单片机自带的定时器设置的时钟,请问怎么在这个基础上加一个闹钟?求指点,谢谢。
uchar wei[4]={0XEf,0XDf,0XBf,0X7f};
uchar  LightSign= 0;        // 闪烁标志,=1 时灭, =0 时亮
sbit s1=P1^0;
sbit s2=P1^1;
sbit s3=P1^2;
uint a,b,c,d,e,f,t,i,m;
uint a1=0,b1=0,c1=0,d1=0,s1num=0,s2num=0,i1,k1;
void delay(uchar n)
{
  uchar i,j;
   for(i=0;i<n;i++)
   {
for(j=13;j>0;j--)
         { ;
         }
   }
}

void int0(void) interrupt 1
{

        TR0=0;        t++;
    m++;
        if(m==22)
    m=0;
        TH0=(65536-45872)/256;
        TL0=(65536-45872)%256;
        if(t==11)
        LightSign=s2num;
                  if(t==22)
                {t=0;
                f++;
                LightSign=0; }
                if(f==59)
                {
                f=0;
                d++;
                }
   if(d==10)
   {c++;
    d=0;
   }
   if(c==6)
   {b++;
   c=0;
   }
   if(b==10)
   {a++;
   b=0;
   }
   if(a==2&&b==4){a=b=0;}       
    e=1000*a+100*b+10*c+d;
   TR0=1;
        }

/*********************************************************************/
void Led(int date) //显示函数
{
uint w,x,y,z;
  w=date/1000;                         //求千位
  x=date%1000/100;                 //求百位
  y=date%100/10;                 //求十位
  z=date%10;                         //求个位
          P2=0XFF;
          if(LightSign==4)
                  P0= 0xFF;
          else
                  P0=seg7code[w];                 //主函数一直循环扫描 在t=11时闪烁,t=2
          P2=wei[0];
          delay(80);
          P2=0XFF;
          if(LightSign==3)
                  P0= 0xFF;
          else
       P0=seg7cade[x];
          P2=wei[1];
          delay(80);                                                               
          P2=0XFF;
          if(LightSign==2)
                  P0= 0xFF;
          else
             P0=seg7code[y];
          P2=wei[2];
          delay(80);
          P2=0XFF;
          if(LightSign==1)
                  P0= 0xFF;
         else
      P0=seg7code[z];
          P2=wei[3];
          delay(80);
          P2=0XFF;                  
}
void jishu()
{  i1=1;
   k1=1;


  while(k1)
  {
  Led(0);
  if(s3==0)
  {
  while(s3==0){;}
  k1=0;
  }
  if(s1==0)
  {while(s1==0){;}
  i1=0;k1=0;s1num=0;
  }
  }
  while(i1)
  {
    if(m==21)          //时间的修改
          {
          m=0;
          d1++;       
          }         
    if(d1==10)
          {c1++;
          d1=0;
          }
    if(c1==10)
     {
     b1++;
     c1=0;
     }
   if(b1==10)
   {a1++;
   b1=0;
   }
   if(a1==10){a1=b1=c1=d1=0;}
    if(s2==0)
   {
   while(s2==0){;}                //计数暂停
  // j1=t;
   k1=1;
    while(k1)
        {
//        t=j1;
//        t=0;
    e=1000*a1+100*b1+10*c1+d1;
     Led(e);
     if(s3==0){while(s3==0){;}k1=0;}
         if(s1==0){while(s1==0){;}i1=0;s1num=0;s2num=0;k1=0;}        //暂停后清零     计数后操作
    }
   }
   if(s1==0){while(s1==0){;}i1=0;s1num=0;s2num=0;}        ///直接清零
  e=1000*a1+100*b1+10*c1+d1;
  Led(e); }
  }
void keyscan()
  {
  if(s1==0)
  {         
         while (s1==0) {;}
         s1num++;
         if(s1num==3) {s1num=0;}
         if(s1num==2) {jishu();}
         if(s1num==0) {s2num=0;}
         if(s1num!=0) {s2num=1;}
}
   if(s2==0)
   {
   while (s2==0) {;}
   if(s1num==1)
   {
    s2num++;
        if(s2num==5){s2num=1;}       
        }}
   if(s3==0)        //
   {
   while (s3==0) {;}
   if(s1num==1)
   {
    if(s2num==1)d++;
        if(s2num==2)c++;
        if(s2num==3)b++;
        if(s2num==4)a++;
    e=1000*a+100*b+10*c+d;        }        }
         Led(e);
                 }       
void main()
{
   TMOD=0x01;
   TH0=(65536-45872)/256;
   TL0=(65536-45872)%256;
   EA=1;
   ET0=1;
   TR0=1;
   while(1)
   {   
     e=1000*a+100*b+10*c+d;
     keyscan();       
     Led(e);
}
   }         

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:7485 发表于 2017-7-20 15:40 | 只看该作者
你可以按需要设置一个时间,把实时时间和其比较,如相同,则向接蜂鸣器的IO输出一个低电平。
回复

使用道具 举报

板凳
ID:220340 发表于 2017-7-20 16:07 | 只看该作者
ahshmj 发表于 2017-7-20 15:40
你可以按需要设置一个时间,把实时时间和其比较,如相同,则向接蜂鸣器的IO输出一个低电平。

我思路也是这样,但是加了一个s4之后时钟和闹钟还是只能调一个。你可以帮我看一下我这个程序s4改该怎么加才可以设置闹钟吗,s4是用来设置闹钟的单独按键。
回复

使用道具 举报

地板
ID:220340 发表于 2017-7-20 18:27 | 只看该作者
求大神指点一二
回复

使用道具 举报

5#
ID:7485 发表于 2017-7-21 08:45 | 只看该作者
你可以设置s4的按键动作次数。例如:如果按键次数=1,进入调时程序,次数=2,进入定时程序。按键次数=3,.........
回复

使用道具 举报

6#
ID:220340 发表于 2017-7-22 10:32 | 只看该作者
ahshmj 发表于 2017-7-21 08:45
你可以设置s4的按键动作次数。例如:如果按键次数=1,进入调时程序,次数=2,进入定时程序。按键次数=3,.. ...

对 我也是这样想的 但是程序设置之按键达不到效果 而且设置闹钟后 设置时钟 闹钟设定的时间还在。。
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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