<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 設計應用 > 基于51單片機的可控硅調壓調光程序-帶過零檢測

          基于51單片機的可控硅調壓調光程序-帶過零檢測

          作者: 時間:2012-08-06 來源:網(wǎng)絡 收藏
          這是一個用通過過零檢測來調整的導通角從而實現(xiàn)調光調壓,其中過零電路用一個p620光耦,220v這端的電阻是40k,這是一個已經(jīng)有成熟應用的例子.

          全部代碼下載:http://www.51hei.com/f/kkggl.rar

          以下是c51源代碼部分:#include reg52.H>	  #include "intrins.h" #define	_50msL_	50000*0.9216#define	_50msH_	50000*0.9216#define	_1ms_	922#define	_10ms_	9216#define	_50us	46    //50*0.9216#define uchar unsigned char  #define uint unsigned int void delaySTD_ms(uchar ms); // 延時毫秒@12M,ms最大值255unsigned char scankey();sbit PWM_PIN= P1^0;sbit PWM_TESTLED= P1^2;/*在 /INT0為過零檢測,36v,注意安全??! 外接了兩個按鍵,用來調整占空比;注意由于P1.1口也控制繼電器,因此杜絕字節(jié)賦值,不要出現(xiàn)如P1=1; 如果把 PWM 波形的頻率提高,也可以用 LED 觀察到漸亮漸暗的效果,目前看,只是閃爍的時間發(fā)生變化。220v調光設定為1kHz@12M,每周期1000us,分為10次比較合理,每CELL為1000us!*/sbit    key1pressed= P1^5;sbit    key2pressed= P1^6;sbit    key3pressed= P1^7;#define LEVEL0 0#define LEVEL1 1#define LEVEL2 2#define LEVEL3 3#define LEVEL4 4#define GRADE 10  //單位次,調光多少級?推薦10級,比較合理(實際只能顯示7級,請加MAP映射處理!);20級的話到13級就會出現(xiàn)誤判讀!//GRADE固定為10,以便完成9級調光!!!sw除開滅是8級調光,號稱10級!#define CELL  (9216/GRADE)     //10為半個市電周期,一個波//#define CELL  10000  //10000us,實際是9216#define KEYPRESSTIME  7  //10ms,key bound delay timeint iShiftPoint;int b; //b一定要有符號整型!uint timemultiplex;uint timemultiplex_maxvalue;//------------------------------------------void main(){PWM_PIN = 0; //先關了PWM,免得一開始就給5V導通220V了!!安全考慮??!timemultiplex_maxvalue=3;timemultiplex=1;	//外部過零中斷IT0 = 1; //1為邊沿觸發(fā)EX0 = 1;//開啟定時中斷TMOD = 0x01;                 //T0定時方式1b =8;//初亮度調整iShiftPoint=b;TH0 = (65536-CELL*iShiftPoint) / 256;   //歷史:50ms@12MHz,這里定時沒意義,通過外中斷過零定時TL0 = (65536-CELL*iShiftPoint) % 256;ET0 = 1;TR0 = 1;//TR0 = 1;定時只是為了計算延時時長!10ms即10000us,分成10種時長,由t1產生這10種時長//定時器1初始化:TMOD |= 0x10;                 //T1定時方式1TH1 = (65536-_50us) / 256;   TL1 = (65536-_50us) % 256;ET1 = 1;TR1 = 1;//TR0 = 1;定時只是為了計算延時時長!10ms即10000us,分成10種時長,由t1產生這10種時長EA = 1;//調光級別從0到4共5級別 能調光級別811~910#define MAXAA 998#define MINAA 11while(1){unsigned char buf;//以下為自動化按鍵測試b =MINAA;if (b>MAXAA) {//	delaySTD_ms(500);//	delaySTD_ms(500);			//	delaySTD_ms(500);//	delaySTD_ms(500);//		b=MINAA;PWM_PIN=0;EA=0;}if (bMINAA)b=MINAA;b+=30;delaySTD_ms(500);continue;//以上為自動化按鍵測試			//  while(1)//	{//		unsigned char buf;buf=scankey();if(buf==1)  //調滅{b++;}if(buf==2){//二鍵調亮。b--是亮,765,從滅到月牙到亮b--;}if(buf==3){//3鍵盤關閉繼電器,同時也得關PWM燈才得滅;再按一次3鍵,則全亮PWM_PIN=!PWM_PIN;}if (b>(GRADE-1)) b=LEVEL4;//仍然最亮   //歷史:在這里調整周期.不能無限增加if (b0)  	 b=LEVEL0;//必須設置為>20,1,不能設置為>19,0,否則最后亮了就熄滅一下iShiftPoint=b;//other while/*delaySTD_ms(500);delaySTD_ms(500);			delaySTD_ms(500);delaySTD_ms(500);timemultiplex_maxvalue++;if (timemultiplex_maxvalue>40) timemultiplex_maxvalue=40;*/}}//------------------------------------------void X0_INT(void) interrupt 0 {//過零檢測,來個中斷就表過零了,過零時才能重新基準一次10ms。//   EA = 0;TR0=0;//	PWM_PIN = 0;	TH0 = (65536-CELL*iShiftPoint) / 256;   //1000ms@12MHz,這里定時沒意義,只是個時間流逝。通過外中斷過零定時TL0 = (65536-CELL*iShiftPoint) % 256;   TR0=1;//	EA = 1;}void time0(void) interrupt 1 {/*TR0 = 0;TH0 = (65536-CELL*iShiftPoint) / 256;   //歷史:50ms@12MHz,這里定時沒意義,通過外中斷過零定時TL0 = (65536-CELL*iShiftPoint) % 256;TR0 = 1;*/int i;// 1次外部中斷產生,其滅會等待CELL*iShiftPoint us之后就開pwm,直至下次過零點關掉 ;CELL*iShiftPoint us由定時器來計算PWM_PIN = 1;       /*//隨便兩語句延時for (i=0;i100;i++){_nop_();_nop_();_nop_();}*/TR1 = 0;TH1 = (65536-_50us) / 256;   //歷史:50ms@12MHz,這里定時沒意義,通過外中斷過零定時TL1 = (65536-_50us) % 256;TR1 = 1;//關要!//		PWM_PIN = 0;//亮個4us關,效果比一直亮好}//------------------------------------------ void time1(void) interrupt 3 {timemultiplex++;if (timemultiplex==timemultiplex_maxvalue){timemultiplex=0;//關要!PWM_PIN = 0;}}/*********************************************************/ // 延時子程序 /*********************************************************/ void delaySTD_ms(uchar ms)  // 標準延時毫秒@12M,ms最大值255    {    uchar i;    while(ms--)    for(i = 0; i  124; i++);    } //那個鍵按下返回幾unsigned char scankey(){if (key1pressed==0){delaySTD_ms(KEYPRESSTIME);if (key1pressed==0){while(!key1pressed);delaySTD_ms(KEYPRESSTIME);return 1;}}if (key2pressed==0){delaySTD_ms(KEYPRESSTIME);if (key2pressed==0){while(!key2pressed);delaySTD_ms(KEYPRESSTIME);return 2;}}if (key3pressed==0){delaySTD_ms(KEYPRESSTIME);if (key3pressed==0){while(!key3pressed);delaySTD_ms(KEYPRESSTIME);return 3;}}return 0;  //0表示沒按鍵按下,更表示誤按了快速彈起了。}

          光耦相關文章:光耦原理


          可控硅相關文章:可控硅工作原理


          pwm相關文章:pwm是什么


          51單片機相關文章:51單片機教程


          調光開關相關文章:調光開關原理


          評論


          相關推薦

          技術專區(qū)

          關閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();