找回密码
 立即注册

QQ登录

只需一步,快速开始

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

多功能电子时钟仿真及代码

[复制链接]
跳转到指定楼层
楼主
多功能电子时钟仿真原理图:


  1. /**************************/
  2. /**************************/
  3. /****   电子时钟       ****/
  4. /**************************/
  5. /**************************/

  6. #include<reg52.h>
  7. #define uint unsigned int
  8. #define uchar unsigned char
  9. char miao,fen,shi;
  10. bit flag, flag_time;
  11. char set_miao=0,set_fen=0;set_shi=12; //闹钟初始化
  12. uchar slnum;

  13. sbit s1=P3^0;                                         //功能键
  14. sbit s2=P3^1;                                         //加键
  15. sbit s3=P3^2;                                         //减键
  16. sbit s4=P3^3;                                         //闹钟设置


  17. sbit led1=P1^0;                                         //调整秒钟的指示灯
  18. sbit led2=P1^1;                                         //调整分钟的指示灯
  19. sbit led3=P1^2;                                         //调整时钟的指示灯
  20. sbit led4=P1^3;                                         //闹钟设置指示灯
  21. sbit BUZZ =P1^4;                                 //报警

  22. sbit wei0=P2^0;                                         //定义8个数码管段选
  23. sbit wei1=P2^1;
  24. sbit wei2=P2^2;
  25. sbit wei3=P2^3;
  26. sbit wei4=P2^4;
  27. sbit wei5=P2^5;
  28. sbit wei6=P2^6;
  29. sbit wei7=P2^7;

  30. uchar code table[]={
  31.                   0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,
  32.                                   0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x40};                //共阴数码管编码

  33. void delay(uint z)                                  //延时函数
  34. {
  35. uint x,y;
  36. for(x=z;x>0;x--)
  37.     for(y=125;y>0;y--);

  38. }

  39. void start()                                         //定时器初始化
  40. {
  41. TMOD=0x11;
  42. TH0=(65536-50000)/256;                           //时间累加
  43. TH0=(65536-50000)%256;
  44. TH1=(65536-50000)/256;                           //闹钟设置
  45. TH1=(65536-50000)%256;
  46. EA=1;
  47. ET0=1;
  48. ET1=1;
  49. TR0=1;
  50. TR1=0;                                                           //关闭定时器
  51. }

  52. void display(char miao,char fen, char shi)           //显示子程序,分别显示时,分,秒
  53. {
  54.   P0=table[miao%10];
  55.   wei7=0;
  56.   delay(1);
  57.   wei7=1;
  58.   P0=0xff;

  59.   P0=table[miao/10];
  60.   wei6=0;
  61.   delay(1);
  62.   wei6=1;
  63.   P0=0xff;

  64.   P0=table[16];
  65.   wei5=0;
  66.   delay(1);
  67.   wei5=1;
  68.   P0=0xff;

  69.   P0=table[fen%10];
  70.   wei4=0;
  71.   delay(1);
  72.   wei4=1;
  73.   P0=0xff;

  74.   P0=table[fen/10];
  75.   wei3=0;
  76.   delay(1);
  77.   wei3=1;
  78.   P0=0xff;

  79.   P0=table[16];
  80.   wei2=0;
  81.   delay(1);
  82.   wei2=1;
  83.   P0=0xff;

  84.   P0=table[shi%10];
  85.   wei1=0;
  86.   delay(1);
  87.   wei1=1;
  88.   P0=0xff;

  89.   P0=table[shi/10];
  90.   wei0=0;
  91.   delay(1);
  92.   wei0=1;
  93.   P0=0xff;
  94. }

  95. void keyscan()                   //功能键
  96. {
  97. if(s1==0)
  98. {
  99.   delay(5);
  100.   if(s1==0)                            //确认功能按下
  101.   {
  102.    while(!s1);                  
  103.    slnum++;                           //功能键按下次数记录
  104.    if(slnum==1)                   //功能键第一次按下调整“秒钟”
  105.    {
  106.            if(flag)
  107.             TR0=1;                        //开定时器
  108.         else
  109.             TR0=0;                        //关闭定时器
  110.                 led1=0;
  111.    }


  112.    if(slnum==2)
  113.    {
  114.                 led2=0;
  115.                 led1=1;
  116.    }

  117.    if(slnum==3)
  118.    {
  119.         led3=0;
  120.                 led2=1;
  121.                 led1=1;
  122.    }

  123.         if(slnum==4)
  124.    {
  125.                 led3=1;
  126.                 led2=1;
  127.                 led1=1;
  128.                 slnum=0;
  129.                 TR0=1;
  130.    }
  131.   }
  132. }
  133. }

  134. void time()
  135. {
  136.    if(slnum!=0)
  137.    {
  138.       if(s2==0)
  139.            {
  140.            delay(5);
  141.            if(s2==0)
  142.            {
  143.            while(!s2);
  144.            switch(slnum)
  145.            {
  146.               case 1:
  147.                   miao++;
  148.                   if(miao==60)
  149.                   miao=0;
  150.                   break;
  151.                    case 2:
  152.                   fen++;
  153.                   if(fen==60)
  154.                  fen=0;
  155.                   break;
  156.                    case 3:
  157.                   shi++;
  158.                   if(shi==24)
  159.                   shi=0;
  160.                   break;
  161.                       }
  162.                     }
  163.                   }

  164.           if(s3==0)
  165.            {
  166.            delay(5);
  167.            if(s3==0)
  168.            {
  169.            while(!s3);
  170.            switch(slnum)
  171.            {
  172.               case 1:
  173.                   miao--;
  174.                   if(miao<0)
  175.                   miao=59;
  176.                   break;
  177.                    case 2:
  178.                   fen--;
  179.                   if(fen<0)
  180.                  fen=59;
  181.                   break;
  182.                    case 3:
  183.                   shi--;
  184.                   if(shi<0)
  185.                   shi=23;
  186.                   break;
  187.                       }
  188.                     }
  189.                   }
  190.                   }
  191.                   }
  192.          void set_time()
  193.          {
  194.             if(slnum==0)
  195.                  {
  196.                    if(s4==0)
  197.                    {
  198.                       delay(5);
  199.                           if(s4==0)
  200.                           {
  201.                           while(!s4);
  202.                           led4=~led4;
  203.                           flag=~flag;
  204.                           }
  205.                           }
  206.                           }
  207.                           if(flag)
  208.                           {
  209.                           if(slnum!=0)
  210.                           {
  211.                           if(s2==0)
  212.                           {
  213.                           delay(5);
  214.                           if(s2==0)
  215.                           {
  216.                           while(!s2);
  217.                           switch(slnum)
  218.                           {
  219.                           case 1:
  220.                   set_miao++;
  221.                   if(set_miao==60)
  222.                   set_miao=0;
  223.                   break;
  224.                    case 2:
  225.                   set_fen++;
  226.                   if(set_fen==60)
  227.                  set_fen=0;
  228.                   break;
  229.                    case 3:
  230.                   set_shi++;
  231.                   if(set_shi==24)
  232.                   set_shi=0;
  233.                   break;
  234.                   }
  235.                   }
  236.                   }
  237.                   if(s3==0)
  238.                   {
  239.                    delay(5);
  240.                           if(s3==0)
  241.                           {
  242.                           while(!s3);
  243.                           switch(slnum)
  244.                           {
  245.                           case 1:
  246.                   set_miao--;
  247.                   if(set_miao<0)
  248.                   set_miao=59;
  249.                   break;
  250.                    case 2:
  251.                   set_fen++;
  252.                   if(set_fen<0)
  253.                  set_fen=59;
  254.                   break;
  255.                    case 3:
  256.                   set_shi--;
  257.                   if(set_shi<0)
  258.                   set_shi=23;
  259.                   break;
  260.                   }
  261.                   }
  262.                   }
  263.                   }
  264.                   }
  265.                   }
  266.          void main()
  267.          {
  268.          start();
  269.          while(1)
  270.          {
  271.          keyscan();
  272.          time();
  273.          if(!flag)
  274.          {
  275.          display(miao,fen,shi);
  276.          }
  277.          else
  278.          {
  279.          display(set_miao,set_fen,set_shi);
  280.          }
  281.          if(miao==set_miao&&fen==set_fen&&shi==set_shi)
  282.            {
  283.              TR1=1;
  284.                  }
  285.                  if(flag_time)
  286.                  {
  287.                    TR1=0;
  288.                    BUZZ=1;
  289.                    flag_time=0;
  290.                    }
  291.                    set_time();
  292.                    }
  293.                    }
  294.          void time_0()interrupt 1
  295.          {
  296.             uchar aa;
  297.                 TH0=(65536-50000)/256;
  298.         TL0=(65536-50000)%256;
  299.                 aa++;
  300.                 if(aa==20)
  301.                 {
  302.                 aa=0;
  303.                 miao++;
  304.                 if(miao>=60)
  305.                 {
  306.                 miao=0;
  307.                 fen++;
  308.                 if(fen>=60)
  309.                 {
  310.                   fen=0;
  311.                   shi++;
  312.                   if(shi>=24)
  313.                   {
  314.                   shi=0;
  315.                   }
  316.                   }
  317.                   }
  318.                   }
  319.                   }
  320.    void time_1()interrupt 3
  321.    {
  322.       uchar bz_time;
  323.            TH1=(65536-50000)/256;
  324.         TL1=(65536-50000)%256;
  325.            bz_time++;
  326.            if(bz_time==200)
  327.                 {
  328.                 bz_time=0;
  329.                 flag_time=1;
  330.                 }
  331.                 BUZZ=~BUZZ;
  332.                 }  
  333.                           



