找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 981|回复: 0
收起左侧

单片机可控硅移相调压程序和电路原理图 光耦过零检测

  [复制链接]
ID:467203 发表于 2023-10-27 01:48 | 显示全部楼层 |阅读模式
电路原理图如下,左边是由光耦组成的过零检测电路:
51hei.png


单片机源程序如下(多路可控硅移相调压)程序注释很详细:
  1. #include <STC15F2K60S2.H> //STC15系列单片机头文件都是这个。
  2. #define uchar unsigned char
  3. #define uint unsigned int

  4. #include <STC15F2K60S2.H>

  5. #define         MAIN_Fosc                24000000UL        //定义主时钟

  6. uchar num=0; //对可控硅移相角控制
  7. uchar jishuqi=0;  //记录中断次数,有软起动作用,值不电输出电压不变

  8. uchar  sec1=0;
  9.   uchar  sec10=0;
  10.    uchar  sec100=0;
  11.           uchar  sec1000=0;


  12. sbit cdqd=P3^3;//启动充电信号0开1关

  13. sbit fdqd=P3^4;//启动放电信号0开1关

  14. //sbit cdr=P3^5;//充电停止信号 1关,0开

  15. sbit fd=P3^7;//充电可控硅通断  0:放电 1:关闭

  16. sbit pwm1=P3^5;//放电可控硅位通  0导通,1关闭
  17. sbit pwm2=P3^6;//放电可控硅位通  0导通,1关闭
  18.   // sbit led=P1^0;        实验板指示灯
  19.     sbit led=P1^2;
  20.         sbit cf=P1^0;

  21. unsigned char i;
  22. unsigned int ms;

  23. void        delay_ms( ms);
  24. /////////////主程序
  25. void main()
  26. {   cdqd=1;        

  27.         fd=1;
  28.         pwm1=1;
  29.         cf=1;
  30.                
  31.          //初始化
  32.         TMOD=0x01;

  33.   // TL0 = 0xa6;                //设置定时初始值 0.1ms
  34. //         TH0 = 0xFf;                //设置定时初始值
  35. // TL0 = 0x4a;                //设置定时初始值0.2ms
  36. //        TH0 = 0xFf;                //设置定时初始值
  37.   //  TL0 = 0x91;                //设置定时初始值0.4ms
  38. //        TH0 = 0xFe;                //设置定时初始值
  39.    // TL0 = 0x38;                //设置定时初始值0.5ms
  40. //        TH0 = 0xFe;                //设置定时初始值

  41.         
  42.    TL0 = 0x9c;                //设置定时初始值        0.1ms
  43.         TH0 = 0xFf;                //设置定时初始值

  44.    // TL0 = 0x68;                //设置定时初始值        1ms
  45.         //TH0 = 0xFC;                //设置定时初始值

  46.         EA=0;
  47.         ET0=1;
  48.         EX0=1;         
  49.         IT0=0;//必须设外部中断触发方式为上升沿下降沿同时触发。STC最新15系列单片机外部中断INT0口有上下沿同时触发功能
  50.         pwm1=1;
  51.         pwm2=1;
  52.         led=1;
  53.           //   EA=1;
  54.         //         TR0=1;
  55.         while(1){  
  56.                     while(cdqd==0){EA=1; }                         //充电启动
  57.                           //  if(cdqd==0){EA=1;        cf=0; }                         //充电启动
  58.               jishuqi=0;
  59.                     if(cdqd==1){EA=0; jishuqi=0;  }                          //充电关闭

  60.                           if(fdqd==0){jishuqi=0; fd=0;        for(i=0;i<3;i++); fd=1;        for(i=0;i<3;i++);         }//放电延时2us};

  61.                         //        fd=1;
  62.          // if(cf==0)        {
  63.                    ////////////////////////////////////////
  64.                          //        delay_ms(500);
  65.                                  
  66.                                 led=~led;
  67.                 //                pwm=0;
  68.                                        
  69.                  // delay_ms(500);
  70.                 //                 pwm=1;
  71.                     // led=0;
  72.                
  73.                           // }
  74.                 /////////////////////////////////////////////
  75.                }




  76. }

  77. //延时程序
  78.    void  delay_ms(ms)
  79. {
  80.      unsigned int i;
  81.          do{
  82.               i = 200;
  83.                   while(--i)        ;   //14T per loop
  84.      }while(--ms);
  85. }


  86.           void Timer0Init(void)                //1000微秒@24.000MHz
  87. {
  88.         AUXR |= 0x80;                //定时器时钟1T模式
  89.         TMOD &= 0xF0;                //设置定时器模式
  90.         TMOD |= 0x01;                //设置定时器模式
  91.         TL0 = 0x40;                //设置定时初始值
  92.         TH0 = 0xA2;                //设置定时初始值
  93.         TF0 = 0;                //清除TF0标志
  94.         TR0 = 1;                //定时器0开始计时
  95. }



  96. //1毫秒定时器中断程序                  
  97. void t0() interrupt 1
  98. {
  99.         unsigned char i;

  100. TL0=0x9c;
  101. TH0=0xff;                   //1haomiandingshi
  102.   // TL0 = 0xa6;                //设置定时初始值 0.1ms
  103. //         TH0 = 0xFf;                //设置定时初始值
  104. // TL0 = 0x4a;                //设置定时初始值0.2ms
  105. //        TH0 = 0xFf;                //设置定时初始值
  106.   //  TL0 = 0x91;                //设置定时初始值0.4ms
  107. //        TH0 = 0xFe;                //设置定时初始值
  108.    // TL0 = 0x38;                //设置定时初始值0.5ms
  109. //        TH0 = 0xFe;                //设置定时初始值

  110.         
  111. //  TL0 = 0x9c;                //设置定时初始值        0.1ms
  112. //        TH0 = 0xFf;                //设置定时初始值

  113.         // led=~led;
  114. //         pwm=~pwm;
  115.          num++;
  116.          
  117.          // jishuqi=8;                固定电压输出               
  118.    //        if(jishuqi>4) {jishuqi=5;  if(cdqd==0){}}  //全导通

  119. //jishuqi=4;
  120.         //第一个半波
  121. if(jishuqi==1){
  122.                         if(num==75)                //延时1毫秒导通,改变num的值即可改变移相触发时间,即改变负载功率大小。num的范围:0<num<10
  123.                      {
  124.                         TR0=0;
  125.                         pwm1=0;        //触发MOC3021导通,即触发可控硅导通
  126.                         pwm2=0;        //触发MOC3021导通,即触发可控硅导通
  127.                         for(i=0;i<2;i++);//延时2us
  128.                         pwm1=1;        //延时2us之后,关掉脉冲输出,因为可控硅在非过零点情况下触发信号丢失,会继续保持导通。
  129.                         pwm2=1;        //触发MOC3021导通,即触发可控硅导通
  130.                         num=0;        //清零变量
  131.                // led=~led;        //验证指示LED
  132.                          //led=0;
  133.                      }         
  134.              }                //



  135.                   if(jishuqi==2){
  136.                         if(num==70)                //延时1毫秒导通,改变num的值即可改变移相触发时间,即改变负载功率大小。num的范围:0<num<10
  137.                      {
  138.                         TR0=0;
  139.                         pwm1=0;        //触发MOC3021导通,即触发可控硅导通
  140.                                 pwm2=0;        //触发MOC3021导通,即触发可控硅导通
  141.                         for(i=0;i<2;i++);//延时2us
  142.                         pwm1=1;        //延时2us之后,关掉脉冲输出,因为可控硅在非过零点情况下触发信号丢失,会继续保持导通。
  143.                         pwm2=1;        //触发MOC3021导通,即触发可控硅导通
  144.                         num=0;        //清零变量
  145.          // led=~led;        //验证指示LED
  146.                          //led=0;
  147.                      }         
  148.              }                //


  149.                  
  150.                   if(jishuqi==3){
  151.                         if(num==65)                //延时1毫秒导通,改变num的值即可改变移相触发时间,即改变负载功率大小。num的范围:0<num<10
  152.                      {
  153.                         TR0=0;
  154.                         pwm1=0;        //触发MOC3021导通,即触发可控硅导通
  155.                                 pwm2=0;        //触发MOC3021导通,即触发可控硅导通
  156.                         for(i=0;i<2;i++);//延时2us
  157.                         pwm1=1;        //延时2us之后,关掉脉冲输出,因为可控硅在非过零点情况下触发信号丢失,会继续保持导通。
  158.                         pwm2=1;        //触发MOC3021导通,即触发可控硅导通
  159.                         num=0;        //清零变量
  160.           //led=~led;        //验证指示LED
  161.                          //led=0;
  162.                      }         
  163.              }                //

  164.                            if(jishuqi==4){
  165.                         if(num==60)                //延时1毫秒导通,改变num的值即可改变移相触发时间,即改变负载功率大小。num的范围:0<num<10
  166.                      {
  167.                         TR0=0;
  168.                         pwm1=0;        //触发MOC3021导通,即触发可控硅导通
  169.                                 pwm2=0;        //触发MOC3021导通,即触发可控硅导通
  170.                         for(i=0;i<2;i++);//延时2us
  171.                         pwm1=1;        //延时2us之后,关掉脉冲输出,因为可控硅在非过零点情况下触发信号丢失,会继续保持导通。
  172.                         pwm2=1;        //触发MOC3021导通,即触发可控硅导通
  173.                         num=0;        //清零变量
  174.          // led=~led;        //验证指示LED
  175.                          //led=0;
  176.                      }         
  177.              }                //


  178.                            if(jishuqi>=5){
  179.                         if(num==50)                //延时1毫秒导通,改变num的值即可改变移相触发时间,即改变负载功率大小。num的范围:0<num<10
  180.                      {
  181.                         TR0=0;
  182.                         pwm1=0;        //触发MOC3021导通,即触发可控硅导通
  183.                                 pwm2=0;        //触发MOC3021导通,即触发可控硅导通
  184.                         for(i=0;i<2;i++);//延时2us
  185.                         pwm1=1;        //延时2us之后,关掉脉冲输出,因为可控硅在非过零点情况下触发信号丢失,会继续保持导通。
  186.                         pwm2=1;        //触发MOC3021导通,即触发可控硅导通
  187.                         num=0;        //清零变量
  188.          // led=~led;        //验证指示LED
  189.                          //led=0;
  190.                      }         
  191.              }                //


  192.                            if(jishuqi==6){
  193.                         if(num==40)                //延时1毫秒导通,改变num的值即可改变移相触发时间,即改变负载功率大小。num的范围:0<num<10
  194.                      {
  195.                         TR0=0;
  196.                         pwm1=0;        //触发MOC3021导通,即触发可控硅导通
  197.                                 pwm2=0;        //触发MOC3021导通,即触发可控硅导通
  198.                         for(i=0;i<2;i++);//延时2us
  199.                         pwm1=1;        //延时2us之后,关掉脉冲输出,因为可控硅在非过零点情况下触发信号丢失,会继续保持导通。
  200.                         pwm2=1;        //触发MOC3021导通,即触发可控硅导通
  201.                         num=0;        //清零变量
  202.              //  led=~led;        //验证指示LED
  203.                          //led=0;
  204.                      }         
  205.              }                //


  206.           if(jishuqi==7){
  207.                         if(num==30)                //延时1毫秒导通,改变num的值即可改变移相触发时间,即改变负载功率大小。num的范围:0<num<10
  208.                      {
  209.                         TR0=0;
  210.                         pwm1=0;        //触发MOC3021导通,即触发可控硅导通
  211.                                 pwm2=0;        //触发MOC3021导通,即触发可控硅导通
  212.                         for(i=0;i<2;i++);//延时2us
  213.                         pwm1=1;        //延时2us之后,关掉脉冲输出,因为可控硅在非过零点情况下触发信号丢失,会继续保持导通。
  214.                         pwm2=1;        //触发MOC3021导通,即触发可控硅导通
  215.                         num=0;        //清零变量
  216.          // led=~led;        //验证指示LED
  217.                          //led=0;
  218.                      }         
  219.              }                //

  220. if(jishuqi==8){
  221.                         if(num==20)                //延时1毫秒导通,改变num的值即可改变移相触发时间,即改变负载功率大小。num的范围:0<num<10
  222.                      {
  223.                         TR0=0;
  224.                         pwm1=0;        //触发MOC3021导通,即触发可控硅导通
  225.                                 pwm2=0;        //触发MOC3021导通,即触发可控硅导通
  226.                         for(i=0;i<2;i++);//延时2us
  227.                         pwm1=1;        //延时2us之后,关掉脉冲输出,因为可控硅在非过零点情况下触发信号丢失,会继续保持导通。
  228.                                 pwm2=1;        //触发MOC3021导通,即触发可控硅导通
  229.                         num=0;        //清零变量
  230.          // led=~led;        //验证指示LED
  231.                          //led=0;
  232.                      }         
  233.              }                //

  234.                  if(jishuqi>=9){
  235.                         if(num==60)                //延时1毫秒导通,改变num的值即可改变移相触发时间,即改变负载功率大小。num的范围:0<num<10
  236.                      {
  237.                         TR0=0;
  238.                         pwm1=0;        //触发MOC3021导通,即触发可控硅导通
  239.                                 pwm2=0;        //触发MOC3021导通,即触发可控硅导通
  240.                         for(i=0;i<2;i++);//延时2us
  241.                         pwm1=1;        //延时2us之后,关掉脉冲输出,因为可控硅在非过零点情况下触发信号丢失,会继续保持导通。
  242.                                 pwm2=1;        //触发MOC3021导通,即触发可控硅导通
  243.                         num=0;        //清零变量                                                                         if(jish                        
  244.          // led=~led;        //验证指示LED
  245.                          //led=0;
  246.                      }         
  247.                       }                //


  248.         

  249.                 //第二个半波                                                
  250.         //                  if(jishuqi>=10){
  251.                 //        if(num==5)                //延时1毫秒导通,改变num的值即可改变移相触发时间,即改变负载功率大小。num的范围:0<num<10
  252.                     // {
  253.                 //        TR0=0;
  254.         //                pwm=0;        //触发MOC3021导通,即触发可控硅导通
  255.         //                for(i=0;i<2;i++);//延时2us
  256.         //                pwm=1;        //延时2us之后,关掉脉冲输出,因为可控硅在非过零点情况下触发信号丢失,会继续保持导通。
  257.         //                num=0;        //清零变量
  258.           //      led=~led;        //验证指示LED
  259.                          //led=0;
  260.                    //  }         
  261.            //  }                //
  262.                 //第二个半波                                                                                                  
  263.         
  264.                                    //第10和大于10个半波
  265.                  
  266.                                       //        pwm=1;


  267.                            //if(num==7){led=~led;}
  268.                                    // led=~led;                //验证指示LED

  269.                                           //10MS计时器
  270.           // if(sec1>=10)        {sec1=0;sec10++;}
  271.                 //  if(sec10>=10)        {sec10=0;sec100++;}
  272.                 //         if(sec100>=10)        {sec100=0;sec1000++;}
  273.                 //                 if(sec1000>=8)        {sec100=0;sec1000++;}



  274. }               


  275.           //中断程序
  276. void ex0() interrupt 0
  277. {
  278.         IE0=0;
  279.         num=0;
  280. //        jishuqi++;        //软起过程的半波个数
  281.         TR0=1;          //交流过零点的时候,清楚标志、计数变量并启动定时器。 /
  282. //        cf=0;
  283. sec1++;
  284.    if(sec1>=10){sec1=0;jishuqi++;}                                        //sec可以改移相角导通时间
  285.         //jishuqi=1;         
  286.          if(jishuqi>=7){jishuqi=7;}                                        //sec可以改移相角导通时间           

  287. }                                 
复制代码



评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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