- #include<reg52.h>
- #include<intrins.h>
- #define uint unsigned int
- #define uchar unsigned char
- sbit SW1=P2^0;//用于調高燈的亮度
- sbit SW2=P2^1;//用于調低燈的亮度
- sbit CF=P2^2;//用于觸發可控硅
- sbit SW3=P2^3;//用于控制燈的亮滅
- void kdelay();
- void maichong();
- delay500us(uint z);
- void delay10us();
- void liangmie();
- uint x,y,z,k,i,j;
- void main()
- {
- IT0=1;//設定外部中斷 0 為下降沿觸發方式
- EX0=1;//開外部中斷 0
- P2=0xff;
- z=10;
- j=0;
- while(1)
- {
- if(SW1==0)
- {
- kdelay(); //軟件 2ms 延時防抖
- if(SW1==0)
- {
- z--;
- if(z==0){z=19;}//燈達到最亮以后繼續按下 SW2,燈會變到最暗
- }
- while(!SW1);//等待按鍵彈起
- }
- if(SW2==0)
- {
- kdelay();
- if(SW2==0)
- {
- z++;
- if(z==20){z=0;}//燈達到最暗以后繼續按下 SW1,燈會變到最亮
- }
- while(!SW2);
- }
- liangmie();
- if(j==0)
- {
- EA=1; //開總中斷
- }
- else
- {
- EA=0; //關總中斷
- }
- }
- }
- /************2ms 按鍵防抖動延時函數**********/
- void kdelay()
- {
- for(i=0;i<200;i++)
- {
- delay10us(); //調用 200 次 10us 約為 2ms
- }
- }
- /*將半周期 0.01 秒平均分成 20 等分,每等分為 0.5 毫秒,即 500us*/
- /************0.5ms 倍數的子函數************/
- delay500us(uint z)
- {
- uchar x,y;
- for(x=0;x<z;x++)
- {
- for(y=0;y<50;y++)
- {
- delay10us();//調用 50 次 10us 約為 502us
- }
- }
- }
- /*************脈沖函數*****************/
- void maichong()
- {
- CF=0;
- for(k=0;k<10;k++)
- {
- delay10us();//調用 10 次 10us 約為 102us
- }
- CF=1;
- }
- /*************10us 延時函數**************/
- void delay10us()
- {
- _nop_(); _nop_();_nop_();
- _nop_(); _nop_();_nop_();
- }
- /************燈的亮滅控制函數***********/
- void liangmie()
- {
- if(SW3==0)
- {
- kdelay();
- if(SW3==0)
- {
- j++;
- if(j==2){j=0;}
- }
- while(!SW1);//等待按鍵彈起
- }
- }
- /**********外部中斷 0 函數**********/
- void Int0(void) interrupt 0
- {
- delay500us(z);//控制角的大小由 z 決定
- maichong();//發脈沖
- }
|