复制代码



电子时钟.zip

69.77 KB, 下载次数: 59, 下载积分: 黑币 -5

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

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

使用道具 举报

沙发
ID:74868 发表于 2017-2-19 16:18 | 只看该作者
不错功能比较多
回复

使用道具 举报

板凳
ID:140489 发表于 2017-2-20 11:10 | 只看该作者
原来的程序,设置调整的时候数码管不闪烁,我在原来的程序上修改了一下,现在调整的时候对应的数码管闪烁,这样比较直观的知道调整的是时、分、秒。仿真通过  

/**************************/
/**************************/
/****   电子时钟       ****/
/**************************/
/**************************/

#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
char miao,fen,shi;
bit flag, flag_time;
char set_miao=0,set_fen=0;set_shi=12; //闹钟初始化
uchar slnum,snum,fnum,mnum;

sbit s1=P3^0;                                         //功能键
sbit s2=P3^1;                                         //加键
sbit s3=P3^2;                                         //减键
sbit s4=P3^3;                                         //闹钟设置


sbit led1=P1^0;                                         //调整秒钟的指示灯
sbit led2=P1^1;                                         //调整分钟的指示灯
sbit led3=P1^2;                                         //调整时钟的指示灯
sbit led4=P1^3;                                         //闹钟设置指示灯
sbit BUZZ =P1^4;                                 //报警

