自动打铃器

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

自动打铃器
摘要文章介绍了一种以P89C51RD2FN单片机为核心片外扩展at93c46电擦除可编程只读存储器并带有数码LED显示时.分.秒和以指示灯做标志的按键校时自动打铃器。

关键词单片机存储器数码管
一、引言
用单片机控制的自动打铃器,充分发挥单片机体积小,价格便宜,功耗低
可靠性好等特点。

可用于学校作息,方便了广大师生。

二、总体设计方案
1.设计思路
利用单片机及定时器设计的一个时钟,在每次秒加1的计时过程中,都与规定的时间作
比较,如果相等就进行开关电铃,不等则返回。

2.总体设计框图
微电脑广播打铃一体机原理框图
打铃广播一体机使用一片微电脑组成一个单片机最小系统完成管理控制工作。

输入信号通过键盘输入和红外遥控器两种方法输入,输入的数据储存到储存器中已被在控制
过程中调用。

一体机有一个显示板,显示板上有5个数码管,分别显示时间小时和分钟
以及星期,显示板上面有两个状态指示灯和5个数点指示灯分别指示不同的工作状态。

一体机上的时钟信号来自专用的时钟IC,时钟IC具有万年历功能,在这里仅仅取用其
中的部分数据。

时钟模块在交流停电状态下由备用电池供电,保证正常的时钟走时。


铃广播
一体机
最终是
完成对
电铃打
铃的管
理,完成
对电器
控制的
管理,完
成对原
有广播系统的管理,完成音乐打铃的管理。

管理分为手动和定时自动控制两种情况,定
时管理的时间控制靠精确的时钟模块提供准确的时间完成控制。

使用内部功放和原有广播系统完成广播或者音乐打铃的信号源来自内部的数码录音,来内部的使用软件编写的音乐曲目,来自本机上的话筒和外部的信号源。

这些信号
源除可以控制有无外,还有一个电子模拟开关统一进行管理信号源的切换,以达到输出
不同的广播、不同的音乐打铃的铃声的目的。

一体机的电源有为功放电路提供的正负平
衡的18V电源,有为继电器提供的12V电源,有为单片机提供的5V工作电源和为数码录
音IC提供的3V工作电源。

本机有一个监听电路,用来监听内部或者外部打铃及广播的
内容。

三、设计原理分析
1、时钟与数据储存器
时钟与储存器电路如图3所示:储存器和专用时钟IC均使用IIC通讯方式与单片机通讯,两个IIC器件的地址不同,单片机根据不同的地址分别对不同的器件进行数据传送,储存器AT24C16用来储存键盘或者红外遥控器输入的数据,正常工作时,单片机从储存器中取出数据进行定时比较。

时钟模块DS1307除在校正时间时需要写入数据外,其它时间都工作在读出数据的状态下。

DS1307的OUT脚设置成输出1HZ的时钟输出,该输出直接驱动秒点闪烁,同时被单片机的一个输入口检测,当出现输出变化时刷新一次显示屏。

微电脑IC4是电路中的核心元件,使用P89C51RD2FN单片机。

它完成协调、控制外围器件正
常、协调地工作的任务。

它周围器件有专用时钟模块IC2,型号是DS1307,时钟模块使用IIC通讯
方式,内部万年历到2099年,自动闰年处理,DS1307在正常交流供电情况下不消耗备用电池能
量,当交流供电断电后,始终正常走时通过内部备用电池来提供能量,其消耗的电流仅2微安。

数据储存器IC3,型号AT24C16,与主机IIC通讯,具有16K数据位的储存量。

两个IIC通讯的器
件使用统一的IIC总线通讯。

单片机直接的外围器件还有两块语音模块IC9和IC10,型号是
ISD4004-8,ISD4004语音模块与单片机之间采用SPI串行通讯方式,两个语音模块共用串行总线,
语音块的使能是通过单片机分别对语音块使能脚的控制来完成。

该语音IC可以反复擦写,擦写寿
命为1000000次,语音内容可保存100年。

语音快可执行的控制指令有“从当前行录音”,“从
指定位置录音”,“从当前行放音”,“从指定位置放音”“器件上电”,“器件掉电”,“操
作停止”等10条指令,限于篇幅问题此处不在详细叙述该器件的其它特性。

