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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 4153|回復: 1
打印 上一主題 下一主題
收起左側

PIC12F629單片機定時器1控制3個LED循環源程序,且時間可調

[復制鏈接]
跳轉到指定樓層
樓主
ID:815949 發表于 2020-9-5 22:14 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
PIC12F629不用外振即可正常運行,低成本首選,原理如下:按鍵按一次LED1低亮,按兩次LED2亮,按三次LED3亮,一直循環, 按鍵長按3秒松開則可以計入自動循環模式,再次長按3秒則退出,進入待機模式;2腳接輕觸開關到地,可以做為設置鍵(原理圖來自網上故VDD接﹢5V,漏畫,SET設置鍵沒有畫,有時間修正下原理圖),用來設置每個LED亮的時間,互不影響!源碼已經編譯通過,洞洞板做了一個PCB, 正常運行,新手貼勿噴。

單片機源程序如下:
  1. /******************************************************************************
  2. 設計要求:按一次按鍵是打開第一個攝像頭,按兩次開第二個攝像頭,按三次打開第三個攝像頭,
  3. 長按3秒則開啟循環模式,每次開啟時間30秒,一直循環,直到按下按鍵為止.
  4. * IC: PIC12F629        OSC: 片內4MHz
  5. *****************************************************************************/
  6. #include <pic.h>

  7. #define uchar unsigned char
  8. #define uint unsigned int

  9. #define LED1  GPIO0
  10. #define LED2  GPIO1
  11. #define LED3  GPIO2
  12. #define KEY    GPIO4
  13. #define SET    GPIO5

  14.            

  15. __CONFIG(FOSC_INTRCIO & WDTE_ON & PWRTE_ON & MCLRE_OFF &  BOREN_ON);

  16. /*********  配置字 ************/


  17. void interrupt ISR( void) ;
  18. void delay(uint x);
  19. void IOinit (void) ;
  20. void TMR1init(void) ;

  21. uint  time = 0;
  22. uint  t =0;
  23. uchar cnt =0;
  24. uchar  cnt1 = 0;
  25. uchar  cnt2 = 0;
  26. uchar  i , k = 0;


  27. void IOinit (void)
  28. {
  29.        PCON = 0X00;                  // 電源控制全關
  30.        CMCON = 0X07;               //關模擬器
  31.          TRISIO = 0X38;                // 00111000 GP<5:3>輸入 GP<2:0>輸出
  32.          GPIO = 0X3F;                   // 00111111 GP<2:0>輸出高電平
  33.          WPU = 0X30;                   // GP<5:4>內部弱上拉開啟
  34.          IOC = 0X30;                     //GP<5:4>端口電平變化中斷使能
  35.   }


  36. void TMR1init (void)
  37. {
  38.        OPTION_REG = 0X0F;     //  PSA =1, PS2:PS0 =111  開看門狗  預分頻128 其余的關
  39.          INTCON = 0XC0 ;              // GIE = 1 , PEIE = 1    開全局中斷  開外設中斷  其余的關
  40.          PIE1 = 0X01;                    // 外設中斷使能
  41.          PIR1 = 0X00;                    // TMR1IF = 1   開TIMR1 外設中斷標志位,需要軟件清零
  42.          TMR1H = 0X3C;               //TIMER1初值 溢出時間是50000(50ms)
  43.          TMR1L = 0XB0;               // 65536- 50000 = 15536 (0x3CB0)
  44.          T1CON = 0X01;                 // 開TIMR1
  45. }






  46. void main ( )
  47. {   
  48.       IOinit () ;
  49.       TMR1init() ;

  50. //主循環
  51.     while(1)
  52.     {      
  53.            if(i==0 )
  54.               {
  55.                  if(SET==0)
  56.                     {
  57.                     delay(10);
  58.                     if(SET==0)
  59.                         {
  60.                         
  61.                         while(!SET);
  62.                         k=!k;
  63.                         cnt=0;
  64.                         cnt1=0;
  65.                         LED3=!LED3;
  66.                          }
  67.                       }
  68.            
  69.                }
  70.             if(KEY == 0)        //如果按鍵按下
  71.               {   
  72.                      delay(20);
  73.                      if(KEY == 0)
  74.                        {  
  75.                         time = 0;        //延時標志位清零
  76.                         while(!KEY);    //等待按鍵被松開,由中斷函數計數

  77.                         if(time<40)     //按下時間不足50ms*40=2000毫秒(2秒)
  78.                            {
  79.                                if (k==0)
  80.                                   {
  81.                                      cnt1++;      //按鍵次數加1,改變工作狀態
  82.                                      if(cnt1>3)  cnt1 = 0;
  83.                                     }
  84.                                else if( k==1)  
  85.                                      {
  86.                                      cnt++;
  87.                                      if (cnt>10) cnt=0;
  88.                                      t=cnt*100;
  89.                                      LED1 =0;
  90.                                      delay(20);
  91.                                      LED1 =1;
  92.                                       }
  93.                                }
  94.                          if(time >= 40 && time < 100)   //按住時間2秒到5秒之間
  95.                              {
  96.                                                 i = !i;
  97.                                                 time =0;
  98.                                                 cnt2 =0;
  99.                                                 cnt1=0;
  100.                                         }
  101.                          else if (time >=100)
  102.                               {
  103.                                break;
  104.                               }
  105.                           }
  106.                       
  107.                                             
  108.                   }
  109.              if (k==0 )  
  110.                  {
  111.                            if (i == 1)
  112.                          { switch (cnt2)
  113.                            { case 0:
  114.                           
  115.                             GPIO  =0X3E;  //00111110  開1號繼電器
  116.                             break;
  117.                           
  118.                             case 1:
  119.                         
  120.                             GPIO  =0X3D;  //00111101  開2號繼電器
  121.                             break;
  122.                         
  123.                             case 2:
  124.                         
  125.                             GPIO  =0X3B;  //00111011  開3號繼電器
  126.                               break;
  127.                                      
  128.                               default:
  129.                               break;
  130.                                 }
  131.                                }
  132.                           if (i==0  )
  133.                           {
  134.                             switch(cnt1)             //檢測按鍵按下次數
  135.                              {
  136.                             case 0:
  137.                                     GPIO = 0x3F;
  138.                                     
  139.                                     break;   // 沒有按鍵按下 全關
  140.                                 case 1:
  141.                                     GPIO  =0X3E;  //00111110  開1號繼電器
  142.                                     break;  //  按一下打開RELAY1  2,3關
  143.                             case 2:
  144.                                     GPIO  =0X3D;  //00111101  開2號繼電器
  145.                                     break;         
  146.                             case 3:
  147.                             GPIO  =0X3B;  //00111011  開3號繼電器
  148.                                   break;
  149.                                
  150.                             default:
  151.                             break;
  152.                                }
  153.             



  154.                            }
  155.                
  156.                   }   
  157.      
  158.             
  159.         }
  160. }
  161. /******************************************************************************
  162. *                           中斷處理函數
  163. *****************************************************************************/
  164. void interrupt ISR( void)
  165. {
  166.     if(TMR1IF == 1)      //定時器1溢出中斷
  167.     {
  168.         asm ("CLRWDT");     //定時喂狗
  169.         ++time;             //延時計數
  170.                 if (time == t)    //t 是設定時間
  171.                     {
  172.                               time = 0;
  173.                         cnt2++;
  174.                               if( cnt2 > 2 )  //每加一次是t 秒
  175.                                  {
  176.                                     cnt2 = 0;
  177.                                
  178.                                   }
  179.                                
  180.                     }
  181.         TMR1H = 0x3C;       //重設TIMER1初始值使TMR1溢出時間為50000個時鐘周期
  182.         TMR1L = 0xB0;
  183.         TMR1IF = 0;         //定時器1溢出中斷標志位清零
  184.     }
  185. }


  186. void delay(uint x)
  187. {
  188.         uint a,b;
  189.         for(a=x;a>0;a--)
  190.                 for(b=71;b>0;b--);       
  191. }