sbit wei0=P2^0;                                         //定义8个数码管段选
sbit wei1=P2^1;
sbit wei2=P2^2;
sbit wei3=P2^3;
sbit wei4=P2^4;
sbit wei5=P2^5;
sbit wei6=P2^6;
sbit wei7=P2^7;

uchar code table[]={
                  0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,
                                  0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x40};                //共阴数码管编码

void delay(uint z)                                  //延时函数
{
uint x,y;
for(x=z;x>0;x--)
    for(y=125;y>0;y--);

}

void start()                                         //定时器初始化
{
TMOD=0x11;
TH0=(65536-50000)/256;                           //时间累加
TH0=(65536-50000)%256;
TH1=(65536-50000)/256;                           //闹钟设置
TH1=(65536-50000)%256;
EA=1;
ET0=1;
ET1=1;
TR0=1;
TR1=0;                                                           //关闭定时器
}

void display(char miao,char fen, char shi)           //显示子程序,分别显示时,分,秒
{

if(slnum==0)
{
snum=30;
fnum=30;
mnum=30;
}

if(slnum==1)
{
snum=30;
fnum=30;
mnum++;
}

if(slnum==2)
{
snum=30;
fnum++;
mnum=30;
}

if(slnum==3)
{
snum++;
fnum=30;
mnum=30;
}


if(mnum>=30)   //调整时,秒闪烁
{
  P0=table[miao%10];
  wei7=0;
  delay(1);
  wei7=1;
  P0=0xff;

  P0=table[miao/10];
  wei6=0;
  delay(1);
  wei6=1;
  P0=0xff;

  if(mnum==60)
          mnum=0;
}
  
  P0=table[16];
  wei5=0;
  delay(1);                                                                                                                                                                                                                       
  wei5=1;
  P0=0xff;

if(fnum>=30)   //调整时,分钟闪烁
{
  P0=table[fen%10];
  wei4=0;
  delay(1);
  wei4=1;
  P0=0xff;

  P0=table[fen/10];
  wei3=0;
  delay(1);
  wei3=1;
  P0=0xff;
        if(fnum==60)
                fnum=0;

}
  
  P0=table[16];
  wei2=0;
  delay(1);
  wei2=1;
  P0=0xff;

if(snum>=30)          //调整时,小时闪烁
{
  P0=table[shi%10];
  wei1=0;
  delay(1);
  wei1=1;
  P0=0xff;

  P0=table[shi/10];
  wei0=0;
  delay(1);
  wei0=1;
  P0=0xff;
        if(snum==60)
                snum=0;

  }
}

