|
本帖最后由 15240718601 于 2018-1-29 22:02 編輯
單片機能正確檢查到過零脈沖,但是延時移相程序控制不了燈泡亮度,只是偶爾慢閃,跳動的特別厲害。
電路原理圖:
原理圖
實體圖
過零檢測波形
過零檢測波形
可控硅調(diào)光的單片機源碼:
- #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初始化函數(shù)
- {
- EA = 1; //打開總中斷
- IT0 = 1; /*設(shè)置中斷觸發(fā)方式:
- ITx = 0; // 低電平觸發(fā)
- 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服務(wù)函數(shù)
- {
- i++;
- TR0=1;
- }
- void Timer1Interrupt(void) interrupt 1
- {
- unsigned char i;
- TH0=0xff;//定時0.1ms
- TL0=0x9c;
- a++;
- num++;
- if(num==vaule) //改變num的值即可改變移相觸發(fā)時間,即改變負載功率大小。num的范圍:0<num<100
- {
- TR0=0;
- num=0;
- pwmb=0; //觸發(fā)MOC3061導(dǎo)通,即觸發(fā)可控硅導(dǎo)通
- for(i=0;i<5;i++);//延時2us
- pwmb=1;
- TH0=0xff;//定時0.1ms
- TL0=0x9c;
- }
- }
復(fù)制代碼 |
-
當(dāng)觸發(fā)脈沖相位超出過零區(qū)間時燈泡反而不亮!
-
當(dāng)觸發(fā)電平在過零區(qū)間時,燈泡就亮
|