1024手机基地看电影,午夜福利视频导航,国产精品福利在线一区,亚洲欧美日韩另类成人,在线观看午夜日本理论片,成年超爽免费网站,国产精品成人免费,精品动作一级毛片,成人免费观看网站,97精品伊人久久大香蕉

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索

單片機24小時倒計時源程序+仿真

查看數: 20950 | 評論數: 22 | 收藏 11
關燈 | 提示:支持鍵盤翻頁<-左 右->
    組圖打開中,請稍候......
發布時間: 2018-5-16 11:07

正文摘要:

功能 :倒計時八數碼管顯示,最小1秒,最大24小時;計時結束蜂鳴器報警響10次;如果做實物,可以用繼電器作開關控制強電。 設置方法: 1.按K1鍵第一次,秒位閃爍,短按加減鍵加減1,長按連加連減; 2.按K1鍵第二 ...

回復

ID:1140794 發表于 2025-1-4 18:09
lids 發表于 2018-5-22 12:33
按鍵掃描部分重新寫一下,加減鍵的短按更穩定,長按短按分的更清

按鍵消抖、確認按鍵確實被按下后,加一行代碼:        while(key==0);,意思是確認按鍵松開才執行功能,可以使按鍵更穩定。
ID:1140794 發表于 2025-1-4 17:15
請問這個源程序要怎么樣才能改成At89c51的程序呢?有什么要特別注意的地方嗎?
ID:887667 發表于 2021-4-2 11:22
請問為什么是255
ID:826214 發表于 2021-3-30 23:00
你好,又可以借鑒的原理圖嗎
ID:140489 發表于 2020-10-19 14:22
ajian-1023 發表于 2020-10-19 13:20
感謝樓主分享。好東西,有電路圖嗎,這個圖看不太清

你下載壓縮包里有仿真文件的,源程序也有的,都很清晰的
ID:243874 發表于 2020-10-19 13:20
感謝樓主分享。好東西,有電路圖嗎,這個圖看不太清
ID:202586 發表于 2019-10-10 20:54
謝謝分享,
ID:473698 發表于 2019-10-10 14:33
感謝樓主分享...
ID:504013 發表于 2019-4-3 20:09
為啥我試驗后不報警發出聲音呢
ID:439289 發表于 2018-12-12 10:29
感謝分享 學習一下
ID:140489 發表于 2018-11-22 09:11
天籟游子 發表于 2018-11-21 06:24
樓主,我想增加一個功能,比如現在正在倒計時開的功能,我按一個按鈕后,變成倒計時關,但是這間期倒計時一 ...

功能 :倒計時八數碼管顯示,最小1秒,最大24小時;計時結束蜂鳴器報警響10次;如果做實物,可以用繼電器作開關控制強電。
設置方法:
1.按K1鍵第一次,秒位閃爍,短按加減鍵加減1,長按連加連減;
2.按K1鍵第二次,分位閃爍,短按加減鍵加減1,長按連加連減;
3.按K1鍵第三次,時位閃爍,短按加減鍵加減1,長按連加連減;
4.按K1鍵第四次,退出設置;
5.按K4鍵啟動倒計時(非設置狀態下時分秒其中之一不為0才能啟動計時);
6.計時的時候,按K4鍵1次可以暫停計時并關閉輸出,再按一次恢復計時并啟動輸出,按K6鍵停止計時并清零,關閉輸出;
7.非計時狀態下,K5手動開關控制輸出。
ID:140489 發表于 2018-11-22 09:04
天籟游子 發表于 2018-11-21 06:24
樓主,我想增加一個功能,比如現在正在倒計時開的功能,我按一個按鈕后,變成倒計時關,但是這間期倒計時一 ...

