电力电子制作设计报告AT89C51主控.docx
《电力电子制作设计报告AT89C51主控.docx》由会员分享,可在线阅读,更多相关《电力电子制作设计报告AT89C51主控.docx(23页珍藏版)》请在冰点文库上搜索。
![电力电子制作设计报告AT89C51主控.docx](https://file1.bingdoc.com/fileroot1/2023-6/13/e64f0cd8-823c-493e-9674-e2ead5620596/e64f0cd8-823c-493e-9674-e2ead56205961.gif)
电力电子制作设计报告AT89C51主控
《电力电子制作设计报告》
专业及班级09自动化
(2)班
组长
组员
指导老师李秀娟张为堂
完成时间
电力电子实验制作设计报告
遥控调光控制器
一、调光控制器设计思想
在日常生活中,我们常常需要对灯光的亮度进行调节。
本调光控制器通过单片机控制双向可控硅的导通来实现白炽灯(纯阻负载)亮度的调整。
双向可控硅的特点是导通后即使触发信号去掉,它仍将保持导通;当负载电流为零(交流电压过零点)时,它会自动关断。
所以需要在交流电的每个半波期间都要产生触发信号,触发信号产生时间的长短(触发角的大小)就决定了灯泡的亮度。
调光的实现方式就是在交流电源信号过零点后一段时间触发双向可控硅开关的导通,称这段时间为双向可控硅的触发角。
触发角越大,导通时间越长,可控硅导通的时间越短,灯的亮度就越低;反之,灯就越亮。
这就要求确定交流电源同步信号的过零点,并以此为基础,控制触发信号触发角的大小,达到白炽灯亮度调节的目的。
二、硬件电路部分
本调光控制器的框图如下:
控制部分:
为了便于灵活设计,选择可多次写入的可编程器件,本设计方案中选用的是ATMEL公司生产的AT89C51单片机。
驱动部分:
由于驱动的对象是交流负载,且为了实现连续调节的目的,本电路中采用了无触点开关元件双向可控硅。
双向可控硅能够对交流电源的导通进行无触点连续控制,以小电流控制大电流,且动作快、寿命长、可靠性高。
负载部分:
本电路的负载是白炽灯(纯阻负载)。
(一)交流电源同步信号
交流电源同步信号的产生如图2电路所示,图中的同步信号就是我们需要的交流电压过零点信号。
各部分波形如图3所示。
图中整流后波形中的水平虚线表示光藕P52l输入二极管的门限电压。
P521是TLP521的简称,下图是其引脚图。
图2过零检测电路
图3同步信号波形图
图4P521引脚图
(二)单片机控制部分:
主控单元以AT89C51单片机为核心,交流电压过零点信号提取电路中产生的同步信号SYN接到AT89C5l的INT0,此信号的下降沿将使AT89-C51产生中断,以此为延时时间的起点。
图5单片机控制电路
(3)主控部分
图6主控电路
图中,CL是单片机输出的触发信号,该信号通过光控可控硅MOC3022去驱动可控硅T435。
受控的白炽灯接在Ll和零线(图中未画出)之间。
MOC3022是DIP-6封装的光控可控硅。
其1、2脚分别为二极管的正、负极:
4、6脚为输出回路的两端;3、5脚不用连接。
如图8所示。
图7MOC3022引脚图
图中的阴影部分表示可控硅的导通区间,它的大小决定了灯的亮度。
改变延时时间可改变触发信号和同步信号的相位关系,也改变了可控硅的导通区间的大小,达到调光的目的。
220V交流主电源导通区间、同步信号和触发信号的时序关系如图6所示。
图8主电源导通区、同步信号和触发信号时序图
(四)红外接收电路
(五)电路整体接线图
(4)元器件的清单:
见附件二
(5)相关计算:
1、与可控硅相连的电阻回路计算
当MOC3022导通时,可控硅门极所加电压:
U=180*220/(1000+180)=33.5V
可以驱动可控硅所以选1k
和180
2、光耦MOC3022所在回路相关计算
选择电阻270
的原因:
MOC3022发光二极管侧最小触发电流为10mA,触发电压为1.5V,极限条件下
,所以电阻应该比350小,应该选270
。
因为MOC3022的发光灯驱动电流是10mA,所以可以驱动MOC3022.
3、软件部分
(一)总体思路
1.遥控部分采用常用的由PT2262芯片构成的遥控器加上由解码放大功能的红外接收管SM0038,采用这样的电路比较简单。
2.主控部分采用89C52单片机作为核心处理器,其主要功能有:
(1)进行红外解码
(2)操作ADC0804对光传感器的值进行采样处理
(3)控制1602显示当前亮度,当前模式(自动/手动),亮度级别
(4)对整流过的交流电压进行过零检测(接单片机外部中断)
(5)对晶闸管进行相位控制
(2)设计流程图
(3)程序清单:
见附件一
附件一:
程序清单
主程序:
#include
#include
#include"DISP1602.h"
#include"IRLCD.h"
#include"ADC0804.h"
#defineucharunsignedchar
#defineuintunsignedint
sbitmai=P2^0;
sbitzero=P3^3;
uintad_data[5],light;//AD更新数值
ucharchoose=9,level=0;//亮度级别
externucharMODE;//=1自动=0手动
externucharIRCOM[7];//键码
//函数声明区
voidinit_INT0(void);//0解码开
voidinit_INT1(void);//2过零开
voiddelay_mai(void);//60us
voiddelay_2(ucharchoose);//750us/次
voidMatchLight(uintlight);//亮度匹配
voidmain()
{
init_1602();
init_INT0();//0解码开
init_INT1();//2过零开
DISP_FOUNDFORM();
light=DATA_DEAL(10.0,ad_data);
MatchLight(light);
LCD_NUM(1,5,level,1);
LCD_FLO(2,13,ad_data);
mai=1;
EA=1;
while
(1)
{
if(MODE==1)LCD_STR1(1,10,"AUTO");
elseLCD_STR1(1,10,"MANU");
light=DATA_DEAL(10.0,ad_data);
LCD_NUM(1,5,level,1);
LCD_FLO(2,13,ad_data);
MatchLight(light);
}
}
//按键处理
voidINT0_MESSAGE(void)interrupt0
{
IR_IN();
WRITE_COM(0x80+14);
WRITE_DATA('');//写数据
WRITE_DATA('');
//WRITE_DATA(IRCOM[6]);//写数据
//WRITE_DATA(IRCOM[5]);
if(IRCOM[2]==0x47)
{
if(MODE==1)MODE=0;
elseMODE=1;
}
if(MODE==0)
{
switch(IRCOM[2])
{
case0X0D:
choose=0;
break;
case0X0C:
choose=1;
break;
case0X18:
choose=2;
break;
case0X5E:
choose=3;
break;
case0X08:
choose=4;
break;
case0X1C:
choose=5;
break;
case0X5A:
choose=6;
break;
case0X42:
choose=7;
break;
case0X52:
choose=8;
break;
case0X4A:
choose=9;
break;
/*case0X19:
choose+=1;
if(choose==10)choose=0;
break;
case0X16:
choose-=1;
if(choose<0)choose=9;
break;*/
}
}
}
voidINT1_MESSAGE(void)interrupt2
{
if(choose==0)mai=1;
if(choose==9)mai=0;
if((choose!
=9)&(choose!
=0))
{
delay_2(choose);
mai=0;
delay_mai();
mai=1;
}
}
//子函数
voidinit_INT0(void)//0解码开
{
IT0=1;
EX0=1;
}
voidinit_INT1(void)//2过零开
{
IT1=1;
EX1=1;
}
voiddelay_mai(void)//60us
{
unsignedchara,b;
for(b=1;b>0;b--)
for(a=47;a>0;a--);
}
voiddelay_2(ucharchoose)//750us/次
{
unsignedchara,b,c;
for(c=0;c<9-choose;c++)
for(b=83;b>0;b--)
for(a=3;a>0;a--);
}
voidMatchLight(uintlight)//亮度匹配
{
if((light>=0)&&(light<500))level=0;
if((light>=500)&&(light<1000))level=1;
if((light>=1000)&&(light<1500))level=2;
if((light>=1500)&&(light<2000))level=3;
if((light>=2000)&&(light<2500))level=4;
if((light>=2500)&&(light<3000))level=5;
if((light>=3000)&&(light<3500))level=6;
if((light>=3500)&&(light<4000))level=7;
if((light>=4000)&&(light<4500))level=8;
if(light>=4500)level=9;
if(MODE==1)choose=9-level;
}
AD子模块:
#include"ADC0804.h"
//50us延时子程序
voiddelay_50us(unsignedintt)
{
unsignedcharj;
for(;t>0;t--)
for(j=19;j>0;j--);
}
//读A/D数据子程序
//说明:
当输入电压为5V时,A/D输出为FFH,即输入电压=AD数据*(5/255)=AD数据/(255/5)=AD数据/51
unsignedintREAD_AD()
{
unsignedintad_data;
CS=1;
ADRW=1;
ADRD=1;
delay_50us(20);//转换前准备
CS=0;//允许进行A/D转换
ADRW=0;
delay_50us(5);
ADRW=1;//WR由低变高时,AD开始转换
CS=1;
delay_50us(15);//等待转换完成
ADDATA=0xFF;
CS=0;
ADRD=0;//读取转换数据结果数据结果
delay_50us(5);
ADRD=1;
ad_data=ADDATA;//把数据存到ad_data中
CS=1;//停止A/D读取
returnad_data;
}
//ADC0804读出的数据处理
unsignedintDATA_DEAL(floatn,unsignedcharad_data[])
{
unsignedintx,dianya=0,value,light;
doublelast_value;
for(x=0;x{
dianya+=READ_AD();
}
last_value=dianya/n;
last_value/=51.0;
value=last_value*1000;
light=value;
for(x=0;x<4;x++)
{
ad_data[x]=value%10;
value/=10;
}
returnlight;
}
#include"DISP1602.h"
unsignedcharMODE=1;//自动/手动
voidDELAY_1602(unsignedintz)//延时函数
{
unsignedintn,j;
for(n=z;n>0;n--)
for(j=110;j>0;j--);
}
unsignedcharLCD_BUSY()//读忙指令
{
unsignedcharflag;
RS=0;
RW=1;
E=1;
DELAY_1602
(1);
flag=DATAPORT&0x80;
E=0;
returnflag;
}
voidWRITE_DATA(unsignedchardat)//写数据
{
//while(LCD_BUSY());
DELAY_1602(12);
RS=1;
RW=0;
DELAY_1602
(2);
DATAPORT=dat;
E=1;
DELAY_1602(3);
E=0;
}
voidWRITE_COM(unsignedcharcom)//写指令
{
//while(LCD_BUSY());
DELAY_1602(12);
RS=0;
RW=0;
DELAY_1602
(2);
DATAPORT=com;
E=1;
DELAY_1602(3);
E=0;
}
//------------------初始化1602液晶--------------------------
voidinit_1602()
{
E=0;
WRITE_COM(0x38);//点阵显示
WRITE_COM(0x0c);//开显示、显示光标、光标不闪烁;
WRITE_COM(0x06);//写一个字符地址自动加一且光标加一
WRITE_COM(0x01);
}
//---------------------------------显示字符串(字符型)-------------------------------------------
//---调用格式形如“LCD_STR1(1,2,"TEST");”*str指向的是一个数组的首地址内的内容
voidLCD_STR1(unsignedcharhang,unsignedcharlie,unsignedchar*str)
{
unsignedchara;
if(hang==1)a=0X80;
elsea=0X80+0X40;
a=a+lie-1;
WRITE_COM(a);
while(*str!
='\0')
{
WRITE_DATA(*str);
str++;
}
}
//-------------------------------------------显示单个字符(代码型)-----------------------------------------
//----------------调用格式形如“LCD_STR3(1,2,"T");
voidLCD_STR3(unsignedcharhang,unsignedcharlie,unsignedcharstr)
{
unsignedchara;
if(hang==1)a=0X80;
elsea=0X80+0X40;
a=a+lie-1;
WRITE_COM(a);
WRITE_DATA(str);
}
//---------------------------------显示n位整数-------------------------------------------
//---x为要显示的数字,n为显示的位数
voidLCD_NUM(unsignedcharhang,unsignedcharlie,unsignedintx,unsignedcharn)
{
unsignedchara,d[6];
chari;
if(hang==1)a=0X80;
elsea=0X80+0X40;
a=a+lie-1;
WRITE_COM(a);
for(i=0;i{
d[i]=x%10;
x/=10;
}
for(i-=1;i>=0;i--)
WRITE_DATA(0x30+d[i]);
}
//---------------------------------显示小数-------------------------------------------
//---ad_data[]为要显示的数字
voidLCD_FLO(unsignedcharhang,unsignedcharlie,unsignedcharad_data[])
{
unsignedchara;
if(hang==1)a=0X80;
elsea=0X80+0X40;
a=a+lie-1;
WRITE_COM(a);
WRITE_DATA(0x30+ad_data[3]);
WRITE_DATA('.');
WRITE_DATA(0x30+ad_data[2]);
WRITE_DATA(0x30+ad_data[1]);
WRITE_DATA(0x30+ad_data[0]);
}
//-------------------------------------------显示基本信息-----------------------------------------
voidDISP_FOUNDFORM(void)
{
LCD_STR1(1,1,"LEV:
");
if(MODE==1)LCD_STR1(1,10,"AUTO");
elseLCD_STR1(1,10,"MANU");
LCD_STR1(2,1,"CURRENTLUM:
");
}
中断控制模块:
#include"IRLCD.h"
unsignedcharIRCOM[7];
voidIR_IN(void)
{
unsignedcharj,k,N=0;
EX0=0;
delay(15);//1.9ms
if(IRIN==1)//若是产生的错误0,退出中断
{
EX0=1;
return;
}
//确认IR信号出现
while(!
IRIN)//等IR变为高电平,跳过9ms的前导低电平信号。
{delay
(1);}
for(j=0;j<4;j++)//收集四组数据
{
for(k=0;k<8;k++)//每组数据有8位
{
while(IRIN)//等IR变为低电平,跳过4.5ms的前导高电平信号。
{delay
(1);}
while(!
IRIN)//等IR变为高电平
{delay
(1);}
while(IRIN)//计算IR高电平时长
{
delay
(1);
N++;
if(N>=30)
{
EX0=1;
return;
}//0.14ms计数过长自动离开。
}//高电平计数完毕
IRCOM[j]=IRCOM[j]>>1;//数据最高位补“0”
if(N>=8){IRCOM[j]=IRCOM[j]|0x80;}//数据最高位补“1”
N=0;
}//endfork
}//endforj
if(IRCOM[2]!
=~IRCOM[3])
{EX0=1;
return;}
IRCOM[5]=IRCOM[2]&0x0F;//取键码的低四位
IRCOM[6]=IRCOM[2]>>4;//右移4次,高四位变为低四位
if(IRCOM[5]>9)
{IRCOM[5]=IRCOM[5]+0x37;}
else
IRCOM[5]=IRCOM[5]+0x30;
if(IRCOM[6]>9)
{IRCOM[6]=IRCOM[6]+0x37;}
else
IRCOM[6]=IRCOM[6]+0x30;
EX0=1;
}
//短暂延时
voiddelay(unsignedcharx)//x*0.14MS
{
unsignedchara,b;
while(x--)
{
for(b=1;b>0;b--)
for(a=67;a>0;a--);
}
}
附件二:
器件清单
序号
器件名
规格
数量
备注
1
单片机
STC89C52
1
2
单片机底座
1
3
晶振
11.0592MHz
1
4
瓷片电容
30pF
2
104
4
5
8排阻
10k
1
6
电阻
10k
15
5k
10
1k
10
7
独立式按键
3
8
翘板开关
1
1
9
变压器
二次电压12v(3-5w)
1
10
灯泡、灯座/灯线
220V/60W
1
11
整流二极管
IN4001或IN4007
10
12
双向晶闸管
BTA06
2
13
ADC0804/20脚底座
1
14
光耦
1
15
电位器
10k
2
16
光敏电阻
RG45
1
17
插头
220V
1
18
电容
10uF
5
电解电容
30uF
1
19
LM7805
1
20
插针
1*40
1
21
1602插座
22
红外接收光
SM0038
1
23
杜邦线
30根
24
万能板
12*18
2
附件三:
实物照片