- #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();//发脉冲
- }
|