找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1545|回复: 5
收起左侧

单片机数字电子钟设计的秒表特快,而且闹钟定时到了蜂鸣器一直开关不了

[复制链接]
ID:1020956 发表于 2022-4-23 15:20 | 显示全部楼层 |阅读模式
12.png

单片机源程序如下:
  1. #include<reg51.h>                                                                                         //寄存器51的头文件
  2. #include<intrins.h>
  3. #define uint unsigned int
  4. #define uchar unsigned char

  5. unsigned char LED[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};             //共阴极0-9字型码
  6. unsigned char hour=12,min,sec;                                                                                                                 //定义并初始化时间为12点整
  7. unsigned char shi=8,fen,miao;                                                                                                                 //定义并初始化闹钟为8点整
  8. unsigned char moshi;                                                                                                                                 //0为闹钟模式,1为时钟模式

  9. sbit key1=P3^0;                                                  //按钮                  
  10. sbit key2=P3^1;                                                                                                         
  11. sbit key3=P3^2;                                                                                                         //                          外部中断0输入
  12. sbit key4=P3^3;                                                                                                         //                          外部中断1输入
  13. sbit key5=P3^4;
  14. sbit s=P1^0;                                                     //蜂鸣器

  15. void keyscan();

  16. void delay(uint x)                                                                                                 //定义延时函数:延时1ms
  17. {
  18.      unsigned char i,j;
  19.          for(i=0;i<x;i++);                                                                    
  20.          for(j=0;j<120;j++);
  21. }                                    

  22. void display()                                                   //数码时钟管动态显示
  23. {               
  24.          P2=0x7f;
  25.          P0=LED[sec%10];
  26.          delay(5);
  27.          P2=0xbf;
  28.          P0=LED[sec/10];
  29.          delay(5);

  30.          P2=0xdf;                                                                                                        //显示“-”
  31.          P0=0x40;
  32.          delay(5);

  33.          P2=0xef;
  34.          P0=LED[min%10];
  35.          delay(5);
  36.          P2=0xf7;
  37.          P0=LED[min/10];
  38.          delay(5);

  39.          P2=0xfb;                                                                                                        //显示“-”
  40.          P0=0x40;
  41.          delay(5);

  42.          P2=0xfd;
  43.          P0=LED[hour%10];
  44.          delay(5);
  45.          P2=0xfe;
  46.          P0=LED[hour/10];
  47.          delay(5);
  48. }

  49. void dishow()                                                   //数码管闹钟动态显示
  50. {               
  51.          P2=0x7f;
  52.          P0=LED[miao%10];
  53.          delay(5);
  54.          P2=0xbf;
  55.          P0=LED[miao/10];
  56.          delay(5);

  57.          P2=0xdf;                                                                                                        //显示“-”
  58.          P0=0x40;
  59.          delay(5);

  60.          P2=0xef;
  61.          P0=LED[fen%10];
  62.          delay(5);
  63.          P2=0xf7;
  64.          P0=LED[fen/10];
  65.          delay(5);

  66.          P2=0xfb;                                                                                                        //显示“-”
  67.          P0=0x40;
  68.          delay(5);

  69.          P2=0xfd;
  70.          P0=LED[shi%10];
  71.          delay(5);
  72.          P2=0xfe;
  73.          P0=LED[shi/10];
  74.          delay(5);
  75. }

  76. void init_timer()                                                                                             //定时器初始化
  77. {
  78.      TMOD=0x01;                                                                                                     //方式1
  79.          TH0=0x77;                                                                                                  
  80.          TL0=0x01;                                                                                                  
  81.          EA=1;                                                                                                             //总中断允许
  82.          ET0=1;                                                                                                             //定时器T0中断允许
  83.          TR0=1;                                                                                                             //启动定时器T0         
  84. }         

  85. void Time1()                                               //时间累加函数
  86. {
  87.       sec++;                                                                                           //秒钟:sec
  88.           if(sec==60)
  89.           {
  90.               sec=0;
  91.                   min++;                                                                                   //分钟:min
  92.           }
  93.           if(min==60)
  94.           {
  95.               min=0;
  96.                   hour++;                                                                                   //时钟:hour
  97.           }
  98.           if(hour==24)
  99.           {
  100.               hour=0;
  101.           }                                               
  102. }

  103. void Time0() interrupt 1                                       //定时器T0中断服务函数
  104. {
  105.       static unsigned int num;
  106.       TMOD=0x01;                                           //寄存器模式:方式1
  107.           TH0=0x77;
  108.           TL0=0x01;
  109.           num++;                                                                                           //计数5ms,num+1
  110.           if(num==300)                                                                                   //num=300,增加1秒
  111.           {
  112.               sec++;                                                                                   //秒钟:sec
  113.               num=0;
  114.           }                                                                                             
  115.           if(sec==60)
  116.           {
  117.               sec=0;
  118.                   min++;                                                                                   //分钟:min
  119.           }
  120.           if(min==60)
  121.           {
  122.               min=0;
  123.                   hour++;                                                                                   //时钟:hour
  124.           }
  125.           if(hour==24)
  126.           {
  127.               hour=0;
  128.           }        
  129. }

  130. void init_INT01()                                                                                        //外部中断初始化
  131. {                                                                                                                        
  132.      EA=1;                                                                                                        //总中断允许
  133.          EX0=1;                                                                                                        //允许外部中断0中断
  134.          EX1=1;                                                                                                        //允许外部中断1中断
  135.          IT0=1;                                                                                                        //选择外部中断0为跳沿触发方式
  136.          IT1=1;                                                                                                     //选择外部中断1为跳沿触发方式
  137. }
  138.                                                                                                                  
  139. void INT0_() interrupt 0                                                                                //外部中断0服务函数        :P3^2
  140. {
  141.      EX0=0;
  142.          moshi=0;                                                                                                                //闹钟打开,进入闹钟设置模式
  143.          EX0=1;
  144. }

  145. void INT1_() interrupt 2                                                                            //外部中断1服务函数 : P3^3
  146. {
  147.          EX1=0;
  148.      moshi=1;                                                                                                                 //闹钟关闭        ,回归时钟状态
  149.          EX1=1;
  150. }

  151. void compare()                                                                                                //时间比较函数:判断时间是否达到闹钟设定时间
  152. {
  153.      if(shi==hour&&fen==min)
  154.          {
  155.                 s=0;
  156.                         delay(9);
  157.          }
  158. }

  159. void keyscan()                                                                                                  //按键判断
  160. {
  161.      static uchar key1_Temp=1;
  162.          static uchar key2_Temp=1;
  163.          static uchar key5_Temp=1;

  164.          if(moshi==0)
  165.      {
  166.        dishow();
  167.      }
  168.      if(moshi==1)
  169.      {
  170.        display();
  171.            compare();
  172.      }

  173. if(moshi==1)
  174. {
  175.      if(key1==0&&key1!=key1_Temp)                                                                                         //key1:秒的加
  176.          {
  177.               delay(10);
  178.               if(key1==0&&key1!=key1_Temp)
  179.                   {     
  180.                                           sec++;
  181.                                       if(sec==60)
  182.                                           {
  183.                                                sec=0;
  184.                                           }
  185.                   }
  186.          }
  187.          if(key2==0&&key2!=key2_Temp)                                                                                         //key2:分的加
  188.          {
  189.               delay(10);
  190.               if(key2==0&&key2!=key2_Temp)
  191.                   {
  192.                                       min++;
  193.                                       if(min==60)
  194.                                           {
  195.                                                min=0;
  196.                                           }
  197.                   }
  198.          }
  199.           if(key5==0&&key5!=key5_Temp)                                                                                         //key5:时的加
  200.          {
  201.               delay(10);
  202.               if(key5==0&&key5!=key5_Temp)
  203.                   {
  204.                                       hour++;
  205.                                       if(hour==24)
  206.                                           {
  207.                                                hour=0;
  208.                                           }           
  209.                   }
  210.          }
  211. }
  212. if(moshi==0)
  213. {
  214.      if(key1==0&&key1!=key1_Temp)                                                                                         //key1:秒的加
  215.          {
  216.               delay(10);
  217.               if(key1==0&&key1!=key1_Temp)
  218.                   {     
  219.                                           miao++;
  220.                                       if(miao==60)
  221.                                           {
  222.                                                miao=0;
  223.                                           }
  224.                   }
  225.          }
  226.          if(key2==0&&key2!=key2_Temp)                                                                                         //key2:分的加
  227.          {
  228.               delay(10);
  229.               if(key2==0&&key2!=key2_Temp)
  230.                   {
  231.                                       fen++;
  232.                                       if(fen==60)
  233.                                           {
  234.                                                fen=0;
  235.                                           }
  236.                   }
  237.          }
  238.           if(key5==0&&key5!=key5_Temp)                                                                                         //key5:时的加
  239.          {
  240.               delay(10);
  241.               if(key5==0&&key5!=key5_Temp)
  242.                   {
  243.                                       shi++;
  244.                                       if(shi==24)
  245.                                           {
  246.                                                shi=0;
  247.                                           }           
  248.                   }
  249.          }
  250. }
  251.          key1_Temp=key1;                                                                                //赋值
  252.          key2_Temp=key2;
  253.          key5_Temp=key5;
  254. }

  255. void main()
  256. {
  257.       init_timer();                                                                                             //定时器初始化
  258.           init_INT01();                                                                                             //外部中断初始化
  259.           while(1)
  260.           {
  261.                    keyscan();                                                                                     //按键判断
  262.                    Time1();                                                                                                 //时间累加函数
  263.                    delay(1);
  264.           }
  265. }
