首页 理论教育 实时控制作息时间|单片机原理与接口技术

实时控制作息时间|单片机原理与接口技术

时间:2023-11-16 理论教育 版权反馈
【摘要】:利用单片机作为核心控制电路,设计一个自动打铃机。1 硬件设计首先需要利用单片机设计一个实时时钟,然后根据控制时间建立一个数据区作为控制字码表,存放在ROM中。选择通过MCS-51内部定时器T0产生中断来实现计时。表8-7 控制码的定义及其功能例如,“6:20 起床,启动电铃持续响铃15s”的时间控制字为FE062000/FF062015。

实时控制作息时间|单片机原理与接口技术

利用单片机作为核心控制电路,设计一个自动打铃机。单片机自动打铃机具有准确的计时功能,能够像电子钟一样按时、分、秒格式显示实时时间。除要求自动打铃外,还要求能自动播放音乐和课间操节目。设置两个时间调校(校时和校分)按键,分别用来调校时和分,以保证自动打铃机的时间与标准时间相同,每按一次按键,相应的分或时就增加1。

1 硬件设计

首先需要利用单片机设计一个实时时钟,然后根据控制时间(即作息时间)建立一个数据区作为控制字码表,存放在ROM中。选择通过MCS-51内部定时器T0产生中断来实现计时。设定时器T0工作在定时工作方式1,每100ms(0.1s)产生一次中断,每产生一次T0中断,就利用软件将基准0.1s时间计数单元进行累加计数一次。当定时器T0产生10次中断时,就获得了1s信号,这时秒计数单元加1,同理,由软件对分计数单元和时计数单元进行时间计数,从而得到秒、分、时的时间值,并通过LED数码管显示电路显示出来。

选择单片机的晶振频率为fOSC=6MHz,则时钟周期为1/66μs,机器周期为22μs。所以定时器T0工作在方式1下产生0.1s的定时,所需的定时器初值为3CB0H,为了确保T0能准确定时0.1s,在T0中断服务程序中重装定时器初值时,修正为3CBDH,在运行中可根据误差情况进一步调整。

选择LED数码管的显示方式为动态扫描显示。由于驱动LED数码管需要一个字形口和一个字位口,为此,采用并行I/O接口芯片8155对单片机进行I/O接口扩展。选择8155的B口作为字形口,将B口经74LS07和所有LED的a、b、c、d、e、f、g、h引线相连;8155的A口作为字位口,其中的6个引脚经74LS07分别和6个LED的控制端G相连。单片机工作时通过8155的B口输出字形码,再通过A口输出字位码以控制被选中的一个LED点亮。当与时、分、秒对应的字形码轮流输出时,相应的字位码从左到右轮流选中LED,打铃机的实时时间就可以逐次在LED上动态显示。

选择采用外部中断请求来进行时间调校。将“校时”按键和“校分”按键分别接到单片机的P3.3和P3.2口,每当用户按下一次时间调校按键,便会产生一次外部中断请求,单片机响应中断后,在中断服务程序中对相应的计时单元进行加1。若加至超过计时基值,通过程序控制计时单元清0,这样只用加1控制就可以进行校时。

选取单片机的P1.0引脚用于连接电铃驱动电路,P1.4引脚用于连接广播设备驱动电路。在项目实验调试阶段,电铃和广播设备用发光二极管代替,将发光二极管的负端与输出引脚连接,使用低电平驱动。连接P1.0的发光二极管(绿色)亮表示打铃,灭则表示不打铃。连接P1.4的发光二极管(红色)亮表示打开广播设备,灭则表示停止广播。

由于在硬件设计时,选取单片机的P1.0用作电铃的开启和关闭,P1.4用作广播的开启和关闭,电铃和广播用发光二极管代替,而且使用低电平驱动,所以只要从P1.0口输出低电平0,就可以开启电铃;输出高电平1,就可以关闭电铃。于是启动电铃和关闭电铃的控制码可以分别设计为FEH(1111 1110B)和FFH(11111111B)。同理,启动广播设备和关闭广播设备的控制码可以分别设计为EFH(11101111B)和FFH(11111111B)。控制码的定义及其功能见表8-7。

表8-7 控制码的定义及其功能

978-7-111-54295-7-Chapter08-23.jpg

例如,“6:20 起床,启动电铃持续响铃15s”的时间控制字为FE062000/FF062015。程序中所用到的单片机片内RAM数据存储单元分配如下:

26H:0.1s计数单元

27H:秒计数单元

28H:分计数单元

29H:时计数单元

2AH:计时单元指针初值

2BH:存放秒计数基值

2CH:存放分计数基值

2DH:存放时计数基值

2EH:数据区地址暂存单元

