找回密码
 立即注册

QQ登录

只需一步,快速开始

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

51单片机电子时钟proteus仿真工程下载

  [复制链接]
跳转到指定楼层
楼主
基于51单片机的电子时钟设计  程序和仿真
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)


单片机源程序如下:
  1. #include<reg52.h>

  2. #define uchar unsigned char
  3. #define uint unsigned int

  4. sbit duan = P1^6; //段选
  5. sbit wei = P1^7; //位选
  6. sbit S1 = P3^6;        //暂停键
  7. sbit S2 = P3^5;        //增加键
  8. sbit S3 = P3^4;        //减少键
  9. sbit S4 = P3^1; //闹钟设置键
  10. sbit S5 = P3^0; //闹钟启用停止键
  11. sbit BEE = P1^5;//蜂鸣器

  12. uchar code aaa[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
  13. uchar temp,out = 1,qq = 0,ww = 0,H,M,S,j1,j2,k1,k2,l1,l2;
  14. uchar H1 = 0,M1 = 0,Sa = 0,j10,j20,k10,k20,l10,l20,SS = 0;
  15. uint UT;


  16. void delayMS(x) //延时函数,单位毫秒
  17. {
  18.         uint a , b;
  19.         for(a = 0 ; a < x ; a++ )
  20.         for(b = 0 ; b < 110 ; b++);
  21. }


  22. void play(uint h1 , uint h2 , uint m1 , uint m2 , uint s1 , uint s2) //时分秒的显示
  23. {
  24.         wei = 1; //时的十位
  25.         P2 = 0x7f;
  26.         wei = 0;

  27.         duan = 1;
  28.         P0 = aaa[h1];
  29.         duan = 0;
  30.         delayMS(3);

  31.         wei = 1; //时的个位
  32.         P2 = 0xbf;
  33.         wei = 0;

  34.         duan = 1;
  35.         P0 = aaa[h2];
  36.         duan = 0;        
  37.         delayMS(3);

  38.         wei = 1; //分的十位
  39.         P2 = 0xdf;
  40.         wei = 0;

  41.         duan = 1;
  42.         P0 = aaa[m1];
  43.         duan = 0;
  44.         delayMS(3);

  45.         wei = 1; //分的个位
  46.         P2 = 0xef;
  47.         wei = 0;

  48.         duan = 1;
  49.         P0 = aaa[m2];
  50.         duan = 0;
  51.         delayMS(3);

  52.         wei = 1; //秒的十位
  53.         P2 = 0xf7;
  54.         wei = 0;

  55.         duan = 1;
  56.         P0 = aaa[s1];
  57.         duan = 0;
  58.         delayMS(3);

  59.         wei = 1; //秒的个位
  60.         P2 = 0xfb;
  61.         wei = 0;

  62.         duan = 1;
  63.         P0 = aaa[s2];
  64.         duan = 0;
  65.         delayMS(3);               
  66. }  


  67. void stopfunc() //S1键函数 暂停
  68. {
  69.         if(S1 == 0)
  70.         {
  71.                 while(!S1);
  72.                 qq++;
  73.                 out = 0; //暂停
  74.                 TR0 = 0;        
  75.         }               
  76. }


  77. void WWS4() //闹钟设置
  78. {
  79.         if(S4 == 0)
  80.         {
  81.                 while(!S4);
  82.                 ww++;
  83.         }
  84. }


  85. void begin() //S5键 闹钟启动和停止
  86. {
  87.         if(S5 == 0)
  88.         {
  89.                 while(!S5);
  90.                 SS = !SS;
  91.         }
  92. }

  93. void ala() //闹钟控制蜂鸣器
  94. {
  95.         if((H == H1) && (M == M1) && (SS == 1))
  96.         {
  97.                 BEE = 0;
  98.         }
  99.         if((H == H1) && (M == M1+1) || (SS == 0))
  100.         {
  101.                 BEE = 1;
  102.         }
  103. }

  104. void buttfunc() //S2键、S3键函数 调时
  105. {
  106.         
  107.         if(qq == 1) //第一次按S1时,调秒
  108.         {
  109.                 if(S2 == 0)
  110.                 {
  111.                         while(!S2);
  112.                         if(S < 59)
  113.                         {
  114.                                 S++;
  115.                         }
  116.                         else
  117.                         {
  118.                                 S = 0;        
  119.                         }
  120.                         delayMS(5);
  121.                 }
  122.                 if(S3 == 0)
  123.                 {
  124.                         while(!S3);
  125.                         if(S > 0)
  126.                         {                                       
  127.                                 S--;
  128.                         }
  129.                         else
  130.                         {
  131.                                 S = 59;
  132.                         }
  133.                         delayMS(5);
  134.                 }
  135.                         j1=H%10;
  136.                         j2=H/10;
  137.                         k1=M%10;
  138.                         k2=M/10;
  139.                         l1=S%10;
  140.                         l2=S/10;
  141.                         play(j2,j1,k2,k1,l2,l1);
  142.         }
  143.         if(qq == 2) //第二次按S1时,调分
  144.         {
  145.                 if(S2 == 0)
  146.                 {
  147.                         while(!S2);
  148.                         if(M < 59)
  149.                         {
  150.                                 M++;
  151.                         }
  152.                         else
  153.                         {
  154.                                 M = 0;
  155.                         }
  156.                         delayMS(5);
  157.                 }
  158.                 if(S3 == 0)
  159.                 {
  160.                         while(!S3);
  161.                         if(M > 0)
  162.                         {                                       
  163.                                 M--;
  164.                         }
  165.                         else
  166.                         {
  167.                                 M = 59;
  168.                         }
  169.                         delayMS(5);
  170.                 }
  171.                         j1=H%10;
  172.                         j2=H/10;
  173.                         k1=M%10;
  174.                         k2=M/10;
  175.                         l1=S%10;
  176.                         l2=S/10;
  177.                         play(j2,j1,k2,k1,l2,l1);
  178.         }
  179.         if(qq == 3) //第三次按S1时,调时
  180.         {
  181.                 if(S2 == 0)
  182.                 {
  183.                         while(!S2);
  184.                         if(H < 23)
  185.                         {
  186.                                 H++;
  187.                         }
  188.                         else
  189.                         {
  190.                                 H = 0;
  191.                         }
  192.                         delayMS(5);
  193.                 }
  194.                 if(S3 == 0)
  195.                 {
  196.                         while(!S3);
  197.                         if(H > 0)
  198.                         {                                       
  199.                                 H--;
  200.                         }
  201.                         else
  202.                         {
  203.                                 H = 23;
  204.                         }
  205.                         delayMS(5);
  206.                 }
  207.                         j1=H%10;
  208.                         j2=H/10;
  209.                         k1=M%10;
  210.                         k2=M/10;
  211.                         l1=S%10;
  212.                         l2=S/10;
  213.                         play(j2,j1,k2,k1,l2,l1);
  214.         }
  215.         if(qq == 4) //第四次 ,设闹钟
  216.         {
  217.                 j10=H1%10;
  218.                 j20=H1/10;
  219.                 k10=M1%10;
  220.                 k20=M1/10;
  221.                 l10=Sa%10;
  222.                 l20=Sa/10;
  223.                 play(j20,j10,k20,k10,l20,l10);
  224.                 if(ww == 1)
  225.                 {
  226.                         if(S2 == 0)
  227.                         {
  228.                                 while(!S2);
  229.                                 if(M1 < 59)
  230.                                 {
  231.                                         M1++;
  232.                                 }
  233.                                 else
  234.                                 {
  235.                                         M1 = 0;
  236.                                 }
  237.                                 delayMS(5);
  238.                         }
  239.                         if(S3 == 0)
  240.                         {
  241.                                 while(!S3);
  242.                                 if(M1 > 1)
  243.                                 {
  244.                                         M1--;
  245.                                 }
  246.                                 else
  247.                                 {
  248.                                         M1 = 59;
  249.                                 }
  250.                         }
  251.                 }
  252.                 if(ww == 2)
  253.                 {
  254.                         if(S2 == 0)
  255.                         {
  256.                                 while(!S2);
  257.                                 if(H1 < 23)
  258.                                 {
  259.                                         H1++;
  260.                                 }
  261.                                 else
  262.                                 {
  263.                                         H1 = 0;
  264.                                 }
  265.                                 delayMS(5);
  266.                         }
  267.                         if(S3 == 0)
  268.                         {
  269.                                 while(!S3);
  270.                                 if(H1 > 1)
  271.                                 {
  272.                                         H1--;
  273.                                 }
  274.                                 else
  275.                                 {
  276.                                         H1 = 23;
  277.                                 }
  278.                         }
  279.                  }                        
  280.         }
  281.         
  282.         if(qq == 5) //第五次按S1时,继续计时
  283.         {
  284.                 while(!S1);
  285.                 qq = 0;
  286.                 ww = 0;
  287.                 out = 1;
  288.         }
  289. }


  290. void main()
  291. {
  292.         TMOD = 0x01; //定时器0
  293.         IE = 0x83; //中断打开,打开外部中断0和定时器0中断
  294.         TH0 = (65536 - 46080)/256; //初值:2^16=65536   11.0592*10^6 * 50*10^(-3)=46080 (晶振*中断时间)
  295.         TL0 = (65536 - 46080)%256;
  296.         while(1)
  297.         {
  298.                 stopfunc();
  299.                 begin();
  300.                 ala();
  301.                 if(out == 1)
  302.                 {
  303.                         TR0 = 1;
  304.                         if(UT == 20) //1秒钟到了----20*50=1000ms
  305.                         {        
  306.                                 UT = 0;
  307.                                 S++;
  308.                                 if(S == 60)
  309.                                 {
  310.                                         S=0;
  311.                                         M++;
  312.                                         if(M == 60)
  313.                                         {
  314.                                                 M = 0;
  315.                                                 H++;
  316.                                                 if(H == 24) //24小时制
  317.                                                 {
  318.                                                         H = 0;
  319.                                                 }
  320.                                         }
  321.                                 }
  322.                         }
  323.                
  324.                         j1=H%10;
  325.                         j2=H/10;
  326.                         k1=M%10;
  327.                         k2=M/10;
  328.                         l1=S%10;
  329.                         l2=S/10;
  330.                         play(j2,j1,k2,k1,l2,l1);
  331.                
  332.                 }
  333.                 else
  334.                 {               
  335.                         WWS4();
  336.                         buttfunc();        
  337.                 }
  338.         }
  339. }

  340. void TIME() interrupt 1
  341. {
  342.         TH0 = (65536 - 46080)/256; //重装初值
  343.         TL0 = (65536 - 46080)%256;
  344.         UT++;
  345. }

复制代码


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


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

使用道具 举报

沙发
ID:530516 发表于 2019-5-9 18:46 | 只看该作者
很厉害,可调时间,代码合适,但是闹钟好像不响
回复

使用道具 举报

板凳
ID:643842 发表于 2019-11-17 20:25 | 只看该作者
谢谢分享
回复

使用道具 举报

地板
ID:633645 发表于 2019-12-16 16:17 来自手机 | 只看该作者
您这程序开玩笑呢,只给一个.c文件
回复

使用道具 举报

5#
ID:656911 发表于 2019-12-30 09:45 | 只看该作者
不错啊,这个东西很棒。
回复

使用道具 举报

6#
ID:767796 发表于 2020-6-2 19:49 | 只看该作者
赞下楼主
回复

使用道具 举报

7#
ID:783130 发表于 2020-6-20 13:45 | 只看该作者
代码没有错误哎,感谢,现在差proteus
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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