复制代码


回复

使用道具 举报

ID:96682 发表于 2022-4-23 16:43 来自手机 | 显示全部楼层
蜂鳴器受定時器影響,數碼管顯示的快慢受定時器設定值影響
回复

使用道具 举报

ID:94031 发表于 2022-4-23 16:43 | 显示全部楼层
你的仿真图和程序不是一回事。
回复

使用道具 举报

ID:121859 发表于 2022-4-23 18:14 | 显示全部楼层
void compare()                                                                                                //时间比较函数:判断时间是否达到闹钟设定时间
{
     if(shi==hour&&fen==min)
         {
                s=0;
                        delay(9);
         }
}
这里开后,就没有关闭,所以肯定响了后就不会停了。
回复

使用道具 举报

ID:1020956 发表于 2022-4-24 09:17 | 显示全部楼层
zhxiufan 发表于 2022-4-23 18:14
void compare()                                                                                       ...

哦对,这下可以关了,谢谢,我还想问一下为什么秒动的很快,十个十个的动
回复

使用道具 举报

ID:1020956 发表于 2022-4-24 09:59 | 显示全部楼层
wc86110 发表于 2022-4-23 16:43
蜂鳴器受定時器影響,數碼管顯示的快慢受定時器設定值影響

定时器初值我改了好几个还是一样的结果
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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