3AH:控制码存储单元

3BH、3CH:数据暂存单元

4AH~4FH:显示缓冲区

5AH:堆栈栈底

将打铃机的时间调为6:24:00,等到时钟走到6:25:00时,便可看到广播指示灯点亮,如图8-16所示。图中的D2发出红光,并在6:40:00时熄灭,表示该时间点的广播控制正常。

978-7-111-54295-7-Chapter08-24.jpg

图8-16 6:25开启广播设备指示灯D2亮(发红光)

2 程序设计

/******起始程序******/

ORG 0000H

LJMP MAIN;转主程序

ORG 0003H

LJMP BREAK0;转978-7-111-54295-7-Chapter08-25.jpg中断

ORG 000BH

LJMP CLOCK;转定时器T0中断

ORG 0013H

LJMP BREAK1;转978-7-111-54295-7-Chapter08-26.jpg中断

/***主程序***/

ORG 0050H

MAIN:MOV A,#03H;8155初始化命令字

MOV DPTR,#8000H;8155命令口地址

MOVX @DPTR,A;向8155写入命令字

MOV SP,#5AH;栈底移至5AH

MOV 2BH,#60H;秒计数基值

MOV 2CH,#60H;分计数基值

MOV 2DH,#24H;时计数基值

MOV TMOD,#01H;定时器工作方式1

MOV TH0,#3CH;置T0初值

MOV TL0,#0B0H

MOV IE,#87H;允许中断

SETB TR0;启动定时器T0

LOOP:LCALL DISP;调用显示子程序

LJMP LOOP;循环

/***中断服务程序***/

BREAK0:CLR EX0;关闭中断

JNB P3.2,$;消除按键抖动,等待按键释放

INC 28H;分单元加1

MOV A,28H;十进制调整

ADD A,#00H

DA A

MOV 28H,A

SUBB A,#60H;不等于计数基值转NEXT1

JC NEXT1

MOV 28H,#00H;相等,分单元清0

NEXT1:LCALL DISP;调用显示子程序

SETB EX0;开放中断

RETI;中断返回

BREAK1:CLR EX1;关闭中断

JNB P3.3,$;消除按键抖动,等待按键释放

INC 29H;时单元加1

MOV A,29H;十进制调整

ADD A,#00H

DA A

MOV 29H,A

SUBB A,#24H;不等于计数基值转NEXT2

JC NEXT2

MOV 29H,#00H;相等,时单元清0

NEXT2:LCALL DISP;调用显示子程序

SETB EX1;开放中断

RETI;中断返回

/***显示子程序***/

DISP:MOV R0,#4FH;准备向缓冲区放数

MOV A,27H;取秒值

ACALL PUTT;放秒值

MOV A,28H;取分值

ACALL PUTT;放分值

MOV A,29H;取小时值

ACALL PUTT;放小时值

MOV R0,#4AH;指向显示缓冲区首地址

MOV R2,#0DFH;从左边第一位开始显示

DISP1:MOV DPTR,#8002H;字形口地址

MOV A,#00H;熄灭码

MOVX @DPTR,A;关显示

MOV A,#00H;熄灭码

MOVX @DPTR,A;关显示

MOV A,@R0;取显示缓冲区中的数

MOV DPTR,#SEGTAB;指向字形码表首

MOVC A,@A+DPTR;查表,找字形码

MOV DPTR,#8002H;字形口地址

MOVX @DPTR,A;送出字形码

MOV A,R2;取字位码

MOV DPTR,#8001H;字位口地址

MOVX @DPTR,A;显示一位数字

MOV R3,#00H;计数延时初值

DISP2:DJNZ R3,DISP2;延时一段时间(1ms)(www.xing528.com)

INC R0;修改显示缓冲区指针

RR A;为显示下一位做准备

MOV R2,A;存字位码

JB ACC.7,DISP1;不到最后一位,则继续

RET;显示完6位,返回

PUTT:MOV R1,A;暂存

ACALL PUTT1;低4位先放入缓冲区

MOV A,R1;取出原数

SWAP A;高4位放入低4位中

PUTT1:ANL A,#0FH;屏蔽高4位

MOV @R0,A;放进显示缓冲区

DEC R0;缓冲区地址指针减1

RET

/***T0中断服务程序***/

CLOCK:PUSH PSW;保护现场

PUSH ACC

SETB RS0;选择工作寄存器组1

MOV TH0,#3CH;重装定时器T0初值

MOV TL0,#0BDH

INC 26H;0.1s单元加1

MOV A,26H;取0.1s单元内容

CJNE A,#0AH,DONE1;不等于10,转DONE1

MOV 26H,#00H;等于10,则清0

