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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

消防應急系統,DC--DC, 恒流模擬

[復制鏈接]
跳轉到指定樓層
樓主
剛做完一款消防應急燈的程序,采用15W自帶CCAP 可調方便實現恒流輸出。恒流模塊遇到瓶頸希望大家給點建議,同時按鍵進入月檢,年檢還沒實現!歡迎大家評論!

  1. #include "reg51.h"
  2. #include "intrins.h"

  3. //#define FOSC    11059200L
  4. #define FOSC    24000000L

  5. typedef unsigned char BYTE;
  6. typedef unsigned int WORD;

  7. WORD code Vbg_ROM _at_ 0x03f7;            //1K程序空間的MCU
  8. WORD second,minute,hour,moutch;
  9. BYTE ADCbg;
  10. BYTE ADCx;
  11. WORD Vx;  //恒流電壓mV
  12. BYTE ADCy;
  13. WORD Vy;  //電池電壓mV

  14. sfr P0M1 = 0x93;
  15. sfr P0M0 = 0x94;
  16. sfr P1M1 = 0x91;
  17. sfr P1M0 = 0x92;
  18. sfr P2M1 = 0x95;
  19. sfr P2M0 = 0x96;
  20. sfr P3M1 = 0xb1;
  21. sfr P3M0 = 0xb2;
  22. sfr P4M1 = 0xb3;
  23. sfr P4M0 = 0xb4;
  24. sfr P5M1 = 0xC9;
  25. sfr P5M0 = 0xCA;
  26. sfr P6M1 = 0xCB;
  27. sfr P6M0 = 0xCC;
  28. sfr P7M1 = 0xE1;
  29. sfr P7M0 = 0xE2;
  30. sfr P_SW1       = 0xA2;             //外設功能切換寄存器1

  31. #define CCP_S0 0x10                 //P_SW1.4
  32. #define CCP_S1 0x20                 //P_SW1.5

  33. sfr CCON        =   0xD8;           //PCA控制寄存器
  34. sbit CCF0       =   CCON^0;         //PCA模塊0中斷標志
  35. sbit CCF1       =   CCON^1;         //PCA模塊1中斷標志
  36. sbit CR         =   CCON^6;         //PCA定時器運行控制位
  37. sbit CF         =   CCON^7;         //PCA定時器溢出標志
  38. sfr CMOD        =   0xD9;           //PCA模式寄存器
  39. sfr CL          =   0xE9;           //PCA定時器低字節
  40. sfr CH          =   0xF9;           //PCA定時器高字節
  41. sfr CCAPM0      =   0xDA;           //PCA模塊0模式寄存器
  42. sfr CCAP0L      =   0xEA;           //PCA模塊0捕獲寄存器 LOW
  43. sfr CCAP0H      =   0xFA;           //PCA模塊0捕獲寄存器 HIGH
  44. sfr CCAPM1      =   0xDB;           //PCA模塊1模式寄存器
  45. sfr CCAP1L      =   0xEB;           //PCA模塊1捕獲寄存器 LOW
  46. sfr CCAP1H      =   0xFB;           //PCA模塊1捕獲寄存器 HIGH
  47. sfr CCAPM2      =   0xDC;           //PCA模塊2模式寄存器
  48. sfr CCAP2L      =   0xEC;           //PCA模塊2捕獲寄存器 LOW
  49. sfr CCAP2H      =   0xFC;           //PCA模塊2捕獲寄存器 HIGH
  50. sfr PCA_PWM0    =   0xf2;           //PCA模塊0的PWM寄存器
  51. sfr PCA_PWM1    =   0xf3;           //PCA模塊1的PWM寄存器
  52. sfr PCA_PWM2    =   0xf4;           //PCA模塊2的PWM寄存器

  53. sfr ADC_CONTR   =   0xBC;                   //ADC控制寄存器
  54. sfr ADC_RES     =   0xBD;                   //ADC高8位結果
  55. sfr ADC_LOW2    =   0xBE;                   //ADC低2位結果
  56. sfr P1ASF       =   0x9D;                   //P1口第2功能控制寄存器
  57.                                             
  58. #define ADC_POWER   0x80                    //ADC電源控制位
  59. #define ADC_FLAG    0x10                    //ADC完成標志
  60. #define ADC_START   0x08                    //ADC起始控制位
  61. #define ADC_SPEEDLL 0x00                    //540個時鐘
  62. #define ADC_SPEEDL  0x20                    //360個時鐘
  63. #define ADC_SPEEDH  0x40                    //180個時鐘
  64. #define ADC_SPEEDHH 0x60                    //90個時鐘

  65. sbit SDJC = P1^0;
  66. sbit SDZDC = P1^1;
  67. sbit CD = P1^2;
  68. sbit DC = P1^5;
  69. sbit K = P3^0;
  70. sbit BELL = P3^1;
  71. sbit BL = P3^2;
  72. sbit GL = P3^3;
  73. sbit RL = P3^6;

  74. void InIt();
  75. void Delay(WORD n);
  76. //void GetADC(BYTE ch);
  77. void GetMv();
  78. void GetPWMInIt();
  79. void BEL();
  80. void YorM();
  81. void GetPWM();
  82. /*----------------------------
  83.   初始化
  84. ----------------------------*/
  85. void InIt(){
  86.     CD = 1;
  87.         DC = 1;
  88.         BL = 1;
  89.         GL = 1;
  90.         RL = 1;
  91. }
  92. /*----------------------------
  93. 軟件延時
  94. ----------------------------*/
  95. void Delay(WORD n)
  96. {
  97.     WORD x;

  98.     while (n--)
  99.     {
  100.         x = 5000;
  101.         while (x--);
  102.     }
  103. }
  104. /*----------------------------
  105. ADC檢測
  106. ----------------------------*/
  107. BYTE GetADC(BYTE ch){
  108.     ADC_CONTR = ADC_POWER | ADC_SPEEDLL;
  109.     Delay(2);                               //ADC上電并延時
  110.     ADC_CONTR = ADC_POWER | ADC_SPEEDLL | ch | ADC_START;
  111.     _nop_();                                //等待4個NOP
  112.     _nop_();
  113.     _nop_();
  114.     _nop_();
  115.     while (!(ADC_CONTR & ADC_FLAG));        //等待ADC轉換完成
  116.     ADC_CONTR &= ~ADC_FLAG;                 //清除ADC標志
  117.    
  118.     return ADC_RES;
  119. }
  120. /*----------------------------
  121. 電壓檢測
  122. ----------------------------*/
  123. void GetMv(){
  124.            //第一步:通過ADC的第2通道測試外部輸入電壓的ADC測量值
  125.     ADC_RES = 0;                            //清除結果寄存器
  126.     P1ASF = 0x08;                           //設置P1.3口為模擬通道
  127.     GetADC(3);
  128.     GetADC(3);
  129.     ADCx = GetADC(3);                                                //恒流AD

  130.         ADC_RES = 0;                            //清除結果寄存器
  131.     P1ASF = 0x10;                           //設置P1.4口為模擬通道
  132.     GetADC(4);
  133.     GetADC(4);
  134.     ADCy = GetADC(4);                                                //電池檢測AD
  135.    
  136.         //第二步:通過ADC的第9通道測試Bandgap電壓的ADC測量值
  137.     ADC_RES = 0;                            //清除結果寄存器
  138.     P1ASF = 0x00;                           //不設置P1ASF,即可從ADC的第9通道讀取內部Bandgap電壓的ADC測量值
  139.     GetADC(3);
  140.     GetADC(3);
  141.     ADCbg = GetADC(3);

  142.         //第三步:通過公式計算外部輸入的實際電壓值
  143.     //Vx = Vbg_RAM * ADCx / ADCbg;            //使用RAM中的Bandgap電壓參數進行計算
  144.     Vx = Vbg_ROM * ADCx / ADCbg;          //使用ROM中的Bandgap電壓參數進行計算
  145.     //Vy = Vbg_RAM * ADCy / ADCbg;
  146.         Vy = Vbg_ROM * ADCy / ADCbg;

  147. }
  148. /*----------------------------
  149. PWM輸出初始化
  150. ----------------------------*/
  151. void GetPWMInIt(){
  152.         ACC = P_SW1;
  153.     ACC &= ~(CCP_S0 | CCP_S1);      //CCP_S0=0 CCP_S1=0
  154.     P_SW1 = ACC;                    //(P1.2/ECI, P1.1/CCP0, P1.0/CCP1, P3.7/CCP2)
  155.     CCON = 0;                       //初始化PCA控制寄存器
  156.                                     //PCA定時器停止
  157.                                     //清除CF標志
  158.                                     //清除模塊中斷標志
  159.     CL = 0;                         //復位PCA寄存器
  160.     CH = 0;
  161.     CMOD = 0x02;                    //設置PCA時鐘源
  162.                                     //禁止PCA定時器溢出中斷
  163.     PCA_PWM2 = 0x80;                //PCA模塊2工作于6位PWM
  164.     CCAP2H = CCAP2L = 0x10;         //PWM2的占空比為60% ((40H-10H)/40H)
  165.     CCAPM2 = 0x42;                                                      //CCP2/P3.7輸出
  166.           CR = 0;
  167.        
  168. }
  169. /*----------------------------
  170. PWM輸出
  171. ----------------------------*/
  172. void GetPWM(){
  173.              CR = 1;
  174.                  if((Vx!=100)&&(20<Vx<=300)){  //Vx不等于100則減1
  175.                           CCAP0L = CCAP0L-1;
  176.                          if(CCAP0L==0x04){
  177.                                   CCAP0L = 0x04;                   //最大占空比輸出
  178.                          }
  179.                  }
  180.                  CCAP0H = CCAP0L;
  181.                      if((Vx<=20)||(Vx>300)){  //LED故障
  182.                                    CR = 0;
  183.                                    BEL();
  184.                                    GL = 0;
  185.                                    Delay(100);
  186.                                    GL = 1;
  187.                          }else if((Vy<=2000)||(Vy>=4300)){        //電池故障
  188.                                     CR = 0;
  189.                                    BEL();
  190.                                    CD = 0;
  191.                                    RL = 0;
  192.                                    Delay(100);
  193.                                    RL = 1;
  194.                          }else{
  195.                                    CR = 1;
  196.                          }
  197. }
  198. /*----------------------------
  199. BELL警報
  200. ----------------------------*/
  201. void BEL(){
  202.      BELL = 1;
  203.          Delay(100);
  204.          BELL = 0;
  205. }
  206. /*----------------------------
  207. 自動年檢,月檢
  208. ----------------------------*/
  209. void YorM(){
  210.          switch(moutch){
  211.                   case 0: SDZDC = 0;                                 
  212.                                  GetPWM();
  213.                                  Delay(200);
  214.                                     break;
  215.                  case 1: SDZDC = 0;
  216.                                  GetPWM();
  217.                                  Delay(200);
  218.                                  break;
  219.                  case 2: SDZDC = 0;
  220.                                  GetPWM();
  221.                                  Delay(200);
  222.                                  break;
  223.                  case 3: SDZDC = 0;
  224.                                  GetPWM();
  225.                                  Delay(200);
  226.                                     break;
  227.                  case 4: SDZDC = 0;
  228.                                  GetPWM();
  229.                                  Delay(200);
  230.                                  break;
  231.                  case 5: SDZDC = 0;
  232.                                  GetPWM();
  233.                                  Delay(200);
  234.                                  break;
  235.                  case 6: SDZDC = 0;
  236.                                  GetPWM();
  237.                                  Delay(200);
  238.                                     break;
  239.                  case 7: SDZDC = 0;
  240.                                  GetPWM();
  241.                                  Delay(200);
  242.                                  break;
  243.                  case 8: SDZDC = 0;
  244.                                  GetPWM();
  245.                                  Delay(200);
  246.                                  break;
  247.                  case 9: SDZDC = 0;
  248.                                  GetPWM();
  249.                                  Delay(200);
  250.                                     break;
  251.                  case 10: SDZDC = 0;
  252.                                  GetPWM();
  253.                                  Delay(200);
  254.                                  break;
  255.                  case 11: SDZDC = 0;
  256.                                  GetPWM();
  257.                                  Delay(2000);
  258.                                  break;
  259.          }
  260. }
  261. /*----------------------------
  262. 主函數
  263. ----------------------------*/
  264. void main()
  265. {
  266.     P0M0 = 0x00;
  267.     P0M1 = 0x00;
  268.     P1M0 = 0x00;
  269.     P1M1 = 0x00;
  270.     P2M0 = 0x00;
  271.     P2M1 = 0x00;
  272.     P3M0 = 0x00;
  273.     P3M1 = 0x00;
  274.     P4M0 = 0x00;
  275.     P4M1 = 0x00;
  276.     P5M0 = 0x00;
  277.     P5M1 = 0x00;
  278.     P6M0 = 0x00;
  279.     P6M1 = 0x00;
  280.     P7M0 = 0x00;
  281.     P7M1 = 0x00;

  282.           InIt();
  283.           GetPWMInIt();
  284.         while(1){
  285.                      GetMv();                          //AD檢測
  286.                   if(SDJC == 1){          //市電照明
  287.                          Delay(20);
  288.            if(SDJC == 1){
  289.                          YorM();                  //年檢 月檢
  290.                          SDZDC = 1;
  291.                          DC = 1;
  292.                          GetPWM();                 //PWM輸出                         
  293.                          if(2000<=Vy<3900){
  294.               CD = 1;
  295.               RL = 0;                                                         
  296.              }
  297.                          if(3900<=Vy<4200){
  298.                            Delay(200);
  299.                            if(3900<=Vy<4200){
  300.                                CD = 1;
  301.                    RL = 1;
  302.                            }                          
  303.                          }
  304.                          if(4200<=Vy<4300){
  305.                                  Delay(200);
  306.                                  if(4200<=Vy<4300){
  307.                                          CD = 0;
  308.                     RL = 1;
  309.                                  }                             
  310.                            }
  311.                  }
  312.       }else{
  313.               SDZDC = 0;
  314.                           DC = 0;
  315.                           CD = 0;
  316.                           GetPWM();
  317.                         if(K == 0){
  318.                           CR = 0;
  319.                          }
  320.            }
  321.         }           
  322. }

  323. void timer0() interrupt 1        //定時器0(中斷1)
  324. {
  325.    BYTE tim1;           //定義臨時變量
  326. TL0=TL0+0XB0;TH0=0X3C;        //重裝定時器初值
  327. tim1++;                //每中斷一次tim1加1
  328. if(tim1==20){                           //中斷20(1秒)
  329.    tim1=0;
  330.    second++;
  331.    if(second>=60){                  //如果秒到60
  332.              second=0;
  333.           minute++;                         //秒變0,分加1
  334.           if(minute>=60){         //如果分到60
  335.                    

  336. …………余下代碼請下載附件…………
復制代碼


下載:
消防應急系統.zip (44.42 KB, 下載次數: 147)

評分

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

查看全部評分

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

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 久久狠狠 | 国产精品日日夜夜 | 亚洲一二三区免费 | 男女羞羞视频免费 | 色狠狠一区 | 日韩h| 欧美国产日韩在线观看成人 | 天天干天天色 | 亚洲视频免费在线 | 国产日韩欧美电影 | 欧美日韩国产一区 | 91国在线高清视频 | 日本成人三级电影 | 久久久久高清 | 亚洲v日韩v综合v精品v | 成人一级毛片 | 久久精品久久久久久 | 精品国产乱码久久久久久影片 | 九九久久99 | 狠狠干影院| 伊人看片 | 欧美日韩精品免费观看 | 91麻豆精品一区二区三区 | 日韩在线视频一区 | 在线观看特色大片免费网站 | 99在线观看| 国产一区二区三区免费观看在线 | 国产一区二区在线免费播放 | 最新中文字幕一区 | 免费一区二区 | 亚洲久视频 | 天天操天天射综合 | 午夜大片 | 久久精品亚洲一区二区三区浴池 | 日韩在线不卡 | 综合另类 | 天天综合成人网 | 国产精品久久久久久久久久久久久 | 男女羞羞免费网站 | 碰碰视频| 国产精品久久久久久久免费观看 |