本帖最后由 15240718601 于 2018-1-29 22:02 编辑
单片机能正确检查到过零脉冲,但是延时移相程序控制不了灯泡亮度,只是偶尔慢闪,跳动的特别厉害。
电路原理图:
原理图
实体图
过零检测波形
过零检测波形
可控硅调光的单片机源码:
- #include <reg52.h>//12c5a60s2单片机代码
- sbit beep=P2^0;
- sbit pwmb=P3^3;
- sbit key=P3^4;
- unsigned int a,m,n,z,i,vaule,num;
- void delay_ms(unsigned int z)
- {
- unsigned int m,n;
- for(m=z;m>0;m--)
- for(n=880;n>0;n--);
- }
- void delay90us(void) //误差 0us
- {
- unsigned char a,b;
- for(b=3;b>0;b--)
- for(a=13;a>0;a--);
- }
- void di(){beep=0;delay_ms(50);beep=1;delay_ms(50);}
- void int0_init() //外部中断0初始化函数
- {
- EA = 1; //打开总中断
- IT0 = 1; /*设置中断触发方式:
- ITx = 0; // 低电平触发
- ITx = 1; // 下降沿 */
- EX0 = 1; //打开外部中断
- }
- void InitTimer0(void)
- {
- TMOD = 0x01;
- TH0=0xff;//定时0.1ms
- TL0=0x9c;
- EA = 1;
- ET0 = 1;
- //TR0 = 1;
- }
- void main()
- {
- int0_init();
- InitTimer0();
- pwmb=1;
- while(1)
- {
- EA=1;
- if(key==0)
- {
- EA=0;
- delay_ms(10);
-
- if(key==0)
- {
- di();
- if(vaule==100)
- vaule=0;
- while(!key);
- vaule++;
- }
- EA=1;
- }
- }
- }
- void int0_isr(void) interrupt 0 //外部中断0服务函数
- {
- i++;
- TR0=1;
- }
- void Timer1Interrupt(void) interrupt 1
- {
- unsigned char i;
- TH0=0xff;//定时0.1ms
- TL0=0x9c;
- a++;
- num++;
- if(num==vaule) //改变num的值即可改变移相触发时间,即改变负载功率大小。num的范围:0<num<100
- {
- TR0=0;
- num=0;
- pwmb=0; //触发MOC3061导通,即触发可控硅导通
- for(i=0;i<5;i++);//延时2us
- pwmb=1;
- TH0=0xff;//定时0.1ms
- TL0=0x9c;
- }
- }
复制代码 |