有兴趣者可以参看〖无
线电〗杂志2003年电子制作征文大赛中的“数码录音自动播放机”一文的详细内容。

单片机同时担任3路输出中的继电器控制,同时接收键盘输入,控制显示屏的显示数据的不断刷新,控制20W 功放输出模块的静音管理和输出单片机编程的音乐曲目等等。

2、电源供电电路:
AC220V的交流电源通过35W的电源变压器变压后,经过整流、滤波、稳压后为个部分电路提供电压值不等的电源。

电源变压器次级是一个双绕组输出,中心抽头为公共端,两个绕组通过桥式整流电路整流后,通过两组对称的滤波电路滤波后,得到正负18V电源为音频功放模块供电,功放模块是本机在功放输出期间的主要耗电器件,12V继电器和内部监听功放的供电通过12V三端稳压器IC7从VDD电源来获得12V电源为继电器供电,IC8再次稳压获取5V电压为单片机供电,IC9再次稳压获得3V电压为语音电路供电。

3、键盘、显示与红外接收电路:
键盘电路有7个I/O口组成,鉴于I/O口的连接参照电路图3.通过键盘插座与面板电路连接,键盘电路如图5所示。

\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
3个继电器受单片机控制,其输出触点根据定时自动控制和人工手动控制来完成开关,
用来接通电铃、广播系统和电器的供电电源。

①、通过“电铃控制器”控制电铃发出不同持续时间、不同间隔时间、不同打铃
次数的电铃铃声,实现打铃内容可区分的电铃打铃;
②、通过“广播控制器”对现有的普通广播系统供电,并控制音乐信号通过电子
开关输出到外部的广播系统中发出音乐铃音。

广播控制器除控制音乐打铃的
任务外,也可按外部信号源提供的信号进行广播;
③、通过“电器控制器”完成对某些电器的电源管理控制,例如:学校的路灯,
校园报刊栏等等。

过广播系统发送铃声,此处以通过20W功放来完成打铃、广播和扩音来叙述机内功放的工作过程。

本机中的功放既可以输出打铃信号,也可以用于会议扩音和广播,功放模块使用一块带有静音管理的双声道电路,其型号是TDA2616。

在非工作期间,功放模块的静音管理开启
上述的4路控制的控制方式可以是手动控制,更主要的是使用定时功能完成的自动控制。

定时控制的设置中可以设置时间、工作方式、音乐铃声的选择、循环执行的遍数等等。

用户输入可以通过“键盘”输入,也可以使用“红外遥控器”进行输入设置。

输入的数据储存到一个非易失储存器中,这种储存器在掉电状态下数据不会丢失。

非易失
储存器使用AT24C16,储存器容量是16K数据位,完全可以容纳四路控制每天定时128次
的任务。

定时工作方式,工作时段等设置按“周”进行设置。

在一周时间内又可将某期段设为工作段。

例如:音乐打铃是按“天”循环打铃,还是在一个星期中的某段期间内进行
打铃。

在一周时间内可以任意设定定时工作时间段连续的天数。

显示器使用5个数码管,分别显示小时、分钟和星期,小时和分钟数据之间有秒点指示灯按秒钟闪烁。

5个数码管对应的5个小数点分别用来作状态指示,前面4个数点
对应1~4路的定时工作方式,数点灯点亮,表示对应路定时功能开启,否则关闭了定时
功能。

这种使用分路定时管理来开启或关闭定时功能的方法非常方便用户的使用操作。

最后面的一个数点指示键盘锁定。

该打铃器电路中使用了一个专门的时钟模块,该时钟模块在交流停电状态下能够正常走时,保证了时钟工作的准确性和可靠性。

该机内部使用两块美国ISD公司的语音IC,型号是ISD4004-8,该语音模块保真度好,每块语音电路储存语音的时间是8分钟,两块语音电路可以储存16分钟的语音信号。

