找回密码
 立即注册

QQ登录

只需一步,快速开始

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

制作一个单片机电子时钟程序,每一位均可调节,可加减,调节时时钟会停止计时

[复制链接]
跳转到指定楼层
楼主
制作一个电子时钟,每一位均可调节,可加减,调节时时钟会停止计时
6个按钮  程序有注释

仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)


单片机源程序如下:
  1. #include<reg52.h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义
  2. #define DataPort P0 //定义数据端口 程序中遇到DataPort 则用P0 替换
  3. unsigned char k=0,h=0,m=0,s=0;
  4. sbit key1=P1^0;
  5. sbit key2=P1^1;
  6. sbit key3=P1^2;
  7. sbit key4=P1^3;
  8. sbit key5=P1^4;
  9. sbit key6=P1^5;
  10. unsigned char code duanma[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
  11. unsigned char code weima[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
  12. unsigned char TempData[8];
  13. sbit LATCH1=P2^2;//定义锁存使能端口 段锁存
  14. sbit LATCH2=P2^3;//                 位锁存
  15. /*----------延时时间T=(2*t+5)us-------------------*/
  16. void DelayUs2x(unsigned char t)
  17.   {
  18.    while(--t);
  19.   }
  20. /*----------延时时间T=tms-------------------*/
  21. void DelayMs(unsigned char t)
  22.   {
  23.   while(t--)
  24.    {
  25.     DelayUs2x(245);
  26.     DelayUs2x(245);
  27.    }
  28.   }
  29. /*----------显示子函数-------------------*/
  30. void Display(unsigned char FirstBit,unsigned char Num)
  31. {
  32.   unsigned char i;
  33.   for(i=0;i<Num;i++)
  34.   {
  35.    DataPort=0; //清空数据,防止有交替重影
  36.    LATCH1=1; //段锁存
  37.    LATCH1=0;
  38.    DataPort= weima[i+FirstBit]; //取位码
  39.    LATCH2=1; //位锁存
  40.    LATCH2=0;
  41.    DataPort=TempData[i]; //取显示数据,段码
  42.    LATCH1=1; //段锁存
  43.    LATCH1=0;
  44.    DelayMs(2); // 扫描间隙延时,时间太长会闪烁,太短会造成重影
  45.   }
  46. }
  47. /*-------------------------------------------------
  48.    定时器初始化子函数
  49. -------------------------------------------------*/
  50. void Init_Timer0(void)
  51. {
  52. TMOD|=0x01;
  53. TH0=(65536-20000)/256;
  54. TL0=(65536-20000)%256;
  55. EA=1;
  56. ET0=1;
  57. TR0=1;
  58. }


  59. /*------------------------------------------------
  60.                     主函数
  61. ------------------------------------------------*/
  62. main()
  63. {
  64. Init_Timer0();
  65. while(1)
  66. {
  67.   if(!key1)                                       
  68.     {
  69.    DelayMs(10);
  70.    if(!key1)
  71.       {
  72.      while(!key1)Display(0,8);
  73.      TR0=~TR0;
  74.          s++;
  75.      }
  76.    }
  77.   if(!key2)
  78.     {
  79.    DelayMs(10);
  80.    if(!key2)
  81.       {
  82.      while(!key2)Display(0,8);
  83.       TR0=~TR0;
  84.            m++;
  85.      }
  86.    }
  87.      if(!key3)
  88.     {
  89.    DelayMs(10);
  90.    if(!key3)
  91.       {
  92.      while(!key3)Display(0,8);
  93.       TR0=~TR0;
  94.            h++;
  95.      }
  96.    }
  97.    if(!key4)
  98.     {
  99.    DelayMs(10);
  100.    if(!key4)
  101.       {
  102.      while(!key4)Display(0,8);
  103.       TR0=~TR0;
  104.            s--;
  105.                     if(s==255)
  106.            {
  107.            s=59;
  108.            }

  109.           }
  110.    }
  111.       if(!key5)
  112.     {
  113.    DelayMs(10);
  114.    if(!key5)
  115.       {
  116.      while(!key5)Display(0,8);
  117.       TR0=~TR0;
  118.            m--;
  119.                    if(m==255)
  120.            {
  121.            m=59;
  122.            }

  123.           }
  124.    }
  125.       if(!key6)
  126.     {
  127.    DelayMs(10);
  128.    if(!key6)
  129.       {
  130.      while(!key6)Display(0,8);
  131.       TR0=~TR0;
  132.            h--;
  133.            if(h==255)
  134.            {
  135.              h=23;
  136.            }
  137.           }
  138.    }
  139.   if(k>=50)
  140.        {k=0;s++;}
  141.   if(s==60)
  142.      {s=0;m++;}
  143.   if(m==60)
  144.      {m=0;h++;}
  145.   if(h==24)
  146.      h=0;
  147.   TempData[0]=duanma[h/10];
  148.   TempData[1]=duanma[h%10];
  149.   TempData[2]=0x40;
  150.   TempData[3]=duanma[m/10];
  151.   TempData[4]=duanma[m%10];
  152.   TempData[5]=0x40;
  153.   TempData[6]=duanma[s/10];
  154.   TempData[7]=duanma[s%10];
  155.   Display(0,8);
  156.   }
  157.   
  158. }

  159. /*------------------------------------------------
  160. 定时器中断子程序
  161. ------------------------------------------------*/
  162. void Timer0_isr(void) interrupt 1
  163. {
  164. TH0=(65536-20000)/256;
  165. TL0=(65536-20000)%256;
  166. k++;
  167. }
复制代码

所有资料51hei提供下载:
电子时钟.zip (16.42 KB, 下载次数: 36)


评分

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

查看全部评分

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

使用道具 举报

沙发
ID:758875 发表于 2020-6-21 10:10 | 只看该作者
有原理图和pcb吗?
回复

使用道具 举报

板凳
ID:787144 发表于 2020-6-22 21:56 | 只看该作者
请问涉及AD数模转换吗
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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