MOV R0,#27H;指向秒计数单元

MOV R1,#2BH;指向秒计数基值单元

MOV R3,#03H;循环3次(秒、分、时)

CLOCK1:MOV A,@R0;取计时单元的值

CLOCK1:MOV A,@R0;取计时单元的值

ADD A,#01H;计时单元加1

DA A;十进制调整

MOV @R0,A;送回计时单元

MOV 3BH,@Rl;取计时基值

CJNE A,3BH,NEXT3;不等于计时基值,转出

MOV @R0,#00H;相等,则计时单元清0

INC R0 ;计时单元指针加1

INC R1;时间基值单元指针加1

DJNZ R3,CLOCK1;秒、分、时共3次循环

NEXT3:ACALL CTRL;调用控制子程序

DONE1:POP ACC;恢复现场

POP PSW

RETI;中断返回

/***控制子程序***/

CTRL:MOV DPTR,#100CH;指向控制字码表首址前4单元

MOV 2EH,DPL;暂存指针低8位地址

CTRL1:MOV DPL,2EH;取出指针低8位地址

MOV R3,#04H;控制字码表指针加1次数

CTRL2:INC DPTR;控制字码表指针加1

DJNZ R3,CTRL2;指针指向下一个控制字

MOV 2EH,DPL;暂存指针低8位

MOV R3,#03H;核对时、分、秒共3次

CLR A

MOVC A,@A+DPTR;取控制码

JZ DONE2;若A=0,则数据区结束

MOV 3AH,A;保护控制码

MOV R1,#2AH;设置计时单元指针

CTRL3:INC DPTR;修改控制字码表指针

DEC R1;修改计时单元指针

CLR A;准备查表

MOVC A,@A+DPTR;读取控制字时间值

MOV 3CH,A;暂存

MOV A,@R1;读取计时单元时间值

CJNE A,3CH,CTRL1;比较时间值是否相等

DJNZ R3,CTRL3;3次循环

MOV A,3AH;3次比较相等,恢复控制码

MOV P1,A;由P1口输出,执行控制

DONE2:RET;子程序返回

/***字形码表***/

SEGTAB:DB 3FH,06H,5BH,4FH,66H,6DH,7DH

DB 07H,7FH,6FH

ORG 1010H

DB 0FEH,06H,20H,00H,0FFH,06H,20H,15H

DB 0EFH,06H,25H,00H,0FFH,06H,40H,00H

DB 0FEH,07H,20H,00H,0FFH,07H,20H,10H

DB 0FEH,07H,40H,00H,0FFH,07H,40H,15H

DB 0FEH,07H,50H,00H,0FFH,07H,50H,10H

DB 0FEH,08H,35H,00H,0FFH,08H,35H,10H

DB 0FEH,08H,45H,00H,0FFH,08H,45H,10H

DB 0FEH,09H,30H,00H,0FFH,09H,30H,10H

DB 0EFH,09H,35H,00H,0FFH,09H,40H,00H

DB 0EFH,09H,35H,00H,0FFH,09H,40H,00H

DB 0FEH,09H,45H,00H,0FFH,09H,45H,15H

DB 0FEH,09H,50H,00H,0FFH,09H,50H,10H

DB 0FEH,10H,35H,00H,0FFH,10H,35H,10H

DB 0FEH,10H,45H,00H,0FFH,10H,45H,10H

DB 0FEH,11H,30H,00H,0FFH,11H,30H,10H

DB 0FEH,14H,15H,00H,0FFH,14H,15H,15H

DB 0EFH,14H,16H,00H,0FFH,14H,20H,00H

DB 0FEH,14H,25H,00H,0FFH,14H,25H,15H

DB 0FEH,14H,30H,00H,0FFH,14H,30H,10H

DB 0FEH,15H,15H,00H,0FFH,15H,15H,10H

DB 0FEH,15H,15H,00H,0FFH,15H,15H,10H

DB 0FEH,15H,25H,00H,0FFH,15H,25H,10H

DB 0FEH,16H,10H,00H,0FFH,16H,10H,10H

DB 0FEH,16H,20H,00H,0FFH,16H,20H,10H

DB 0FEH,17H,05H,00H,0FFH,17H,05H,10H

DB 0EFH,17H,15H,00H,0FFH,17H,15H,10H

DB 0FEH,18H,00H,00H,0FFH,18H,00H,10H

DB 0FEH,19H,20H,00H,0FFH,19H,20H,15H

DB 0FEH,19H,30H,00H,0FFH,19H,30H,10H

DB 0FEH,21H,30H,00H,0FFH,21H,30H,10H

DB 0FEH,23H,00H,00H,0FFH,23H,00H,15H

DB 00H

END

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