定时开关控制器的制作.docx
《定时开关控制器的制作.docx》由会员分享,可在线阅读,更多相关《定时开关控制器的制作.docx(22页珍藏版)》请在冰豆网上搜索。
定时开关控制器的制作
定时开关控制器的制作
魏军丞
图1、主板电路原理图
定时开关控制器在各种场合都有着极为广泛的用途,例如可用于工业方面的自动控制,办公场所的电器控制,广告公司的霓虹灯控制,军事装备的武器控制等等,有比较高的应用价值。
本文利用2051单片机设计的定时开关控制器具有简单易制、价格低廉、控制点数多、控制时间可精确到秒等特点,供有兴趣的朋友参考。
1、主板电路部分
本电路主要是利用单片机AT89C2051(-24PI)作为主控制元件,通过外围电路控制用电设备的电源,以达到定时开关机的目的。
AT89C2051具有体积小、功能强大、运行速度快、价格低廉等优点,非常适合制作集成度较高的控制电路。
按图1制作的主板(双面)大小只有95*70mm2,器件位置图见图2。
主板电路包括MCUAT89C2051、键盘与显示、输入与输出口、复位和电源滤波等电路组成。
1.1键盘与显示
显示电路由U2、U3、Q1~Q7和L1A、L2A组成。
U2为BCD-7段译码器(74LS47),通过单片机U1的P1.4~P1.7口将要显示字符的BCD码输出到U2的四个输入端,经U2译码后输出相应的笔段驱动LED数码管(共阳)。
LED数码管显示采用动态扫描方式,即在某一时刻,只有一个数码管被点亮。
数码管的位选信号由单片机U1的P3.3~P3.5输出,经U3(74HC138)译码后通过Q1~Q6放大,驱动相应的数码管。
R17~R24为限流电阻。
图2、主板电路器件位置图
由于U2只能输出7段笔段码,而数码管除了七段笔段外,还要控制点亮小数点,因此,小数点必须有另外的驱动电路来完成,在这里,通过Q7来驱动小数点。
当需要点亮小数点时,在U1的P1.3输出高电平即可。
键盘电路跟显示电路一样,采用扫描方式,利用动态显示时的数码管驱动位置信号来判断相应按键的状态。
U1的P3.3~P3.5口输出的BCD码经U3译码后,相应Y口呈低电平,而U1的P3.7口平时为高电平(由于R8上拉),当某一键按下时,P3.7被下拉为低电平,这时MCU利用程序查询P3.7是否为低电平,如果P3.7为低电平,就读回U1P3.3~P3.5口的值(从缓冲区读取),就可判断是那个按键按下,然后调用相应的处理程序进行处理。
1.2控制输出、复位与电源滤波电路
MCU对控制的输出是通过P3.0~P3.2口完成的。
程序开始时这三个口的输出状态是低电平,MCU通过程序查询三路输出的ON或OFF状态预置时间是否已到,如果已到时间,则改变相应的输出状态,就完成了对外部电路的控制。
复位电路如图1左上角所示,C3和R25完成上电复位,S6为手动复位,按键输入干扰和抖动的预防是由软件完成的。
+5V电源由JP2输入,经C4~C9滤波后给U1和其它器件供电。
2、电源与控制电路
电源电路如图3,市电经总开关K后由B降压、V1整流、C11~C14滤波、U4、U5稳压后给主板和控制电路板提供稳定的工作电源。
控制电路原理如图3,主板送过来的三路控制信号通过Q12~Q14分别控制继电器J1、J2、J3,对外部电路实施直接控制。
继电器这里没有给出具体型号,您可根据耐压及通流大小选用相应的继电器,如在大电流和强电磁场干扰的环境里工作,最好利用中间继电器来间接控制。
3、程序软件工作过程
3.1秒脉冲发生器
图3、电源与控制电路原理图
秒脉冲发生器是由定时器T0和内存空间TT0配合完成的。
T0工作于16位计数器模式,当T0向上计数由全1变为全0时产生中断,本程序中T0的初值为0DC00H,大约0.01秒中断一次。
这里使用的晶振频率为11.0592MHz,由此可计算出日误差约为0.78S。
工作过程:
如图4流程图所示,产生中断后,首先保存ACC和PSW的值,然后为T0重装初值,判断中断次数是否小于100,是则转出中断服务,反之则为秒计数器加1,秒计数器如果大于59,则为分计数器加1,同时秒计数器清0。
同样分计数器如大于59则为时计数器加1,同时分计数器清0,时计数器如大于23则清0并转出中断服务。
T0中断100次的时间刚好为1秒钟。
3.2主程序
上电复位过程:
首先P0~P2口全部置1,P3口高5位置1,低3位置0。
设置定时器T0工作于16位计数器模式,并赋初值TH0=0DCH,TL0=00H,关闭外部中断和串行口中断,时间计数器TS、TM、TH清0,所有预置时间存储区全部赋值FFH,至此所有初始化工作完成。
主程序工作过程:
首先循环进行六个数码管扫描显示(DISPLY段),然后比较所有预置时间(COMP段)是否与当前时间相等,如相等则转向相应处理程序。
在比较完成(或处理完成)后判断有无按键(PP2段),没有则返回继续显示、比较、判断;有按键则转向相应处理程序。
按键转移采用偏移量加表格跳转转移法(KEY段),简单、明了。
预置时间比较则采用逐一比较法,即对每一个预置值进行比较,如相等则做相应处理。
具体比较时(COMP1段)先比较TH值,如不相等则直接转出并置“时间到”标志CCB为0,如TH、TM、TS全部对应相等,则置该标志为1。
N
上电复位
轮流显示
判断键值
相应处理
有键按下?
N
Y
主程序
Y
相应处理
预设时间到否?
Y
T0中断服务
设常数因子
中断次数减1
RETI
N
秒分时计数
TT0为0吗?
图4、软件程序工作流程图
本程序在显示及按键处理(设置过程)中巧妙使用R1寄存器作为公用地址寄存工具,对实时时间和预置时间的显示和修改调用同一程序完成,使源代码长度大大缩短,提高了程序的可读性和运行效率。
4、制作与调试
4.1主板的制作与调试
主板的制作稍微复杂一点。
首先是制作印刷板,利用Protel99按照本文所示器件位置图放置好元器件,然后手动布线(双面),线宽为0.8mm左右,太宽做出的板子太大,太窄无法进行自制。
绘好印制板图后转成BMP格式利用电脑刻字机镂空(要用进口的即时贴纸,不然容易断开),贴在双面敷铜板上,就可以用FeCl3腐蚀了。
具体的制作方法这里不再赘述,但最好在印制板布线时做个阻焊层,同时在即时贴上刻出来,当板子制好清洗干净后敷在上面,用浅绿色油漆或清漆喷上薄薄的一层,好看又防腐蚀。
S5
数码管显示
意义
S1
S2
S3
S4
没有按S5
00.00.00
设置时间
时计数器加1
分计数器加1
秒计数器加1
退出
按第1次S5
95.95.95
第1路ON设置
时加1
分加1
秒加1
退出
按第2次S5
95.95.95
第1路OFF设置
时加1
分加1
秒加1
退出
按第3次S5
95.95.95
第2路ON设置
时加1
分加1
秒加1
退出
按第4次S5
95.95.95
第2路OFF设置
时加1
分加1
秒加1
退出
按第5次S5
95.95.95
第3路ON设置
时加1
分加1
秒加1
退出
按第6次S5
95.95.95
第3路OFF设置
时加1
分加1
秒加1
退出
按第7次S5
当前时间
退出
其次是元器件的选择。
如果按照本文所附器件位置图布线的话,数码管需选用图示型号才能安装(5361BH,一拖三数码管),选用不同型号数码管时可能需修改器件位置参数,然后再布线即可。
晶振为11.0592MHz。
S1~S5选用黑色小型轻触开关,S6则用红色同类型开关。
变压器B选用15V、10W左右即可,V1硅堆应与B配合选用。
控制继电器根据需要选用适合的型号,如5V、12V、24V等,如果选用5V的,相应的B、V1可选小一点的,7812则不要。
如选用24V的,那么B、V1、7812、7805都需同时根据实际情况来选用了。
~220V输出插座没有特殊要求,其耐压和通流符合受控器件要求即可。
其它元器件选用通用的就行。
最后就是焊接元器件。
元器件购回后应先进行预处理(引脚打磨、上焊锡),然后逐一焊接。
在焊接MCU(当然2051要烧好程序后才能焊接哦)和其它集成电路时应使用有良好接地的烙铁(断电焊接也可),以免被击穿。
由于双面印刷板存在一个穿孔问题,器件引脚穿过后,两面都要点上焊锡;如只是过孔,可用细铜线穿过并在两面焊接后剪掉即可。
在印刷板制作良好,连线没有不应有的开路或短路,且焊接没有虚焊的情况下,不用调试即可正常工作(本程序已制作成品并调试通过,不需再行调试)。
如果您觉得自己制作的印刷板不够漂亮或太麻烦可联络凯思迪邮购(焊接好的整板也有)。
4.2电源与控制板的制作
可以将电源与控制板做在同一个板子上,也可分开制作,视所使用的情况而定,但JP1与JZ1之间的连线不宜太长。
印刷板的制作同前所述,要注意的是在布线时对~220V市电进入和输出(包括中线)的线宽设计要宽一点(根据工作电流大小来定为好),还要注意市电与直流电源的隔离,以免在使用中造成触电事故。
5、操作使用
本系统在加电后数码管显示“00.00.00”,输出继电器均不动作,此时可直接按S1、S2、S3键分别对时、分、秒进行调整,使当前时间与北京时间相符,时间设置过程中将停止计时,在设置好后按S4退出,时钟即进入正常计时。
如果要设置输出控制的预置时间则先按S5,数码管显示“95.95.95”,此时可再按S1、S2、S3键分别对第一路输出状态ON的时、分、秒进行设置,设好后再按一次S5键,数码管也显示“95.95.95”,然后按S1、S2、S3键则分别对第一路输出状态OFF的时、分、秒进行设置,依此类推,按第七次时退出设定(详见附表)。
任一路任一状态被执行后其预置值即被清除,24小时后并不有效,如果需要每天循环执行则对程序进行简单的修改即可(预置值不清除就可)。
6、改进与扩展
本文所述的AT89C2051在控制输出时只使用了P3.0~P3.2三个口,所以只能控制三路六个状态,如果把不用的P1.0~P1.2三个口用起来,则可控制六路十二个状态,外围电路相应增加三路继电器,程序软件只需稍事修改即可。
当然如果需要控制更多路输出状态,那么在使用锁存器、译码器、触发器等后最多可以扩展到控制26=64路128个状态。
在对控制输出的路数要求不多,而显示部分需要比较多的情况下,如还要显示年月日、农历、星期等,只要对其进行扩展就可实现:
P1.4~P1.7不动,选通端用两个138,输出口用P3.2~P3.5就有24=16个数码显示。
这时仍然利用上述方法最多可扩展到控制25=32路64个状态。
当然年月日、农历、星期的计算(如大月小月、闰年、闰月等)分别汇编相应的子程序插入即可,这方面的资料8951论坛讨论的很多,这里不再赘述。
如您对源程序有不明白的地方或有兴趣交流可与我联系E-mail:
luckybirds@。
;*****************************************
;*三路六个状态定时开关控制器*
;*****************************************
;*S1----对时按钮;S2--对分按钮*
;*S3--对秒按钮;S4--退出对时*
;*S5--设定预设值按钮*
;*****************************************
TSEQU2DH;*TS为秒计数器(二进制,0~24)
TMEQU2EH;*TM为分计数器(二进制,0~60)
THEQU2FH;*TH为时计数器(二进制,0~60)
K5EQU26H;S5状态
KEYCODEEQU29H;*KEYCODE为键盘值
TT0EQU2BH;*与T0配合构成为秒脉冲发生器
CCBEQU20H;预设‘时间到’标志,为01H时表示时间到
OFFEQU0FFH;预设值复位标志
DPS0EQU11000000B;秒个位选通
DPS1EQU11001000B;秒十位选通
DPM0EQU11010000B;分个位选通
DPM1EQU11011000B;分十位选通
DPH0EQU11100000B;时个位选通
DPH1EQU11101000B;时十位选通
K1ONDATA30H;*第一个开启时间30H
K1OFFDATA33H;*第一个关闭时间33H
K2ONDATA36H;*第二个开启时间36H
K2OFFDATA39H;*第二个关闭时间39H
K3ONDATA3CH;*第三个开启时间3CH
K3OFFDATA3FH;*第三个关闭时间3FH
ORG0000H
AJMPMAIN
ORG000BH;定时器0(T0)中断入口
SJMPI_T0
ORG001BH;定时器1(T1)中断入口
I_T1:
AJMPMAIN1
RETI
;*********定时器0中断服务**************
ORG0060H;定时器T0中断服务程序
I_T0:
PUSHACC
PUSHPSW
MOVTH0,#0DCH;0.01s时间,常数因子DC00H
MOVR3,TT0
DJNZR3,I_T01;中断次数<100(每次中断0.01S),转出.
MOVR3,#100;中断次数=100次,重新下一个计数.
MOVA,TS;秒计数器加1
ADDA,#01H
MOVTS,A
SUBBA,#60;秒计数器>59?
Y,秒计数器=00
JCI_T01
MOVTS,#00H
MOVA,TM;分计数器加1
ADDA,#01H
MOVTM,A
SUBBA,#60;分计数器>59?
Y,分计数器=00
JCI_T01
MOVTM,#00H
MOVA,TH;时计数器加1
ADDA,#01H
MOVTH,A
SUBBA,#24;时计数器>23?
Y,时计数器=00
JCI_T01
MOVTH,#00H
I_T01:
MOVTT0,R3
POPPSW
POPACC
NOP
NOP
RETI
;************主程序********************
ORG00F0H
MAIN:
MOVP0,#0FFH;主程序,初始化
MOVP1,#0FFH
MOVP2,#0FFH
MOVP3,#0F8H;p3.0~p3.2置低电平,使三个控制口关闭
MOVSP,#50H;初始化堆栈指针
MOVTMOD,#11H;T0工作于16位定时器
MOVTT0,#100;中断次数,每次0.01s*100=1s
MOVTH0,#0DCH;T0初值
MOVTL0,#00H
MOVTS,#00H;时间赋初值
MOVTM,#00H
MOVTH,#00H
CLREX0;外部中断0失效
CLREX1;外部中断1失效
CLRES;串行口中断失效
SETBET0;开T0
SETBTR0;激活T0
SETBEA;开总中断
MOVK5,#00H;S5键状态赋0
movr5,#14H;预设值全部赋FFH,数码管显示95.95.95
movr1,#K1ON
kk:
mov@r1,#OFF
INCR1
DJNZr5,kk
MAIN1:
MOVR6,#50H;循环显示80次,消除按键抖动
DISP:
MOVKEYCODE,#00H
MOVR1,#TS;R1保存时间存储区的首地址
MOVA,K5;K5为S5的状态,在设定预设值时则为增量
ADDA,R1
MOVR1,A
NOP
NOP
ACALLDISPLY;调用显示子程序
DJNZR6,DISP
MOVA,K5;S5按下时不进行比较
JNZPP2
NOP
NOP
ACALLCOMP;判断预设置是否与当前时间相等,
PP2:
MOVDPTR,#KEY;设置转移表增量
MOVA,KEYCODE;读键盘值
JMP@A+DPTR;按键值跳到相应处理程序
KEY:
SJMPMAIN1
SJMPKEY1;设置小时值
SJMPKEY2;设置分钟值
SJMPKEY3;设置秒钟值
SJMPKEY4;退出设置
SJMPKEY5;设定预设置
KEY1:
MOVA,K5;如果S5按下,则TR0不停止计数
JNZKEY12;在设定预设置值时时钟不停止
CLRTR0
KEY12:
MOVA,@R1
CLRC
INCA;时计数器加1
MOV@R1,A
SUBBA,#24;24D
JCKEY11
MOV@R1,#00H
KEY11:
SJMPMAIN1
NOP
KEY2:
MOVA,K5;如果S5按下,则TR0不停止计数
JNZKEY22
CLRTR0
KEY22:
DECR1
MOVA,@R1
CLRC
INCA;分计数器加1
MOV@R1,A
SUBBA,#60;60D
JCKEY21
MOV@R1,#00H
KEY21:
SJMPMAIN1
NOP
KEY3:
MOVA,K5;如果S5按下,则TR0不停止计数
JNZKEY32
CLRTR0;秒计数器加1
KEY32:
DECR1
DECR1
MOVA,@R1
CLRC
INCA
MOV@R1,A
SUBBA,#60;60D
JCKEY31
MOV@R1,#00H
KEY31:
SJMPMAIN1
NOP
KEY4:
MOVK5,#00H;退出时将K5清0
MOVTH0,#0DCH;退出校时状态
MOVTL0,#00H
SETBTR0
SJMPMAIN1
KEY5:
MOVA,K5;修改预设置
CLRC
SUBBA,#12H;判断S5按钮是否越过设定区,如果越过则将K5清0并退出设定
JZKEY51
MOVA,K5
ADDA,#03H
MOVK5,A
AJMPKEY52
KEY51:
MOVK5,#00H
KEY52:
LJMPMAIN1
;***********键盘和显示子程序*************
ORG0200H;显示子程序
DISPLY:
MOVA,@R1;秒计数器调入A
MOVB,#0AH
DIVAB;秒计数值÷10(结果十位从A,个位存于B)
SWAPA
ORLA,#0FH;显示秒的十位
MOVP1,A
MOVA,P3;输出位选信号,以下相同
ANLA,#0FH
ORLA,#DPS1
MOVP3,A
NOP
NOP
ACALLDSPDEL;延时
MOVC,P3.7;读S4按键状态
JCNP1
MOVKEYCODE,#08H;S4按下,键盘值=8
NP1:
MOVP1,#0FFH;消隐
NOP
NOP
MOVA,B;显示秒的个位
SWAPA
ORLA,#0FH
MOVP1,A
MOVA,P3
ANLA,#07H
ORLA,#DPS0
MOVP3,A
ACALLDSPDEL
MOVC,P3.7
JCSS5
MOVKEYCODE,#0AH;S5按下,键值=#0AH
SS5:
MOVP1,#0FFH;消隐
NOP
INCR1
MOVA,@R1;调入分值
MOVB,#0AH
DIVAB
SWAPA;显示分的十位
ORLA,#0FH
MOVP1,A
MOVA,P3
ANLA,#07H
ORLA,#DPM1
MOVP3,A
ACALLDSPDEL
MOVC,P3.7;检测S2是否按下
JCNP2
MOVKEYCODE,#04H;S2按下,键盘值=4
NOP
NP2:
MOVP1,#0FFH;消隐
NOP
NOP
MOVA,B
SWAPA;显示分的个位
ORLA,#07H
MOVP1,A
MOVA,P3
ANLA,#07H
ORLA,#DPM0
MOVP3,A
ACALLDSPDEL
MOVC,P3.7;判断S3是否按下
JCNP3
MOVKEYCODE,#06H;若S3按下,键盘值=6
NOP
NP3:
MOVP1,#0F7H;消隐
NOP
INCR1
MOVA,@R1;调入时值
MOVB,#0AH
DIVAB
SWAPA;显示时的十位
JNZDISPLY1
MOVA,#0FFH
DISPLY1:
ORLA,#0FH
MOVP1,A
MOVA,P3
ANLA,#07H
ORLA,#DPH1
MOVP3,A
ACALLDSPDEL
NOP
MOVA,B
SWAPA;显示时的个位
ORLA,#07H
MOVP1,A
MOVA,P3
ANLA,#07H
ORLA,#DPH0
MOVP3,A
ACALLDSPDEL
MOVC,P3.7;判断S1是否按下
JCNP4
MOVKEYCODE,#02H;S1按下,键盘值=2
NOP
NP4:
MOVP1,#0F7H;消隐
NOP
RET
DSPDEL:
MOVR7,#0FFH;延时程序0.5ms
DJNZR7,$
RET
;************比较设定值*****************
COMP:
NOP
YY1_1: