定时开关控制器的制作.docx

上传人:b****5 文档编号:4099026 上传时间:2022-11-27 格式:DOCX 页数:22 大小:83.68KB
下载 相关 举报
定时开关控制器的制作.docx_第1页
第1页 / 共22页
定时开关控制器的制作.docx_第2页
第2页 / 共22页
定时开关控制器的制作.docx_第3页
第3页 / 共22页
定时开关控制器的制作.docx_第4页
第4页 / 共22页
定时开关控制器的制作.docx_第5页
第5页 / 共22页
点击查看更多>>
下载资源
资源描述

定时开关控制器的制作.docx

《定时开关控制器的制作.docx》由会员分享,可在线阅读,更多相关《定时开关控制器的制作.docx(22页珍藏版)》请在冰豆网上搜索。

定时开关控制器的制作.docx

定时开关控制器的制作

定时开关控制器的制作

魏军丞

图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:

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高等教育 > 管理学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1