void keyscan()                   //功能键
{
if(s1==0)
{
  delay(5);
  if(s1==0)                            //确认功能按下
  {
   while(!s1);                  
   slnum++;                           //功能键按下次数记录
   if(slnum==1)                   //功能键第一次按下调整“秒钟”
   {
           if(flag)
            TR0=1;                        //开定时器
        else
            TR0=0;                        //关闭定时器
                led1=0;
   }


   if(slnum==2)
   {
                led2=0;
                led1=1;
   }

   if(slnum==3)
   {
        led3=0;
                led2=1;
                led1=1;
   }

        if(slnum==4)
   {
                led3=1;
                led2=1;
                led1=1;
                slnum=0;
                TR0=1;
   }
  }
}
}

void time()
{
   if(slnum!=0)
   {
      if(s2==0)
           {
           delay(5);
           if(s2==0)
           {
           while(!s2);
           switch(slnum)
           {
              case 1:
                  miao++;
                  if(miao==60)
                  miao=0;
                  break;
                   case 2:
                  fen++;
                  if(fen==60)
                 fen=0;
                  break;
                   case 3:
                  shi++;
                  if(shi==24)
                  shi=0;
                  break;
                      }
                    }
                  }

          if(s3==0)
           {
           delay(5);
           if(s3==0)
           {
           while(!s3);
           switch(slnum)
           {
              case 1:
                  miao--;
                  if(miao<0)
                  miao=59;
                  break;
                   case 2:
                  fen--;
                  if(fen<0)
                 fen=59;
                  break;
                   case 3:
                  shi--;
                  if(shi<0)
                  shi=23;
                  break;
                      }
                    }
                  }
                  }
                  }
         void set_time()
         {
            if(slnum==0)
                 {
                   if(s4==0)
                   {
                      delay(5);
                          if(s4==0)
                          {
                          while(!s4);
                          led4=~led4;
                          flag=~flag;
                          }
                          }
                          }
                          if(flag)
                          {
                          if(slnum!=0)
                          {
                          if(s2==0)
                          {
                          delay(5);
                          if(s2==0)
                          {
                          while(!s2);
                          switch(slnum)
                          {
                          case 1:
                  set_miao++;
                  if(set_miao==60)
                  set_miao=0;
                  break;
                   case 2:
                  set_fen++;
                  if(set_fen==60)
                 set_fen=0;
                  break;
                   case 3:
                  set_shi++;
                  if(set_shi==24)
                  set_shi=0;
                  break;
                  }
                  }
                  }
                  if(s3==0)
                  {
                   delay(5);
                          if(s3==0)
                          {
                          while(!s3);
                          switch(slnum)
                          {
                          case 1:
                  set_miao--;
                  if(set_miao<0)
                  set_miao=59;
                  break;
                   case 2:
                  set_fen++;
                  if(set_fen<0)
                 set_fen=59;
                  break;
                   case 3:
                  set_shi--;
                  if(set_shi<0)
                  set_shi=23;
                  break;
                  }
                  }
                  }
                  }
                  }
                  }
         void main()
         {
         start();
         while(1)
         {
         keyscan();
         time();
         if(!flag)
         {
         display(miao,fen,shi);
         }
         else
         {
         display(set_miao,set_fen,set_shi);
         }
         if(miao==set_miao&&fen==set_fen&&shi==set_shi)
           {
             TR1=1;
                 }
                 if(flag_time)
                 {
                   TR1=0;
                   BUZZ=1;
                   flag_time=0;
                   }
                   set_time();
                   }
                   }
         void time_0()interrupt 1
         {
            uchar aa;
                TH0=(65536-50000)/256;
        TL0=(65536-50000)%256;
                aa++;
                if(aa==20)
                {
                aa=0;
                miao++;
                if(miao>=60)
                {
                miao=0;
                fen++;
                if(fen>=60)
                {
                  fen=0;
                  shi++;
                  if(shi>=24)
                  {
                  shi=0;
                  }
                  }
                  }
                  }
                  }
   void time_1()interrupt 3
   {
      uchar bz_time;
           TH1=(65536-50000)/256;
        TL1=(65536-50000)%256;
           bz_time++;
           if(bz_time==200)
                {
                bz_time=0;
                flag_time=1;
                }
                BUZZ=~BUZZ;
                }  
                          


