基于51单片机的可控硅调压调光程序-带过零检测

它的程序,主要是过零检测(INT0)和触发信号(INT1)给可控硅的控制极一个信号怎么写,还有用三个按键控制开关、加、减来控制灯亮暗怎么写,总的来说就是程序怎么写啊,C的

程序:
#include<reg52.h>
#include<intrins.h>
sbitledRS=P1^0;
sbitledRW=P1^1;
sbit ledE=P1^2;
sbit keyjia=P2^7;
sbitkeyjian=P2^6;
sbitcontrolLD=P1^3;
bitflag1=1;
bitflag2=1;
unsigned
char code table[]=" guang liangdu
";
unsignedchar code table1[]=" 00 ";
intnum,flag=0,count=0;
charliangdu=3;
voiddelaykt(void) //导通延时
{
unsigned char a;
for(a=2;a>0;a--);
}
voiddelay(int z) //可调延时
{
unsigned x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void
delay9ms(void) //误差
-0.43402777778us 延时9ms
{
unsigned char a,b,c;
for(c=1;c>0;c--)
for(b=224;b>0;b--)
for(a=17;a>0;a--);
}
voidwrite_com(unsigned com) //写指令
{
ledRS=0;
P0=com;
delay(10);
ledE=1;
delay(20);
ledE=0;
}
voidwrite_date(unsigned date) //写数据
{
ledRS=1;
P0=date;
delay(10);
ledE=1;
delay(20);
ledE=0;
}
voidwrite_liangdu(unsigned liangdu) //写亮度
{
int shi,ge;
shi=(liangdu-3)/10;
ge=(liangdu-3)%10;
write_com(0x80+0x40+7);
write_date(0x30+shi);
write_date(0x30+ge);
}
voidinit() //初始化
{
controlLD=1; //触发控制初始化
ledRW=0; //液晶初始化
ledE=0;
write_com(0x38);
write_com(0x0c);
write_com(0x06);
write_com(0x80);
for(num=0;num<15;num++)
{
write_date(table[num]);
delaykt();
}
write_com(0x80+0x40);
for(num=0;num<15;num++)
{
write_date(table1[num]);
delaykt();
}
EA=1; //外部中断设置
EX0=1;
IT0=1;
}
voidkeyscanf() //键盘判断
{
if(keyjia==0) //加键判断
{
delaykt();
if(keyjia==0)
{
if(flag1==1)
{
flag1=0;
liangdu++;
if(liangdu==10)
liangdu=3;
write_com(0x80+0x40+7);
write_liangdu(liangdu);
}
}
}
else if(keyjia!=0)
{
delaykt();
if(keyjia!=0)
flag1=1;
}
if(keyjian==0) //减键判断
{
delaykt();
if(keyjian==0)
{
if(flag2==1)
{
flag2=0;
liangdu--;
if(liangdu==2)
liangdu=9;
write_com(0x80+0x40+7);
write_liangdu(liangdu);
}
}
}
else if(keyjian!=0)
{
delaykt();
if(keyjian!=0)
flag2=1;
}
}
voidzhongduan() interrupt 0 //外部中断
{
flag=1;
}
voidtimepd() //同步标志判断与定时器设置
{
if(flag==1)
{
flag=0;
TMOD=0x01;
TH0=(65536-1000*(10-liangdu))/256;
TL0=(65536-1000*(10-liangdu))%256;
ET0=1;
TR0=1;
}
}
voidtime0() interrupt 1 //定时中断程序
{
count=1;
}
voidchufa() //MOS3020触发
{
if(count==1)
{
count=0;
controlLD=0;
delaykt();
controlLD=1;
delay9ms();
controlLD=0;
delaykt();
controlLD=1;
}
}
voidmain()
{
init();
while(1)
{
keyscanf();
timepd();
chufa();
}
}追问

谢谢,我先慢慢看看!那个不好意思,我想问下有图吗,因为看起来有点困难

追答

实物的图就有,电路图懒得去画了

温馨提示:内容为网友见解,仅供参考
无其他回答

关于用51单片机通过可控硅来调光和过零检测问题的问题???求解,感激...
我用可控硅通过延时改变导通角来调压,可是过零检测电路单独检测时有100hz的信号,接到单片机外部中断0就检测不到信号了,怎么回事?源程序:#include<reg51.h>typedef unsigned char unchar;\/\/void int0(void) ;\/\/同步信号sbit sw=P1^0; \/\/开关 sbit keyjia=P1^1; \/\/亮++ sbit keyjian=P1^2; \/\/暗--...

51单片机控制可控硅
控制的设备功率再大了最是要过零检测了。用继电器可以免去隔离了,而且控制也容易,单片机控制一个三极管,再由三极管去驱动继电器,如果继电器很多的话,用三极管有点麻烦,就用ULN2803,一片可以控制8个继电器。要是用可控硅控制最好有过零检测,但必须要用光电隔离了。要实现过零检测,要是外加检测电路...

过零检测可控硅调光,为什么要过零检测呢?可不可以就用pwm控制,改变高低...
必须过零检测,可控硅导通以后就不受控制了,关断条件是电流小于最小维持电流。对灯泡来讲也就是过零时刻。 yylrhyyl | 发布于2012-05-11 举报| 评论 3 0 可以,在设定的周期 Tc 内,Tc 通常为一秒,触发信号使主回路接通几个周波(几个完整的正弦波),再断开 几个周波(几个完全的正弦波),改变晶闸管在设定...

单片机控制可控硅调压程序
可控硅必须检测过零信号。只有零点以后触发,才会有效。而且在下一个零点到来的时候,可控硅会自动关闭。你这个程序里面只有一句P=1,没有P=0,那么这个端口一直开启,没有关闭。负载将一直投入。不可能关闭。所以,根本不可能调压!想要调压:1、增加一个过零检测电路。2、每次触发以后,过一段时间必须...

用51单片机 调光
实现你的要求有简单的办法,就是采用单片机产生可控的PWM(PWM(Pulse Width Modulation)控制——脉冲宽度调制技术。 通过对一系列脉冲的宽度进行调制,来等效地获得所需要波形(含形状和幅值)。 )通过光电耦合隔离电路并经过驱动放大对双向可控硅G极控制,可控硅和220v电源相连串在灯上 。参考电路:...

怎样利用51单片机发生PWM,通过调节PWM的占空比控制可控硅调节电机转速...
需要利用交流电的作触发信号,单片机生成延迟脉冲,不必使用pwm 注意是调节过零后的延迟时间,再出脉冲。

...可控硅,我不明白为什么有过零检测电路?我单片机一直让光耦导通不就...
过零检测的目的是为了减小对电网的干扰。MOC3021是即时触发的,不带过零检测,使用这种光耦触发可控硅,在开启的瞬间,电流冲击会在电网上形成一个负跳变,幅度由电流的大小决定。这种跳变多了,电网自然就不干净了。所以,如无必要,还是用带过零检测的了。

你好 我用单片机 通过过零检测产生中断 控制可控硅 但是 灯总是闪_百...
还有看你程序似乎是:(moc30=0)先开启可控硅然后根据dw的数值去决定延时多少再关控制信号(moc30=1),但是有一点是,可控硅若不是可控关断的话,就有问题了,普通可控硅是开通之后只要有电流就不会关断,它只会在交流电过零时自动关断.要想达到调光效果,可以这样控制:过零检测后开始延时(根据dw的数值...

单片机中50hz交流电过零检测电路的作用
过零检测的作用可以理解为给主芯片提供一个标准,这个标准的起点是零电压,可控硅导通角的大小就是依据这个标准。也就是说塑封电机高、中、低、微转速都对应一个导通角,而每个导通角的导通时间是从零电压开始计算的,导通时间不一样,导通角度的大小就不一样,因此电机的转速就不一样。另外更为关键...

大神们,使用51单片机编写过零检测程序,再延时输出,来控制晶闸管该怎么编 ...
过零检测是硬件电路实现的,单片机做不到。单片机可以检测下降沿,再延时。

相似回答