该机内共有19段音乐或者语音,前面的1~5段是固定在储存器内的音乐曲目,不占用
语音模块的空间,6~12段音乐铃声音乐出厂前已经录制到语音模块中并进行保护,用
户未经许可不能擦除,后面的13~19段留给用户自由录制音乐段,这7段内容的时间大
约是13分钟左右。

用户可以进行删除、覆盖、反复使用。

4.程序流程图
首先对单片机及外围电路进行初始化处理,并从时钟模块中读出数据,显示当时的时间。

本电路有两种输入方式,一种是键盘输入,另一种是红外遥控器输入,键盘数据
采集采用键盘扫描方式进行,红外遥控器输入采用外部中断0中断读出,采用外部中断
的目的是能够及时读取红外遥控器信号。

在设置输入中,当微电脑查询到有键盘数据或
者读取到红外遥控器输入数据后,微电脑通过对数据进行鉴别、判断、处理后,根据数
据的分类储存到储存器的相应地址中,以备后面的程序从储存器中读出相关的数据使用。

在正常的工作状态下,微电脑查询到键盘输入数据或者读取到红外遥控器命令后,根据
命令的内容完成对应的操作。

显示屏采用静态显示,每秒钟刷新两次,即便在输入数据
的时候,更新数据的显示也已经足够快捷。

4路定时的时间设置的分辨率是分钟,所以
每到分钟进位的时候,根据4路定时功能是否开启来决定是否对该路进行时间比较。


开启定时功能的定时路,微电脑将当前时间与设置储存到储存器中的时间进行比较,当
两个时间满足相等的条件后,再从数据中提取对应的开关机数据等,根据设置的数据作
出相应的管理操作。