復制代碼

所有資料51hei提供下載:
KEY for DELAY.zip (70.56 KB, 下載次數: 37)
原理圖.pdf (158.07 KB, 下載次數: 29)
12F629.pdf (2.41 MB, 下載次數: 13)



評分

參與人數 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏1 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:815949 發表于 2020-9-13 10:19 | 只看該作者
PC12F629使用的IO口弱上拉,主要是考慮到輸出電流小的原因,外接的限流電阻盡量選大一點,保證IO口灌電流<5mA
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 在线免费观看a级片 | 亚洲精品成人网 | 99pao成人国产永久免费视频 | 亚洲欧美在线视频 | 日本在线一区二区 | 色综合桃花网 | 色av一区二区 | 亚洲激情一级片 | 国产精品久久久久久模特 | 欧美一级二级在线观看 | 美女福利视频网站 | 青青草精品视频 | 无人区国产成人久久三区 | 自拍偷拍中文字幕 | 中文字幕在线欧美 | 亚洲最新网址 | 亚洲精品在线免费 | 亚洲小视频在线观看 | 91麻豆产精品久久久久久 | 999国产视频 | 国产精品中文字幕在线 | 国产精品99精品久久免费 | 免费黄色成人 | 欧美午夜精品 | 日韩精品在线观看视频 | 综合久久久 | 精品日韩一区 | 一区二区精品视频 | 免费观看黄色一级片 | 男女国产网站 | 日日操夜夜操视频 | 色综合久 | 免费视频成人国产精品网站 | 黄色一级大片在线观看 | 在线欧美亚洲 | 黑人巨大精品欧美一区二区免费 | 中文字幕在线一区二区三区 | 最新日韩av | 亚洲一区二区三区观看 | a毛片| 美国十次成人欧美色导视频 |