久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2652|回復: 6
收起左側

單片機數字電子鐘設計的秒表特快,而且鬧鐘定時到了蜂鳴器一直開關不了

[復制鏈接]
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
蜂鳴器受定時器影響,數碼管顯示的快慢受定時器設定值影響

定時器初值我改了好幾個還是一樣的結果
回復

使用道具 舉報

ID:1139836 發表于 2024-12-16 23:32 來自手機 | 顯示全部樓層
剛才調試了一下 ,特快的原因是時間累加函數放在while里面了,把它去掉就可以解決這個問題。
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 日韩国产免费观看 | 亚洲免费人成在线视频观看 | 久久国产精品亚洲 | 免费看a | 欧美999| 337p日韩| 久久久久久黄 | 久草在线免费资源 | 中文字幕亚洲免费 | 视频第一区 | 亚洲国产午夜 | 日韩视频中文字幕 | 欧美国产视频一区二区 | 欧美午夜视频 | 久久伊人一区二区 | 日本精品久久 | 欧美精品久久久 | 欧美黄在线观看 | 97伦理电影网 | 亚洲综合在线一区二区 | av免费观看在线 | 亚洲精品乱码久久久久久按摩观 | 91免费观看 | 亚洲精品乱码8久久久久久日本 | 国产不卡一区 | 欧美视频在线播放 | 国产免费一区二区 | 二区精品 | 亚洲一区视频在线 | 一区二区日韩 | 久久一 | 波多野结衣一区二区三区在线观看 | 久久久久亚洲精品 | 欧美在线视频一区 | 亚洲xx在线 | 国产精品成人一区二区 | 日日夜夜天天综合 | 在线观看亚洲欧美 | 在线中文视频 | 久久久黄色 | 羞羞视频免费在线 |