
#include<REG52h>
typedef unsigned char int8;
typedef unsigned int int16;
sbit led=P1^0;//P1^0口控制LED灯
int16 t,a;int8 b; //电平宽度变化控制变量,控制电平宽度,b=0变长,b=1变短
void InitTimer(void)//定时器初始化
{
TMOD = 0x11;
EA = 1; //总中断:开
TH0 = 0xff; //T1计时器计数器初始化
TL0 = 0xce;
TH1 = 0xb1; //T1计时器计数器初始化
TL1 = 0xe0;
ET0 = 1; //T0中断:开
ET1 = 1; //T1中断:开
TR0 = 1; //T0计时:启动
TR1 = 1; //T1计时:启动
}
void main()
{
t=0;
a=0;
b=0;//使用变量前的初始化
InitTimer();
while(1)
{
if(t<a)//t<a时打开LED灯
led=0;
else led=1;//关灯
f(t>80)t=0;//t置零,要改呼吸频率就改掉“80”这个数还有下面的一个“80”也一起改
}
}
void Timer0Interrupt(void) interrupt 1 //T0中断,用来控制PWM电平,每50微秒,t自加一次
{
TH0 = 0xff;
TL0 = 0xce;
t++;
}
void Timer1Interrupt(void) interrupt 3//T1中断,控制PWM电平宽度,使电平宽度由短变长,又由长变短循环,造成呼吸效果
{
TH1 = 0xb1;
TL1 = 0xe0; //每20毫秒增加1个单位的呼吸长度
if(b==0)
{
a++;
if(a==80) //改掉可以改呼吸频率
b=1;
} else {
a--;
if(a==0)b=0;
}
}
读取连接按键的IO口,判断是否为低电平,如果是,延时(十毫秒左右可以),再次读取IO口,判断是否为低电平,如果是则表示有有效的按键按下,接着用while判断等待按键释放,然后让连接led的IO口电平取反以控制其亮灭(是强电的灯可以通过此处控制继电器的合、闭来控制灯的亮灭)。参考程序:if(key==0){delayms(10);if(key==10){while(key==0);//等待按键释放,IO口恢复高电平led=!led;//按键控制程序}}
摘 要:介绍了单片机实现多路灯光自动控制系统的软、硬件设计。
关键词:单片机 自动控制 可控硅 抗干扰
利用单片机丰富的软硬件资源实现对各种广告牌多路灯光自动控制,与传统的电子线路控制器相比,具有可编程、体积小、控制灵活、 *** 作方便、控制时间可变可调等优点。
我们为呼市邮政局设计并安装了上述单片机多路灯光自动控制系统。下面就该系统的软、硬件设计作介绍。
1 系统结构及工作原理
系统整体结构如图1。
图1 系统结构
8031单片机是该系统的核心部件,其主要功能:(1)灯光控制的软件编程;(2)干扰信号的处理及复位;(3)光强及时间定时的检测及控制。
单片机的控制程序通过对光强或时间的检测,自动开启(夜间)或关闭(白天)灯光系统,每1路灯光设备与8031内存控制位相对应,单片机通过P30(RXD)和P31(TXD)多功能口,利用串行通信方式0实现不同控制代码的输出,从而完成了多路灯光设备各种变化的自动循环显示。
2 8031单片机控制系统功能分析
2.1 光强或时间定时的检测及控制
如图2所示,当8031单片机P14的控制开关拨到+5V时,系统的开启或关闭由光强控制。这时,当光线较强时(白天),光耦二极管电阻变小,三极管Q1导通,P17为低电平;当光线暗时(夜间)光耦二极管变大,三极管Q1截止,P17为高电平。8031单片机控制程序每隔一定时间(约5ms)采样P17端的状态,然后根据其高低电平选择开启或关闭相应的灯光控制代码发送。图2中与光耦二极管并联的可调电位器可以调整三极管Q1的截止导通状态,从而实现对光控的微调。
图2 光耦电路
当P14拨至接地状态时,8031单片机程序进入时间控制子程序,8031单片机把内部定时器0设置成日历时钟计数(其初值可以用按钮设置),当程序查询到表格内的开启或关闭初值(表格的初值可通过按钮及数码管显示来输入或修改)与单片机时钟当前值相同时,则自动发送相应的开启或关闭输出控制代码。
2.2 双向可控硅控制电路
由于负载一般为大功率器件(电压从几百伏至上千伏,电流从几安培至几十安培),因此,8031单片机工作部分与可控硅触发部分采用MOC3021双向可控硅输出型光电耦合器,图3为1路可控硅触发控制电路。
图3 可控硅触发电路
可控硅TR的门极触发电流为50mA,触发电压为2V,则最小触发电压为:
VT=R1,IGT+VGT+VTM=300×005+2+3=20V
对应的最小控制角α为:
其中:IGT为可控硅TR的最小触发电流,VGT为可控硅TR的最小触发电压,VTM为MOC3021输出压降(3V),Vp为交流工作电压的峰值。
在使用中发现,当感性负载时,有时会引起可控硅误触发。经分析发现,当感性负载时,由于电压上升率dv/dt较大,在阻断状态下,可控硅的PN结相当于1个电容,当突然受到正向电压、充电电流过门极PN结时,起到了触发电流的作用,造成MOC3021的输出回路可控硅误导通。为此,我们对上述电路进行了修正,如图4所示。在输出回路中加入R2和C1组成RC回路,降低dv/dt。按照MOC3021的技术指标,允许最大的电压上升率dv/dt=10V/s,结温上升时dυ/dt下降,在极端的工作条件下,dv/dt=08V/s。
图4 修改后的触发电路
R2、R1之和与最小触发电压与可控硅门极电流的关系为:
C1取02μF。
同理,在TR输出端加上RC滤波网络,从而使TR输出电压上升率下降。
2.3 单片机工作回路的干扰及解决措施
由图1可知,光耦电路利用MOC4021将输入弱信号与输出强信号进行隔离,但在实际运行时,单片机系统仍有较强的干扰信号存在,常常出现死机或程序飞跑现象。分析认为,由于输出的大电流及电压均工作在开关状态,输出高次谐波通过电源回路对8031单片机产生了较大的影响,因此,我们设计了电源滤波电路及硬件复位电路,对电路的干扰进行了有效的控制。其中,硬件复位电路如图5所示。图5中74LS123为双路可再触发单稳态多谐振荡器,通过外接阻容参数,可产生不同宽度的正负脉冲,其真值表如表1。
图5 复位电路
表1 74LS123真值表
输 入 输 出
delete A B Q Q
L X X L H
X H X L H
X X L L H
H L ^
H I H
L H
由表1及图5电路可知:由于1脚A接地,2脚B接8031单片机P10,正常运行时,循环程序不断从P10发送代码信号,使2脚不断有上升沿出现,因此,13脚保持高电平,则5脚输出低电平,保持8031RESET脚低电平的需要。当程序飞跑或死机时,2脚电位不再变化,使5脚产生一高电平脉冲,促使8031复位,重新启动。
3 系统结构特点及应用范围
该系统软硬件均采用模块化结构,1块控制板能控制16路输出,输出信号通过8031串行口RXD及TXD端经74LS164串入并出移位寄存器输出,因此,软件输出代码高达上千路信号,硬件控制板根据需要可以任意扩充,只要电源变压功率相应增大即可。该系统可广泛应用于霓红灯,多路塑料管灯及多路色灯的控制。
另外,系统具有与微机串行口RS-232的通信接口,必要时可以与微机连接,这样,多路灯光控制参数及时间控制参数在微机上可随时修改,使控制变得更加灵活。
作者单位:呼和浩特内蒙古大学电子工程系(010021)
参考文献
1 余永权单片机应用系统的功率接口技术北京:北京航空航天大学出版社,1992;104~108
2 李树华IBM-PC微机与发光管显示屏的连网通讯内蒙古大学学报(自然科学版),1993;(4):441~443
3 Xicor IncNew Product and Applications Information for Design engineers.EDN,1994;39(25):159~160
T0 工作模式2 计时器中断,一次200us,1s流水灯左移或右移一次。
k3触发外部中断0,级别高于计时器中断,故暂停。
#include <reg52h>#include <intrinsh>
#define uint unsigned int
#define uchar unsigned char
sbit k1=P1^0; //左循环按钮
sbit k2=P1^1; //右循环按钮
sbit k4=P1^2; //恢复暂停
sbit k3=P3^2;//暂停
void init();
void showLED();
void delay(uint xms);
uint delayTime;
uint goLeft=1;
uint goRight=0;
uint sFlag=0;
void main()
{
init();
while(1)
{
if(k1==0)
{
delay(10);
if(k1==0)
{
while(k1==0);
goLeft=1;
goRight=0;
}
}
if(k2==0)
{
delay(10);
if(k2==0)
{
while(k2==0);
goLeft=0;
goRight=1;
}
}
}
}
void delay(uint xms)
{
uint i,j;
for(i=xms;i>0;i--)
for(j=112;j>0;j--);
}
void init()
{
P0=0xfe;
TMOD=0x02; //T0 工作模式2 自动装填8位 200us
TH0=0x38;
TL0=0x38;
EA=1;
ET0=1;
TR0=1;
EX0=1;
IT0=1;
}
void showLED()
{
if(goLeft==1)
P0=_crol_(P0,1);
if(goRight==1)
P0=_cror_(P0,1);
}
void moveDelay() interrupt 1 //一次中断200us
{
if(delayTime==5000)
{
showLED();
delayTime=0;
}
else
delayTime++;
}
void stopLED() interrupt 0
{
while(1)
{
if(k4==0)
{
delay(10);
if(k4==0)
{
while(k4==0);
break;
}
}
}
}
sbit led =P11;
if(key==1)
delay10ms();
{if(keyi==1)
{ a++;
while(!key);
}}
if(a%3==0)
{
led =~led ;
}
以上就是关于请教51单片机利用PWM控制灯的亮度的程序全部的内容,包括:请教51单片机利用PWM控制灯的亮度的程序、单片机 用C语言怎么编写用一个按钮,控制一盏灯的亮与灭的程序、灯光移位控制程序(单片机程序)等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)