回复

使用道具 举报

地板
ID:140489 发表于 2017-2-20 11:17 | 只看该作者
显示函数修改一下,调整时相应的数码管闪烁

void display(char miao,char fen, char shi)           //显示子程序,分别显示时,分,秒
{

if(slnum==0)
{
snum=30;
fnum=30;
mnum=30;
}

if(slnum==1)
{
snum=30;
fnum=30;
mnum++;
}

if(slnum==2)
{
snum=30;
fnum++;
mnum=30;
}

if(slnum==3)
{
snum++;
fnum=30;
mnum=30;
}


if(mnum>=30)   //调整时,秒闪烁
{
  P0=table[miao%10];
  wei7=0;
  delay(1);
  wei7=1;
  P0=0xff;

  P0=table[miao/10];
  wei6=0;
  delay(1);
  wei6=1;
  P0=0xff;

  if(mnum==60)
          mnum=0;
}
  
  P0=table[16];
  wei5=0;
  delay(1);                                                                                                                                                                                                                       
  wei5=1;
  P0=0xff;

if(fnum>=30)   //调整时,分钟闪烁
{
  P0=table[fen%10];
  wei4=0;
  delay(1);
  wei4=1;
  P0=0xff;

  P0=table[fen/10];
  wei3=0;
  delay(1);
  wei3=1;
  P0=0xff;
        if(fnum==60)
                fnum=0;

}
  
  P0=table[16];
  wei2=0;
  delay(1);
  wei2=1;
  P0=0xff;

if(snum>=30)          //调整时,小时闪烁
{
  P0=table[shi%10];
  wei1=0;
  delay(1);
  wei1=1;
  P0=0xff;

  P0=table[shi/10];
  wei0=0;
  delay(1);
  wei0=1;
  P0=0xff;
        if(snum==60)
                snum=0;

  }
}
回复

使用道具 举报

5#
ID:165792 发表于 2017-2-21 22:29 | 只看该作者
不错功能比较多
回复

使用道具 举报

6#
ID:170753 发表于 2017-4-19 19:59 来自手机 | 只看该作者
感谢楼主分享
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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