找回密码
 立即注册

QQ登录

只需一步,快速开始

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

电子时钟、秒表及闹钟仿真图及程序

[复制链接]
跳转到指定楼层
楼主
电子时钟、秒表及闹钟仿真图及程序

  1. /************************************************/
  2. /**设计题目:数字电子钟**/
  3. /**设计要求:能显示时,分,秒,能对时,分进行调节,有秒表功能.**/
  4. /**设计人: 史亚林 (西安科技大学)于2011年5月  QQ:598241556**/
  5. /************************************************/
  6. #include<reg51.h>
  7. #define uchar unsigned char
  8. #define uint unsigned int

  9. sbit qingling=P1^0;                //清零
  10. sbit tiaofen=P1^1;                //调分
  11. sbit tiaoshi=P1^2;                //调时
  12. sbit sounder=P1^7;                //naozhong

  13. uint a,b;
  14. uchar hour,minu,sec,   //时钟
  15.       hour0,minu0,sec0,//秒表
  16.           hour1,minu1,sec1;
  17.           h1,h2,m1,m2,s1,s2,//显示位
  18.           k,s;//状态转换标志
  19.           
  20. uchar code select[]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe};
  21. uchar code table[]=        {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
  22. /*****************函数声明***********************/
  23. void keyscan();
  24. void init();
  25. void delay(uchar z);
  26. void display(uchar,uchar,uchar);
  27. void sounde();

  28. /*****************主函数*************************/         
  29. void main()
  30. {
  31.         init();
  32.         while(1)
  33.         {                                 
  34.                 while(TR1)
  35.                 {
  36.                
  37.                         keyscan();                                //扫描函数
  38.                         while(s==1)                                 ///////////////s是状态标志,当s=0时,闹钟取消。s=1时,设定闹钟时间(也是通过调时,调分函数);
  39.                         {                                                                          //s=2时,闹钟工作,时间与设定时刻一致时,闹钟响(一分钟后自动关闭,可手动关闭)。再次切换,s=0.
  40.                                 keyscan();                                                  //s状态切换(0-》1-》2-》0)通过外部中断1实现。
  41.                                 display(hour1,minu1,sec1); //闹钟时刻显示
  42.                         }
  43.                          display(hour0,minu0,sec0);//时钟表显示                       
  44.                        
  45.                         while(k)                /*k是秒表状态(0-》1-》2-》0)通过外部中断0实现。0秒表关;1秒表从零计时;2秒表停,显示计时时间*/
  46.                         {
  47.                                  display(hour,minu,sec);        //秒表显示                       
  48.                         }
  49.                     
  50.                 }
  51.         }

  52. }

  53. /*****************初始化函数***********************/
  54. void init()
  55. {
  56.         a=0;
  57.         b=0;
  58.         k=0;
  59.         s=0;
  60.         hour0=0;
  61.         minu0=0;
  62.         sec0=0;
  63.         hour=0;
  64.         minu=0;
  65.         sec=0;
  66.         hour1=0;
  67.         minu1=0;
  68.         sec1=0;

  69.         TMOD=0x11;                                  //定时器0,1工作于方式1;赋初值
  70.         TH0=(65536-5000)/256;
  71.         TL0=(65536-5000)%256;
  72.         TH1=(65536-50000)/256;
  73.         TL1=(65536-50000)%256;
  74.        
  75.         EA=1;
  76.         EX0=1;                 //秒表中断
  77.         EX1=1;                 //闹钟设定中断
  78.         ET0=1;
  79.         ET1=1;
  80.         IT0=1;                  //边沿触发方式
  81.         IT1=1;

  82.         PX0=1;
  83.         PX1=1;
  84.        
  85.         TR0=0;                          //初始,秒表不工作
  86.         TR1=1;                  //时钟一开始工作       
  87. }

  88. /*****************定时器0中断*************/
  89. void timer0_int() interrupt 1        //秒表
  90. {
  91.         TH0=(65536-5000)/256;
  92.         TL0=(65536-5000)%256;
  93.         a++;
  94.         if(a==2)
  95.         {
  96.                 a=0;
  97.                 sec++;
  98.                 if(sec==100)
  99.                         {
  100.                                 sec=0;                //毫秒级
  101.                                 minu++;
  102.                                 if(minu==60)
  103.                                 {
  104.                                         minu=0;                        //秒
  105.                                         hour++;
  106.                                         if(hour==60)          //分
  107.                                         {
  108.                                                 hour=0;
  109.                                         }
  110.                                 }
  111.                         }
  112.         }
  113.        
  114. }

  115. /*************外部中断0中断函数************/
  116. void ex0_int() interrupt 0
  117. {               
  118.         k++;
  119.         if(k==3)
  120.         k=0;
  121.         if(k==1)
  122.         {
  123.                 TR0=~TR0;
  124.                 if(TR0==1)
  125.                 {                         
  126.                         hour=0;
  127.                         minu=0;
  128.                         sec=0;               
  129.                 }
  130.         }
  131.         if(k==2)
  132.         {
  133.                 TR0=~TR0;
  134.         }         
  135. }

  136. /*************外部中断1中断函数************/
  137. void ex1_int() interrupt 2
  138. {
  139.         s++;
  140.         if(s==3)
  141.         s=0;
  142. }

  143. /*************定时器1中断****************/
  144. void timer1_int() interrupt 3                 //控制时钟工作
  145. {
  146.         TH1=(65536-50000)/256;
  147.         TL1=(65536-50000)%256;
  148.         if(s==2)
  149.         {
  150.                 if(hour1==hour0 && minu0==minu1)
  151.                 sounde();
  152.         }
  153.         b++;
  154.         if(b==20)
  155.         {
  156.                 b=0;
  157.                 sec0++;
  158.          if(sec0==60)
  159.            {  
  160.               sec0=0;
  161.                 minu0++;
  162.               if(minu0==60)
  163.                {
  164.                    minu0=0;
  165.                    hour0++;
  166.                    if(hour0==24)
  167.                          hour0=0;
  168.                         
  169.                }
  170.            }
  171.                           
  172.         }
  173.                        
  174. }


  175. /*************键盘扫描****************/
  176. void keyscan()
  177. {
  178.        
  179.         if(s==1)
  180.         {
  181.                 if(qingling==0)
  182.                 {
  183.                         delay(10);
  184.                         if(qingling==0)
  185.                         {
  186.                                 sec1=0;
  187.                                 minu1=0;
  188.                                 hour1=0;
  189.                         }
  190.                 }
  191.                 if(tiaofen==0)
  192.                 {
  193.                         delay(10);
  194.                         if(tiaofen==0)
  195.                         {
  196.                                 minu1++;
  197.                                 if(minu1==60)
  198.                                 {
  199.                                         minu1=0;
  200.                                 }
  201.                                 while(!tiaofen);
  202.                                
  203.                         }
  204.                 }
  205.                 if(tiaoshi==0)
  206.                 {
  207.                         hour1++;
  208.                         if(hour1==24)
  209.                         {
  210.                                 hour1=0;
  211.                         }
  212.                         while(!tiaoshi);
  213.                        
  214.                 }
  215.         }
  216.         else                                  //调整时钟时间
  217.         {
  218.                  if(qingling==0)
  219.                 {
  220.                         delay(10);
  221.                         if(qingling==0)
  222.                         {
  223.                                 sec0=0;
  224.                                 minu0=0;
  225.                                 hour0=0;
  226.                         }
  227.                 }
  228.                 if(tiaofen==0)
  229.                 {
  230.                         delay(10);
  231.                         if(tiaofen==0)
  232.                         {
  233.                                 minu0++;
  234.                                 if(minu0==60)
  235.                                 {
  236.                                         minu0=0;
  237.                                 }
  238.                                 while(!tiaofen);
  239.                        
  240.                         }
  241.                 }
  242.                 if(tiaoshi==0)
  243.                 {
  244.                         hour0++;
  245.                         if(hour0==24)
  246.                         {
  247.                                 hour0=0;
  248.                         }
  249.                         while(!tiaoshi);
  250.                        
  251.                 }
  252.         }       
  253. }
  254. /*************显示函数****************/
  255. void display(uchar hour,uchar minu,uchar sec)
  256. {
  257.         h1=hour/10;
  258.         h2=hour%10;
  259.         m1=minu/10;
  260.         m2=minu%10;
  261.         s1=sec/10;
  262.         s2=sec%10;

  263.         P0=0xff;
  264.         P2=table[h1];
  265.         P0=select[7];
  266.         delay(5);

  267.         P0=0xff;
  268.         P2=table[h2];
  269.         P0=select[6];
  270.         delay(5);

  271.         P0=0xff;
  272.         P2=0x40;;
  273.         P0=select[5];
  274.         delay(5);

  275.         P0=0xff;
  276.         P2=table[m1];
  277.         P0=select[4];
  278.         delay(5);

  279.         P0=0xff;
  280.         P2=table[m2];
  281.         P0=select[3];
  282.         delay(5);

  283.         P0=0xff;
  284.         P2=0x40;
  285.         P0=select[2];
  286.         delay(5);

  287.         P0=0xff;
  288.         P2=table[s1];
  289.         P0=select[1];
  290.         delay(5);

  291.         P0=0xff;
  292.         P2=table[s2];
  293.         P0=select[0];
  294.         delay(5);

  295. }

  296. /*************闹钟函数****************/
  297. void sounde()
  298. {
  299.         sounder=~sounder;       
  300. }
  301. /*************延时函数****************/
  302. void delay(uchar z)
  303. {
  304.         int x,y;
  305.         for(x=z;x>0;x--)
  306.                 for(y=110;y>0;y--);
  307. }
复制代码



时钟秒表.rar

20.15 KB, 下载次数: 91, 下载积分: 黑币 -5

毕业设计

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

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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