打铃广播一体机软件框图
5.程序清单
1.初始化程序:
READ EQU 0 ;读93C46
WRITE EQU 2 ;写入93C46
EWEN EQU 4 ;93C46写入使能
EWDS EQU 6 ;93C46写入禁止
ADR46 EQU 21H ;93C46地址
显示
显示
启动定时器进入工作状态
时分值送显示缓存区
K1 有按键吗?
清分单元
显示
分值加1
置校分标志
K3 有按键吗?
K1 有按键吗?
是60 分吗?
THIGH EQU 0F8H
TLOW EQU 5FH
TIMENEQU 30 ;打铃持续时间(30秒)CS BIT P3.7 ;93C46CS
CLK BIT P3.6 ;93C46CLK
DI BIT P3.5 ;93C46DI
DO BIT P3.4 ;93C46DO
ORG 0000H ;主程序起始地址
AJMP START ;跳至主程序
ORG 000BH ;TIMER0中断起始地址AJMP TIM0 ;跳至TIMER0中断子程序START:MOV SP,#60H ;设置堆栈在60H MOV 28H,#00 ;显示寄存器初值为00 MOV R6,#12H ; 时 寄存器值为12H MOV R5,#00H ;“分”寄存器值为00H MOV R4,#00H ;“秒”寄存器值为00H MOV TMOD,#01H ;设TIMER0为MODE1 MOV TH0,#THIGH ;计时中断为4000微秒MOV TL0,#TLOW
MOV IE,#82 ;TIMER中断使能
MOV R2,#250 ;中断250次
SETB TR0 ;启动TIMER0
2.键值处理程序:
LOOP: SETB P0.5 ;工作模式
CLR P0.6
CLR P0.7
JB P0.0,N1 ;K1(模式选择键)按了?不是则跳至N1
ACALL DELAY ;消除抖动
JNB P0.0,$ ;K1(模式选择键)放开了?
ACALL DELAY ;消除抖动
AJMP SET ;转到定时模式SET
N1: MOV 2FH,R6 ;将时钟数据载入2FH中
MOV 2EH,R5 ;将分钟数据载入2EH中
MOV ADR46,#00 ;把93C46地址置0
SETB RS0 ;将工作寄存器组选择1区
LOOP1: MOV A,#READ ;读93C46
ACALL TO93c46
MOV A,R3 ;取出定时器的状态
ANL A,#01H
CJNE A,#01H,N2 ;定时器为关闭,则跳转至N2
MOV A,R4 ;取出定时器分钟数据
CJNE A,2FH,N2 ;定时器分钟数据与时钟分钟不同则转至N2 MOV A,R5 ;取出定时器时钟数据
CJNE A,2EH,N2 ;定时器时钟数据与时钟时钟不同则转至N2 SETB P2.1 ;定时器时间到,打铃
MOV A,ADR46 ;将93C46地址载入A中
N2: CJNE A,#1EH,N3 ;到定时器数据表表尾?没到转至N3 MOV ADR46,#00 ;到表尾,置93C46地址为表头
AJMP LOOP1 ;转至LOOP1
N3: INC ADR46 ;93C46地址加2
INC ADR46
AJMP LOOP1 ;转至LOOP1
SET: CLR P0.5 ;校时模式
SETB p0.6
CLR P0.7
LOOPS: JB P0.0,N11 ;K1(模式选择键)按了?不是则跳至N11 ACALL DELAY ;消除抖动
JNBP0.0,$ ;K1(模式选择键)放开了?
ACALL DELAY ;消除抖动
AJMP SETTIME ;转至SETTIME
N11: JB P0.1,N13 ;K2(时钟加1键)按了?不是则跳至N13 ACALL DELAY ;消除抖动
MOV A,R6 ;将时寄存器的值载入A
ADD A,#01H ;A内容加1
DA A ;做十进制调整
MOV R6,A ;将A的值存入时寄存器
CJNE A,#24H,N12 ;是否超过24时?不是则跳至N12
MOV R6,#00H ;是则清除时寄存器的值为00
N12: JNB P0.1,$ ;K2(时钟加1键)放开了?
ACALL DELAY ;消除抖动
N13: JB P0.2,N15 ;K3(分钟加1键)按了?不是则跳至N15 ACALL DELAY ;消除抖动
MOV A,R5 ;将分寄存器的值载入A
ADD A,#01 ;A内容加1
DA A ;做十进制调整
MOV R5,A ;将A的值存入分寄存器
CJNE A,#60H,N14 ;是否超过60分?不是则跳至N14
MOV R5,#00H ;是则清除分寄存器的值为00
N14: JNB P0.2,$ ;K3(分钟加1键)放开了?
ACALL DELAY ;消除抖动
N15: JB P0.3,N17 ;K4(秒钟加1键)按了?不是则跳至N17 ACALL DELAY ;消除抖动
MOV A,R4 ;将秒寄存器的值载入A
ADD A,#01 ;A内容加1
DA A ;做十进制调整
MOV R4,A ;将A的值存入秒寄存器
CJNE A,#60H,N16 ;是否超过60秒?不是则跳至N16
MOV R4,#00 ;是则清除分寄存器的值为00
N16: JNB P0.3,$ ;K4(秒钟加1键)放开了?
ACALL DELAY ;消除抖动
N17: AJMP LOOPS ;转至LOOPS
SETTIME:CLR P0.5 ;定时模式
CLR P0.6
SETB P0.7
MOV ADR46,#00H
MOV A,#READ ;读93C46地址为ADR46中的数据
ACALL TO9346
LOOPB:ACALL DISP ;调用DISP
JB P0.0,N21 ;K1(模式选择键)按了?不是则跳至N21
ACALL DELAY ;消除抖动
JNB P0.0,$ ;K1(模式选择键)放开了?
ACALL DELAY ;消除抖动
AJMP LOOP ;转至LOOP
N21: JB P0.1,N22 ;K2(定时器组加1键)按了?不是则跳至N22 ACALL DELAY ;消除抖动
MOV A,ADR46 ;将地址载入A
CLR C ;清除进位位
RRC A ;A右移1位
ADD A,#01H ;地址加1
MOV R6,A ;将A存入R6
CLR C ;清除进位位
RLC A ;A左移1位
MOV ADR46,A ;将A中地址存入ADR46
MOV A,#READ ;读93C46地址为ADR46中的数据
ACALL TO9346
JNB P0.1,$ ;K2(定时器组加1键)放开了?
ACALLDELAY ;消除抖动
N22: JB P0.2,N24 ;K3(定时器分钟加1键)按了?不是则跳至N24 ACALLDELAY ;消除抖动
MOV A,R4 ;将定时器分寄存器的值载入A
ADD A,#01 ;A内容加1
DA A ;做十进制调整
MOV R4,A ;将A的值存入定时器分寄存器
CJNE A,#60H,N23 ;是否超过60分?不是则跳至N16
MOV R4,#00H ;是则清除分寄存器的值为00
N23: JNB P0.2,$ ;K3(定时器分钟加1键)放开了?
ACALL DELAY ;消除抖动
N24: JB P0.3,N26 ;K4(定时器时钟加1键)按了?不是则跳至N26 ACALL DELAY ;消除抖动
MOV A,R5 ;将定时器时寄存器的值载入A
ADD A,#01H ;A内容加1
DA A ;做十进制调整
MOV R5,A ;将A的值存入定时器时寄存器
CJNE A,#24H,N25 ;是否超过24时?不是则跳至N25
MOV R5,#00 ;是则清除分寄存器的值为00
N25:JNB P0.3,$ ;K4(定时器时钟加1键)放开了?
ACALL DELAY ;消除抖动
N26:JB P0.4,N27 ;K5(改变定时器状态存储键)按了?不是则跳至N27 ACALL DELAY ;消除抖动
INC R3 ;改变R3最低位的值(表示定时器的状态,1表示开,0
表示关)
MOV A,#WRITE ;将A的值写入93C46地址为ADR46中
ACALL TO9346
JNB P0.4,$ ;K5(改变定时器状态存储键)放开了?
ACALL DELAY ;消除抖动
N27:AJMP LOOPB ;转至LOOPB
3.读写93C46程序:
TO9346:SETB CS ;CS=1
SETB DI ;DI=1
SETB CLK ;CLK=1
ACALL DELAY
CLR CLK ;CLK=0
ACALL DELAY
MOV DPTR,#JPTBL46
JMP @A+DPTR;
JPTBL46:AJMPSREAD ;读
AJMP SWRITE ;写
AJMP SEWEN ;写使能
AJMP SEWDS ;写禁止
SREAD: MOV A,ADR46 ;地址载入A
ADD A,#80H ;10XXXX读指令
ACALL SDT46 ;读入地址
ACALL RDT46 ;读定时器时钟数据
MOV R5,A ;存入R5
ACALL RDT46 ;读定时器分钟数据
MOV R4,A ;存入R4
INC ADR46 ;地址加1
MOV A,ADR46 ;地址载入A
ADD A,#80H ;10XXXX读指令
ACALL SDT46 ;读入地址
ACALL RDT46 ;读定时器状态数据ACALL RDT46
DEC ADR46
MOV R3,A ;存入R3
AJMP EX9346
SWRITE:MOVA,ADR46 ;写入地址载入A ADD A,#40H ;01XXXX写指令
ACALL SDT46 ;载入地址
MOV A,R5 ;载入定时器时钟数据ACALL SDT46 ;写入定时器时钟数据MOV A,R4 ;载入定时器分钟数据ACALL SDT46 ;写入定时器分钟数据INC ADR46 ;地址加1
MOV A,ADR46 ;写入地址载入A
ADD A,#40H ;01XXXX写指令
ACALL SDT46 ;载入地址
MOV A,R3 ;载入定时器状态数据
DEC ADR46 ;地址减1
ACALL ADR46 ;写入定时器状态数据AJMP EX9346 ;转至EX9346
SEWEN:MOVA,#30H ;0011XXXX写使能指令ACALL SDT46
AJMP EX9346
SEWDS:CLR A ;0000XXXX写禁止指令ACALL SDT46
EX9346:CLRCS ;CS=0
RET
SDT46:MOV R2,#8 ;写入8位数据
SD1: RLC A
MOV DI,C
SETB CLK
ACALL DELAY
CLR CLK
ACALL DELAY
DJNZ R2,SD1
RET
RDT46:MOV R2,#8 ;读出8位数据
RD1: SETB CLK
ACALL DELAY
CLR CLK
ACALL DELAY
MOV C,DO
RLC A
DJNZ R2,RD1
RET
DELAY:MOVR7,#0FH ;
DJNZ R7,$
RET
4.中断程序:
TIM0:MOV TH0,#THIGH ;重设计时4000微秒
MOV TL0,#TLOW
PUSH ACC ;将A的值存入堆栈
PUSH PSW ;将PSW的值存入堆栈
CLR RS0 ;设置工作寄存器为0区
DJNZ R2,X2 ;计时1秒
MOV R2,#250
ACALL CLOCK ;调用计时子程序CLOCK
ACALL DISP ;调用显示子程序
X2:ACALL SCAN ;调用扫描子程序
POP PSW
POP ACC
RETI
显示器驱动程序:
SCAN:MOV R0,#28H ;(28H)为扫描指针
INC @R0 ;扫描指针加1
CJNE @R0,#6,X3 ;扫描完6个显示器?不是跳至X3
MOV @R0,#00 ;是则扫描指针为0
X3:MOV A,@R0 ;扫描指针载入A
ADD A,#20 ;A加常数20H(显示寄存器地址)=各时间显示区地址;存入R1=各时间显示地址
MOV R1,A ;扫描指针存入A
MOV A,@R0 ;将A高低4位交换(P1高4位为扫描值,
SWAP A ;低4位为显示数据值)
ORL A,@R1 ;扫描值+显示值
MOV R1,A ;输出至P1
RET
计时程序:
CLOCK:MOV A,R4 ;R4为秒寄存器
ADD A,#01 ;加1
DA A ;做十进制调整
MOV R4,A ;存入秒寄存器
CJNE A,#TIMEN,X4 ;是否超过打零连续时间?不是则跳至X4 CLR P2.0 ;关铃
X4:CJNE A,#60H,X5 ;是否超过60秒?不是则跳至X5
MOV R4,#00 ;是则清除为0
MOV A,R5 ;R5为分寄存器
ADD A,#01 ;加1
DA A ;做十进制调整
MOV R5,A ;存入分寄存器
CJNE A,#60H,X5 ;是否超过60分?不是则跳至X5
MOV R5,#00 ;是则清除为0
MOV A,R6 ;R6为时寄存器
ADD A,#01 ;加1
DA A ;做十进制调整
MOV R6,A ;存入时寄存器
CJNEA,#60H,X5 ;是否超过24时?不是则跳至X5
MOV R6,#00 ;是则清除为0
X5:RET
5.显示程序:
DISP:MOVR1,#20 ;(20H)为显示寄存器,R1=20H
MOV A,R6 ;将时寄存器的内容存入A
MOV B,#01H ;设B累加器的值为10H
DIV AB ;A/B,商(十位数)存入A,余数(个位数)存入B MOV @R1,B ;将B的内容存入(20H)
INC R1 ;R1=21H
MOV @R1,A ;将A的内容存入(21H)
INC R1 ;R1=22H
MOV A,R5 ;将分寄存器的内容存入A
MOV B,#01H ;设B累加器的值为10H
DIV AB ;A/B,商(十位数)存入A,余数(个位数)存入B MOV @R1,B ;将B的内容存入(22H)
INC R1 ;R1=23H
MOV @R1,A ;将A的内容存入(23H)
INC R1 ;R1=24H
MOV A,R4 ;将秒寄存器的内容存入A
MOV B,#01H ;设B累加器的值为10H
DIV AB ;A/B,商(十位数)存入A,余数(个位数)存入B MOV @R1,B ;将B的内容存入(24H)
INC R1 ;R1=25H
MOV @R1,A ;将A的内容存入(25H)
RET
END
四、印板图与制作:
五、总结与体会
经过近二周的努力,在老师和同学的帮助下,我基本上完成了设计任务.通过这次课程设
计,我充分认识到了自学的重要性,以及学以致用的道理.我在图书馆查阅了大量的资料,同时也认识到了图书馆的重要作用.在今后的学习过程中,应该多到图书馆看一些专业方面的书籍, 以丰富自己的知识.也使我加深了对单片机知识的了解和应用和对线路CAD 的理解和应用.
由于知识水平的局限和时间的仓促,设计中可能会存在着一些不足,我真诚的接受老师和同
学的批评和指正.最后衷心感谢老师的悉心指导和同学们的热心帮助!。

相关文档
最新文档