你可以設置一個標志位,如果標志位為1,就倒計時,為0就正計時
ID:228888 發表于 2018-11-21 06:24
樓主,我想增加一個功能,比如現在正在倒計時開的功能,我按一個按鈕后,變成倒計時關,但是這間期倒計時一直在進行,其實就是想隨時切換倒計時開或關,但不影響計時器的工作,只是改變了結果,請問這個功能怎么實現?
ID:140489 發表于 2018-11-7 07:55
可以的,你自己改改輸出的狀態就可以
ID:228888 發表于 2018-11-7 01:34
樓主,我想做一個預約開關,就是定時關,也能定時開的功能,你這個程序應該可以吧
ID:320226 發表于 2018-9-8 21:41
樓主  你好,可以將程序的共陰極改為共陽極嗎?反相器改為三極管程序怎樣改吖?
ID:376438 發表于 2018-8-14 09:43
謝謝樓主,學習一下
ID:140489 發表于 2018-6-6 10:37
當然可以改為共陽的,仿真用反相器方便些,與三極管是一樣的效果,做實物就用三極管;蜂鳴器報警的不用改,要接繼電器就接p2.2口LED那里
ID:320226 發表于 2018-6-4 09:26
改回共陽極行嗎反相器改為三極管蜂鳴器改為繼電器嗎
ID:140489 發表于 2018-5-30 17:37
程序重寫了一遍,數碼管掃描也放到定時器里面,程序不用delay軟件延時
  1. #include<reg52.h>
  2. #define uchar unsigned char
  3. #define uint unsigned int
  4. #define duan P1
  5. #define wei P3
  6. sbit key1 = P2^3;   //設置
  7. sbit key2 = P2^4;   //加
  8. sbit key3 = P2^5;        //減
  9. sbit key4 = P2^6;        //啟動
  10. sbit key5 = P2^7;        //手動
  11. sbit out = P2^2;        //輸出控制 ,低電平有效
  12. sbit di = P2^0;                //蜂鳴器

  13. bit flag=0,flag1=0,shan=0;
  14. uchar knum,shan_cont,i;
  15. uchar shi=0,fen=0,miao=0;
  16. uint cont,cont1,cont2;
  17. uchar code duanma[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//共陰段碼表
  18. uchar code weima[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};                        //位碼        加反相器用
  19. uchar LedBuff[]={0,0,0,0,0,0,0,0};                                                                                //數碼管顯示緩沖區

  20. void init()
  21. {
  22.         TMOD |= 0x01;                           //定時器0 工作方式1
  23.         TH0 = (65536-1000)/256;   //1ms初值 @12MHz
  24.         TL0 = (65536-1000)%256;
  25.         EA = 1;
  26.         ET0 = 1;
  27.         TR0 = 1;       
  28. }


  29. void dis()           //顯示函數
  30. {
  31.         LedBuff[0] = duanma[miao%10];
  32.         LedBuff[1] = duanma[miao/10];
  33.         LedBuff[2] = 0x40;
  34.         LedBuff[3] = duanma[fen%10];
  35.         LedBuff[4] = duanma[fen/10];
  36.         LedBuff[5] = 0x40;
  37.         LedBuff[6] = duanma[shi%10];
  38.         LedBuff[7] = duanma[shi/10];
  39. }


  40. void keysan()
  41. {
  42.         static bit kf1=0, kf2=0,kf3=0;  //自鎖標志,這里一定要加static(或者用全局變量),否則按鍵不靈
  43.         static uint i=0,j=0,k=0,l=0,m=0;        //消抖延時變量

  44.         if(knum==0)
  45.         {
  46.                 if(key4 == 1)
  47.                 {
  48.                         m=0;
  49.                         kf2=0;
  50.                
  51.                 }
  52.                 else if(kf2 == 0 )                  //啟動 暫停鍵
  53.                 {
  54.                         ++m;  //消抖
  55.                         if( (m>20) && ((miao != 0) || (fen != 0) || (shi != 0)) )
  56.                         {        //時分秒都為0時,不能啟動輸出,只要其中之一不為0,就能啟動輸出
  57.                                 m=0;
  58.                                 kf2=1;
  59.                                 flag = !flag;  //啟動、暫停計時標志
  60.                                 out = !out;
  61.                         }
  62.                 }       
  63.         }          
  64.        

  65.         if(key5==1)
  66.         {
  67.                 l=0;
  68.                 kf3=0;
  69.         }
  70.         else if(kf3==0 )          //手動開關,在沒有倒計時的狀態下才有用
  71.         {
  72.                 ++l;
  73.                 if(l > 20)
  74.                 {
  75.                         l=0;
  76.                         kf3=1;
  77.                         if(shi==0 && fen==0 && miao==0)
  78.                         out = !out;
  79.                 }
  80.         }
  81.                
  82.         if(out==1)        //加這句,只有在輸出關閉的時候,才能設置計時時間,在倒計時的過程中是不能設置的
  83.         {
  84.                 if(key1==1)                //設置         //IO是高電平,說明按鍵沒有被按下,這時要及時清零一些標志位
  85.                 {
  86.                         i=0;           //按鍵消抖計時變量清零
  87.                         kf1=0;           //按鍵自鎖標志清零
  88.                 }
  89.                 else if(kf1 == 0)        //有按鍵按下,且是第一次被按下
  90.                 {
  91.                         ++i;
  92.                         if(i>12)
  93.                         {
  94.                                 i=0;
  95.                                 kf1=1;         //自鎖按鍵置位,避免一直觸發
  96.                                 knum++;
  97.                                 if(knum==4)
  98.                                         knum = 0;
  99.                         }       
  100.                 }
  101.         }


  102.         if(key2==0)                //加
  103.         {
  104.                 j++;
  105.                 if(j >= 3000)           //長按,數碼管掃描放中斷里面,這里的值就要取得大才行
  106.                 {                                        //因為沒用delay延時,CPU跑的很快
  107.                         if(knum==1)
  108.                         {
  109.                                 miao++;
  110.                                 if(miao==60)
  111.                                         miao = 0;
  112.                         }

  113.                         if(knum==2)
  114.                         {
  115.                                 fen++;
  116.                                 if(fen==60)
  117.                                         fen=0;
  118.                         }

  119.                         if(knum==3)
  120.                         {
  121.                                 shi++;
  122.                                 if(shi==24)
  123.                                         shi=0;
  124.                         }

  125.                         j=1000;           //這里j的值可以設置連加的快慢,j的值越大就越快
  126.                 }                           //因為初值越大,加到3000的時間就越短
  127.         }       

  128.         else
  129.         {
  130.                         if(j>500 && j<3000) //短按
  131.                         {
  132.                                
  133.                         if(knum==1)
  134.                         {
  135.                                 miao++;
  136.                                 if(miao==60)
  137.                                         miao = 0;
  138.                         }

  139.                         if(knum==2)
  140.                         {
  141.                                 fen++;
  142.                                 if(fen==60)
  143.                                         fen=0;
  144.                         }

  145.                         if(knum==3)
  146.                         {
  147.                                 shi++;
  148.                                 if(shi==24)
  149.                                         shi=0;
  150.                         }
  151.                         j=0;
  152.                 }

  153.         }       
  154.        
  155.         if(key3==0)                //減
  156.         {
  157.                 k++;
  158.                 if(k >= 3000)           //長按
  159.                 {
  160.                         if(knum==1)
  161.                         {
  162.                                 miao--;
  163.                                 if(miao==255)
  164.                                         miao = 59;
  165.                         }

  166.                         if(knum==2)
  167.                         {
  168.                                 fen--;
  169.                                 if(fen==255)
  170.                                         fen=59;
  171.                         }

  172.                         if(knum==3)
  173.                         {
  174.                                 shi--;
  175.                                 if(shi==255)
  176.                                         shi=23;
  177.                         }

  178.                         k=1000;
  179.                 }
  180.         }       

  181.         else
  182.         {
  183.                 if(k>500 && k<3000) //短按
  184.                 {
  185.                                
  186.                         if(knum==1)
  187.                         {
  188.                                 miao--;
  189.                                 if(miao==255)
  190.                                         miao = 59;
  191.                         }

  192.                         if(knum==2)
  193.                         {
  194.                                 fen--;
  195.                                 if(fen==255)
  196.                                         fen=59;
  197.                         }

  198.                         if(knum==3)
  199.                         {
  200.                                 shi--;
  201.                                 if(shi==255)
  202.                                         shi=23;
  203.                         }
  204.                 }
  205.                 k=0;        //消抖變量清零,為下次按鍵做準備       
  206.         }         
  207. }


  208. void main()
  209. {
  210.         init();
  211.         out = 1;
  212.         while(1)
  213.         {
  214.                 keysan();
  215.                 dis();
  216.                 if(shi==0 && fen==0 && miao==0 && flag == 1 )  //倒計時時間到
  217.                 {
  218.                          flag=0;          //停止計時
  219.                         flag1=1;  //啟動蜂鳴器標志置1
  220.                         out=1;          //關閉輸出
  221.                 }
  222.         }       
  223. }

  224. void timer() interrupt 1
  225. {
  226.         TH0 = (65536-1000)/256;          //50毫秒初值
  227.         TL0 = (65536-1000)%256;
  228.        
  229.         if(flag)
  230.         {
  231.                 cont++;
  232.                 if(cont == 1000)          
  233.                 {
  234.                         cont = 0;
  235.                         miao--;
  236.                         if(miao==255)
  237.                         {
  238.                                 miao=59;
  239.                                 fen--;
  240.                                 if(fen==255)
  241.                                 {
  242.                                         fen=59;
  243.                                         shi--;
  244.                                         if(shi==255)
  245.                                         {
  246.                                                 shi=0;
  247.                                         }
  248.                                         if(shi==0)
  249.                                                 fen=59;
  250.                                         if(fen==0 && shi==0)
  251.                                                 fen=0;
  252.                                 }
  253.                         }
  254.                 }
  255.         }

  256.         if(flag1)                 //倒計時時間到,啟動蜂鳴器
  257.         {
  258.                 cont1++;
  259.                 if(cont1==500) //500ms蜂鳴器響一次
  260.                 {
  261.                         cont1=0;
  262.                         di=!di;
  263.                         cont2++;
  264.                         if(cont2==20)//500*20=10000ms=10s,蜂鳴器響10s后停止
  265.                         {
  266.                                 cont2=0;
  267.                                 flag1=0;
  268.                         }
  269.                 }
  270.         }

  271.         if(knum != 0)
  272.         {
  273.                 shan_cont++;
  274.                 if(shan_cont==100)  //設置時,100ms閃爍時間        可根據實際效果調整
  275.                 {
  276.                         shan_cont=0;
  277.                         shan = !shan;
  278.                 }
  279.         }
  280. /**********數碼管掃描函數************/
  281.         i++;
  282.         if(i>=8)
  283.         {
  284.                 i=0;
  285.         }
  286.         duan = 0x00;
  287.         switch(i)
  288.         {
  289.                 case 0:
  290.                                 if(knum==1)                                                                          //如果設置鍵第一次按下
  291.                                 {if(shan==1){wei = 0x00; duan = LedBuff[0];}  //設置秒位閃爍
  292.                                         else{wei = weima[0]; duan = LedBuff[0];}
  293.                                 }
  294.                                 else{wei = weima[0]; duan = LedBuff[0];}        break;        //否則正常顯示
  295.                
  296.                 case 1:       
  297.                                
  298.                                 if(knum==1)
  299.                                 {if(shan==1){wei = 0x00; duan = LedBuff[1];}
  300.                                         else{wei = weima[1]; duan = LedBuff[1];}
  301.                                 }
  302.                                 else{wei = weima[1]; duan = LedBuff[1];}  break;
  303.        
  304.                 case 2:        wei = weima[2]; duan = LedBuff[2];        break;
  305.                
  306.                 case 3:       
  307.                                 if(knum==2)
  308.                                 {if(shan==1){wei = 0x00; duan = LedBuff[3];}
  309.                                         else{wei = weima[3]; duan = LedBuff[3];}
  310.                                 }
  311.                                 else{wei = weima[3]; duan = LedBuff[3];}        break;
  312.                
  313.                 case 4:       
  314.                                 if(knum==2)
  315.                                 {if(shan==1){wei = 0x00; duan = LedBuff[4];}
  316.                                         else{wei = weima[4]; duan = LedBuff[4];}
  317.                                 }
  318.                                 else{wei = weima[4]; duan = LedBuff[4];}        break;
  319.                
  320.                 case 5:        wei = weima[5]; duan = LedBuff[5];        break;
  321.                
  322.                 case 6:       
  323.                                 if(knum==3)
  324.                                 {if(shan==1){wei = 0x00; duan = LedBuff[6];}
  325.                                         else{wei = weima[6]; duan = LedBuff[6];}
  326.                                 }
  327.                                 else{wei = weima[6]; duan = LedBuff[6];}        break;       

  328.                 case 7:       
  329.                                 if(knum==3)
  330.                                 {if(shan==1){wei = 0x00; duan = LedBuff[7];}
  331.                                         else{wei = weima[7]; duan = LedBuff[7];}
  332.                                 }
  333.                                 else{wei = weima[7]; duan = LedBuff[7];}        break;
  334.                
  335.                 default: break;       

  336.         }

  337. }
復制代碼
ID:140489 發表于 2018-5-22 12:33
按鍵掃描部分重新寫一下,加減鍵的短按更穩定,長按短按分的更清
  1. void keysan()
  2. {
  3.         static bit kf1=0, kf2=0,kf3=0;  //自鎖標志,這里一定要加static(或者用全局變量),否則按鍵不靈
  4.         static uint i,j,k,l,m;        //消抖延時變量

  5. //        if(knum==0)
  6. //        {
  7.                 if(key4 == 1)
  8.                 {
  9.                         m=0;
  10.                         kf2=0;
  11.                
  12.                 }
  13.                 else if(kf2 == 0 )                  //啟動 暫停鍵
  14.                 {
  15.                         ++m;  //消抖
  16.                         if( (m>20) || (miao != 0) || (fen != 0) || (shi != 0) )
  17.                         {        //時分秒都為0時,不能啟動輸出,只要其中之一不為0,就能啟動輸出
  18.                                 m=0;
  19.                                 kf2=1;
  20.                                 flag = !flag;  //啟動、暫停計時標志
  21.                                 out = !out;
  22.                         }
  23.                 }       
  24. //        }          
  25.        

  26.         if(key5==1)
  27.         {
  28.                 l=0;
  29.                 kf3=0;
  30.         }
  31.         else if(kf3==0 )          //手動開關,在沒有倒計時的狀態下才有用
  32.         {
  33.                 ++l;
  34.                 if(l > 20)
  35.                 {
  36.                         l=0;
  37.                         kf3=1;
  38.                         if(shi==0 && fen==0 && miao==0)
  39.                         out = !out;
  40.                 }
  41.         }
  42.                

  43.         if(key1==1)                //設置         //IO是高電平,說明按鍵沒有被按下,這時要及時清零一些標志位
  44.         {
  45.                 i=0;           //按鍵消抖計時變量清零
  46.                 kf1=0;           //按鍵自鎖標志清零
  47.         }
  48.         else if(kf1 == 0)        //有按鍵按下,且是第一次被按下
  49.         {
  50.                 ++i;
  51.                 if(i>12)
  52.                 {
  53.                         i=0;
  54.                         kf1=1;         //自鎖按鍵置位,避免一直觸發
  55.                         knum++;
  56.                         if(knum==4)
  57.                                 knum = 0;
  58.                 }       
  59.         }



  60.         if(key2==0)                //加
  61.         {
  62.                 j++;
  63.                 if(j >= 120)           //長按
  64.                 {
  65.                         if(knum==1)
  66.                         {
  67.                                 miao++;
  68.                                 if(miao==60)
  69.                                         miao = 0;
  70.                         }

  71.                         if(knum==2)
  72.                         {
  73.                                 fen++;
  74.                                 if(fen==60)
  75.                                         fen=0;
  76.                         }

  77.                         if(knum==3)
  78.                         {
  79.                                 shi++;
  80.                                 if(shi==24)
  81.                                         shi=0;
  82.                         }

  83.                         j=90;           //這里j的值可以設置連加的快慢,j的值越大就越快
  84.                 }                           //因為初值越大,加到120的時間就越短
  85.         }       

  86.         else
  87.         {
  88.                         if(j>15 && j<120) //短按
  89.                         {
  90.                                
  91.                         if(knum==1)
  92.                         {
  93.                                 miao++;
  94.                                 if(miao==60)
  95.                                         miao = 0;
  96.                         }

  97.                         if(knum==2)
  98.                         {
  99.                                 fen++;
  100.                                 if(fen==60)
  101.                                         fen=0;
  102.                         }

  103.                         if(knum==3)
  104.                         {
  105.                                 shi++;
  106.                                 if(shi==24)
  107.                                         shi=0;
  108.                         }
  109.                         j=0;
  110.                 }

  111.         }       
  112.        
  113.         if(key3==0)                //減
  114.         {
  115.                 k++;
  116.                 if(k >= 120)           //長按
  117.                 {
  118.                         if(knum==1)
  119.                         {
  120.                                 miao--;
  121.                                 if(miao==255)
  122.                                         miao = 59;
  123.                         }

  124.                         if(knum==2)
  125.                         {
  126.                                 fen--;
  127.                                 if(fen==255)
  128.                                         fen=59;
  129.                         }

  130.                         if(knum==3)
  131.                         {
  132.                                 shi--;
  133.                                 if(shi==255)
  134.                                         shi=23;
  135.                         }

  136.                         k=90;
  137.                 }
  138.         }       

  139.         else
  140.         {
  141.                 if(k>15 && k<120) //短按
  142.                 {
  143.                                
  144.                         if(knum==1)
  145.                         {
  146.                                 miao--;
  147.                                 if(miao==255)
  148.                                         miao = 59;
  149.                         }

  150.                         if(knum==2)
  151.                         {
  152.                                 fen--;
  153.                                 if(fen==255)
  154.                                         fen=59;
  155.                         }

  156.                         if(knum==3)
  157.                         {
  158.                                 shi--;
  159.                                 if(shi==255)
  160.                                         shi=23;
  161.                         }
  162.                 }
  163.                 k=0;       
  164.         }         
  165. }
復制代碼
ID:46999 發表于 2018-5-16 21:04
很好的例程

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表