资讯详情

C51单片机控制40w调光电源C语言程序

C51单片机控制40w调光电源C语言程序,12M晶振,500Hz 2ms,1000Hz 1ms,300Hz 3.3ms,330Hz 3ms 。3ms30个周期us中断一次,可中断100次, 中断次数n即占空比D,调光分为3档,33% 66% 100%。

#include

#define uchar unsigned char

#define uint unsigned int

#define ulong unsigned long

/************* 1、红外遥控 *****************/

uchar code table_duan[16]=

{

0x3F,0x06,0x5B,0x4F,0x66,

0x6D,0x7D,0x07,0x7F,0x6F,

0x77,0x7C,0x39,0x5E,0x79,0x71

};

uchar code table_wei[8]=

{

0xE3,0xE7,0xEB,0xEF,

0xF3,0xF7,0xFB,0xFF

};

#define Imax14000

#define Imin8000

#define Inum1 1450

#define Inum2 700

#define Inum3 3000

uchar Im[4]={0x00,0x00,0x00,0x00};

uchar show[2]={0,0};

ulong mm,Tc;

uchar IrOK;

uchar ff;

uchar t_display;

/************* 1、红外遥控 *****************/

uchar aa,bb,cc,ss;

#define D333 ///调光等级

#define D667

#define D100 16

uchar D,n,pwmoff,njk,jkdelay,spkn,spkxx,spkm,spkopen,spkclose;

sbit pwm1=P3^0;//外部中断0 P3.2IR

sbit pwm2=P3^4;

sbit jk4=P3^7; //大

sbit jk3=P1^0; //中

sbit jk2=P1^5; //小

sbit jk1=P1^7; //ON/OFF

sbit spk1=P3^1;

void delay(uint z)

{

uint x,y; //x,y为局部变量,只在当前函数出现并有效

for(x=z;x>0;x--)

for(y=200;y>0;y--);

}

///

void IR_code(void)interrupt 0 using 1 //P3^2 外部中断0

{

Tc=TH0*256 TL0; ////提取中断间隔长

TH0=0;

TL0=0;

if(Tc>Imin&&Tc

{

mm=0;

ff=1;

return; ///直接跳出中断,没有返回值 (下一步不执行if)

}

if(ff==1) //ff=1找到启始码

{

if(Tc>Inum1&&Tc

{

Im[mm/8]=Im[mm/8]>>1|0x80; // | 按位“或” 0x80=10000000

mm ;

}

if(Tc>Inum2&&Tc

{

Im[mm/8]=Im[mm/8]>>1; //取码

mm ;

}

if(mm==32)

{

mm=0;

ff=0;

if(Im[2]==~Im[3])

{

IrOK=1;

}

else {IrOK=0;} ///取码后判断读码是否正确

}

///准备读下一码

}

}

//定期中断1

void timer1() interrupt 3 using 2 ///定时器1中断

{

TH1=(65536-200)/256;

TL1=(65536-200)%6;

t_display ;

n ;

if(n==16)

n=0; //n=16时周期约3.3ms,300Hz

if(spkopen==1) //开蜂鸣器

{

spk1=0;

spkn ;

if(spkn==150) //响一次

{

spkn=0;

spk1=1; //关蜂鸣器

spkm--; ///响的次数spkm

if(spkm==0)

{

spkopen=0;

spkclose=0;

}

else {spkopen=0; spkclose=1; }

}

}

if(spkclose==1)

{

spkn ;

if(spkn==150)

{

spkopen=1; //开蜂鸣器

spkclose=0;

}

}

if(jkdelay==1)

{

njk ;

if(njk==150)

{

njk=0; //n=150时约30ms,继电器安全运行时间

switch (spkxx)

{

case 0x1c:jkdelay=0;jk2=0;jk1=0;

break;

case 0x0d:jkdelay=0;jk3=0;jk1=0;

break;

case 0x0e:jkdelay=0;jk4=0;jk1=0;

break;

default:

break;

}

} }

if(aa==1)

bb ; //第二步,去抖计数。

}

void start()

{

t_display=0;

aa=0;

bb=0;

cc=0;

ss=0;

}

void pwm()

{

if(pwmoff==0)

{

if(n<=D)

{

pwm1=0;

pwm2=0;

}

if(n>D)

{

pwm1=1;

pwm2=1;

}

}

}

void main()

{

delay(100);

pwm1=1;//

pwm2=1;//

jk4=1; //大

jk=1; //中

jk2=1; //小

jk1=1; //ON/OFF

spk1=1;

D=D100;

start();

mm=0;

ff=0;

IT0=1; //外部中断0下降沿触发

EX0=1; //开外部中断0 P3^2 外部中断0    ,P3^3 外部中断1

EA=1;  //开总中断

TMOD=0x11; //0x11=00010001 设置T0、T1为16位定时器

TH0=0;

TL0=0;

TR0=1; //开T0计时

TH1=(65536-100)/256;

TL1=(65536-100)%256;

ET1=1;

TR1=1;

while(1)

{

if(IrOK==1)

{

show[1]=Im[2]&0x0f;     //取键码的低四位 0x0f=00001111;

show[0]=Im[2]>>4;     //取键码的高四位

if(Im[2]==spkxx)

{spkm=2;}     //设置蜂鸣器响的次数

else {spkm=1;}

switch (Im[2])

{

case 0x04:spkopen=1;pwmoff=1;pwm1=1;pwm2=1;    //关灯

break;

case 0x10:spkopen=1;pwmoff=0;D=D33;

break;

case 0x0a:spkopen=1;pwmoff=0;D=D66;

break;

case 0x03:spkopen=1;pwmoff=0;D=D100;

break;

case 0x48:spkopen=1;jk1=1;    //关电机   其实3个继电器就能搞定了jk2=0;jk3=0;jk4=0;

break;

case 0x1c:spkopen=1;jkdelay=1;jk2=1;jk3=1;jk4=1;

break;

case 0x0d:spkopen=1;jkdelay=1;jk2=1;jk3=1;jk4=1;

break;

case 0x0e:spkopen=1;jkdelay=1;jk2=1;jk3=1;jk4=1;

break;

default:

break;

}

IrOK=0;

spkxx=Im[2];

Im[2]=0xff;

}

pwm();

}

}

标签: 7d计数继电器

锐单商城拥有海量元器件数据手册IC替代型号,打造 电子元器件IC百科大全!

锐单商城 - 一站式电子元器件采购平台