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

專注電子技術(shù)學(xué)習(xí)與研究
當(dāng)前位置:單片機教程網(wǎng) >> MCU設(shè)計實例 >> 瀏覽文章

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

作者:佚名   來源:本站原創(chuàng)   點擊數(shù):  更新時間:2012年02月02日   【字體:

   這是一個用51單片機通過過零檢測來調(diào)整可控硅的導(dǎo)通角從而實現(xiàn)調(diào)光調(diào)壓,其中過零電路用一個p620光耦,220v這端的電阻是40k,這是一個已經(jīng)有成熟應(yīng)用的例子,現(xiàn)在公開給51hei單片機論壇的網(wǎng)友.

視頻演示:

全部代碼下載:http://m.zg4o1577.cn/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最大值255
unsigned char scankey();


sbit PWM_PIN= P1^0;
sbit PWM_TESTLED= P1^2;
/*在
 /INT0為過零檢測,36v,注意安全!! 外接了兩個按鍵,用來調(diào)整占空比;

  注意由于P1.1口也控制繼電器,因此杜絕字節(jié)賦值,不要出現(xiàn)如P1=1;
 如果把 PWM 波形的頻率提高,也可以用 LED 觀察到漸亮漸暗的效果,目前看,只是閃爍的時間發(fā)生變化。
  220v調(diào)光設(shè)定為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  //單位次,調(diào)光多少級?推薦10級,比較合理(實際只能顯示7級,請加MAP映射處理!);20級的話到13級就會出現(xiàn)誤判讀!
//GRADE固定為10,以便完成9級調(diào)光!!!sw除開滅是8級調(diào)光,號稱10級!
#define CELL  (9216/GRADE)     //10為半個市電周期,一個波
//#define CELL  10000  //10000us,實際是9216
#define KEYPRESSTIME  7  //10ms,key bound delay time

int iShiftPoint;
int b; //b一定要有符號整型!
uint timemultiplex;
uint timemultiplex_maxvalue;
//------------------------------------------
void main()
{
	PWM_PIN = 0; //先關(guān)了PWM,免得一開始就給5V導(dǎo)通220V了!!安全考慮!!
timemultiplex_maxvalue=3;
timemultiplex=1;	
	//外部過零中斷
	IT0 = 1; //1為邊沿觸發(fā)
	EX0 = 1;
	//開啟定時中斷
	TMOD = 0x01;                 //T0定時方式1
    b =8;//初亮度調(diào)整
	iShiftPoint=b;
	TH0 = (65536-CELL*iShiftPoint) / 256;   //歷史:50ms@12MHz,這里定時沒意義,通過外中斷過零定時
	TL0 = (65536-CELL*iShiftPoint) % 256;
	ET0 = 1;
	TR0 = 1;//TR0 = 1;定時只是為了計算延時時長!10ms即10000us,分成10種時長,由t1產(chǎn)生這10種時長
//定時器1初始化:
	TMOD |= 0x10;                 //T1定時方式1
	TH1 = (65536-_50us) / 256;   
	TL1 = (65536-_50us) % 256;
	ET1 = 1;
	TR1 = 1;//TR0 = 1;定時只是為了計算延時時長!10ms即10000us,分成10種時長,由t1產(chǎn)生這10種時長

	EA = 1;


//調(diào)光級別從0到4共5級別 能調(diào)光級別811~910
#define MAXAA 998
#define MINAA 11
         while(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 (b<MINAA)
				 b=MINAA;
			b+=30;
			delaySTD_ms(500);
			continue;
//以上為自動化按鍵測試			

       //  while(1)
	//	{
	//		unsigned char buf;
			buf=scankey();
		 	if(buf==1)  //調(diào)滅
				{
					b++;
				}
		 	if(buf==2)
				{//二鍵調(diào)亮。b--是亮,765,從滅到月牙到亮
					b--;
				}
		 	if(buf==3)
				{//3鍵盤關(guān)閉繼電器,同時也得關(guān)PWM燈才得滅;再按一次3鍵,則全亮
					PWM_PIN=!PWM_PIN;
				}
			if (b>(GRADE-1)) b=LEVEL4;//仍然最亮   //歷史:在這里調(diào)整周期.不能無限增加
			if (b<0)  	 b=LEVEL0;//必須設(shè)置為>20,<1,不能設(shè)置為>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 
{
//過零檢測,來個中斷就表過零了,過零時才能重新基準(zhǔn)一次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次外部中斷產(chǎn)生,其滅會等待CELL*iShiftPoint us之后就開pwm,直至下次過零點關(guān)掉 ;CELL*iShiftPoint us由定時器來計算
	PWM_PIN = 1;       

/*
//隨便兩語句延時
for (i=0;i<100;i++)
{
   			_nop_();
			_nop_();
			_nop_();
}
*/

	TR1 = 0;
	TH1 = (65536-_50us) / 256;   //歷史:50ms@12MHz,這里定時沒意義,通過外中斷過零定時
	TL1 = (65536-_50us) % 256;
	TR1 = 1;
		//關(guān)要!
//		PWM_PIN = 0;//亮個4us關(guān),效果比一直亮好

}
//------------------------------------------ 

void time1(void) interrupt 3 
{
    timemultiplex++;
	if (timemultiplex==timemultiplex_maxvalue)
	{
		timemultiplex=0;
		//關(guān)要!
		PWM_PIN = 0;
	}
}


/*********************************************************/ 
// 延時子程序 
/*********************************************************/ 
void delaySTD_ms(uchar ms)  // 標(biāo)準(zhǔn)延時毫秒@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表示沒按鍵按下,更表示誤按了快速彈起了。
}
關(guān)閉窗口

相關(guān)文章

51Hei缂傚倷绶¢崰妤呭磿閹惰棄绠圭憸鏃堢嵁閹烘惟闁靛ǹ鍎抽ˇ锟�
主站蜘蛛池模板: 亚洲精品tv | 免费看黄色大片 | 午夜网 | 一区二区不卡 | 亚洲男人的天堂在线观看 | 久久九九免费视频 | 视频一区二区三区在线观看 | 亚洲欧美在线播放 | 800av在线播放 | 少妇综合| 国产精品美女在线观看 | 国产精品一区二区三区四区 | 成人免费视频国产免费 | 亚洲天堂网址 | 久久久久久一区 | 手机av在线| 成人激情视频网 | 成人免费看片98欧美 | 久久天天躁狠狠躁夜夜躁2014 | 三级黄色网址 | 国产精品成人免费视频 | 免费黄网站 | 日韩有码在线视频 | 国产精品一二三 | 夜夜夜夜操 | 国产福利在线 | 亚洲免费大片 | 超碰福利在线 | 国产在线一区二区三区 | 岛国在线视频 | 成人久久av | 91超碰人人| 欧美理论片在线观看 | 亚洲一区二区欧美 | 色婷婷免费视频 | 国产精品国产三级国产专区52 | 亚洲国产福利 | 欧美黄色片视频 | 在线a| 国产成人在线观看免费网站 | 天天看片天天爽 |