0
问答首页 最新问题 热门问题 等待回答标签广场
我要提问

电子百科

自动打铃系统

自动打铃系统

基本方案

  •   (1)基本计时和显示功能(用12小时制显示)。包括上下午标志,时、分的数字显示,秒信号指示。

      (2)能设置当前时间(含上、下午,时,分)

      (3)能实现基本打铃功能,规定:

      上午6:00起床铃:打铃5秒、停2秒、再打铃5秒。

      下午10:30熄灯铃:打铃5秒、停2秒、再打铃5秒。

      铃声可用小喇叭播放,凡是用到铃声功能的均按此处理。

拓展方案

  •   (1)增加整点报时功能,整点时响铃5秒,要求有控制启动和关闭功能。

      (2)增加调整起床铃、熄灯铃时间的功能。

      (3)增设上午4节课的上下课打铃功能,规定如下:

      7.30 上课,8.20下课:8.30上课,9.20下课;9.40 上课,10.30下课;10.40上课,11.30下课;每次铃声5秒。

软件设计

  •   程序简要说明

      1)实现24小时制电子钟,8位数码管显示,显示时分秒

      2)显示格式:23-59-59(小时十位如果为0则不显示)

      3)到预定时间启动蜂鸣器模拟打铃,蜂鸣器BEEP:P3.7

      4)打铃方式分起床、熄灯铃和上、下课铃两种

      5)系统使用4只按键,3只按键用来调整时间,另一只为强制打铃按钮

      6)调整选择键SET[_]KEY:P1.0;通过选择键选择调整位,选中位闪烁

      7)增加键ADD[_]KEY:P1.1;按一次使选中位加1

      8)减少键DEC[_]KEY;P1.2;按一次使选中位减1

      9)如果长按ADD[_]KEY或DEC[_]KEY,识别后则进行调时快进,此时停止闪烁

      10)如果选中位是秒,则按增加键或减少键都是将秒清零

      11)强制打铃键DALING[_]KEY:P1.3;用来强制打铃或强制关闭铃声

      12)P0口输出数码管段选信号,P2口输出数码管位选信号。晶振12M

      源程序

      BEEP EQU P3.7  ;定义蜂鸣器(电铃)控制信号输出口

      ORG 0000H   ;程序入口地址

      LJMP START

      ORG 000BH   ;定时器0中断入口地址

      LJMP TIMER[_]0

      ORG 0300H

      /*****程序开始,初始化*****/

      START:

      SETB BEEP   ;关闭蜂鸣器(电铃)

      SETB 48H   ;使用一个bit位用于调时闪烁标志

      SETB 47H   ;使用一个bit位用于产生脉冲用于调时快进时基

      CLR  45H   ;关闭响铃方式1标志

      CLR  44H   ;关闭响铃方式2标志

      MOV R1,#0   ;调整选择键功能标志:0正常走时、1调时、2调分、3调秒

      MOV 20H,#00H  ;用于控制秒基准时钟源的产生

      MOV 21H,#00H  ;清零秒寄存器

      MOV 22H,#00H  ;清零分寄存器

      MOV 23H,#00H  ;清零时寄存器

      MOV 24H,#00H  ;用于控制调时闪烁的基准时钟的产生

      MOV IP,#02H   ;IP,IE初始化

      MOV IE,#82H

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

      MOV TH0,#3CH

      MOV TL0,#0B0H  ;赋定时初值,定时50ms

      SETB TR0   ;启动定时器0

      MOV SP,#40H   ;重设堆栈指针

      /*****主程序*****/

      MAIN:

      CJNE R1,#00H,MAIN1 ;是否为正常走时状态

      LCALL BIJIAO1  ;调用起床、熄灯打铃比较子程序

      LCALL BIJIAO2  ;调用上、下课打铃比较子程序

      LCALL DALING1  ;调用响铃方式1执行子程序

      LCALL DALING2  ;调用响铃方式2执行子程序

      MAIN1:

      LCALL DISPLAY   ;调用显示子程序

      LCALL KEY[_]SCAN   ;调用按键检测子程序

      JZ MAIN    ;无键按下则返回重新循环

      LCALL SET[_]KEY   ;调用选择键处理子程序

      JB 46H,MAIN   ;如果已进行长按调整(调时快进),则不再执行下面的单步调整

      LCALL ADD[_]KEY  ;调用增加键处理子程序

      LCALL DEC[_]KEY  ;调用减少键处理子程序

      LCALL DALING[_]KEY ;处理强制打铃/强制关闭铃声键

      LJMP MAIN    ;重新循环

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

      TIMER[_]0:

      PUSH ACC

      PUSH PSW    ;保护现场

      MOV TH0,#3CH

      MOV TL0,#0B0H   ;重新赋定时初值

      CPL 47H    ;产生脉冲用于调时快进时基

      INC 24H

      MOV A,24H

      CJNE A,#10,ADD[_]TIME ;产生0.5秒基准时钟,用于调时闪烁

      CPL 48H    ;取反调时闪烁标志位

      MOV 24H,#00H

      ADD[_]TIME:

      INC 20H

      MOV A,20H

      CJNE A,#20,RETI1 ;产生1秒基准时钟

      MOV 20H,#00H   ;一秒钟时间到,清零20H

      MOV A,21H

      ADD A,#01H

      DA A       ;作十进制调整

      MOV 21H,A

      CJNE A,#60H,RETI1

      MOV 21H,#00H   ;一分钟到

      MOV A,22H

      ADD A,#01H

      DA A

      MOV 22H,A

      CJNE A,#60H,RETI1

      MOV 22H,#00H   ;一小时到

      MOV A,23H

      ADD A,#01H

      DA A

      MOV 23H,A

      CJNE A,#24H,RETI1

      MOV 23H,#00H   ;到24点,清零小时

      RETI1:

      POP PSW

      POP ACC    ;恢复现场

      RETI     ;中断返回

      /*****显示处理*****/

      DISPLAY:

      MOV A,21H    ;秒

      ANL A,#0FH

      MOV 2FH,A   ;转换出秒个位,存入2FH

      MOV A,21H

      ANL A,#0F0H

      SWAP A

      MOV 2EH,A   ;转换出秒十位,存入2EH

      JB 46H,MIN   ;如果长按按键(调时快进),则跳过闪烁处理

      CJNE R1,#3,MIN  ;如果R1为3,闪烁秒位待调整

      JB 48H,MIN

      MOV 2FH,#0AH  ;使该位为10,查表得到使该位不显示的输出

      MOV 2EH,#0AH

      MIN:

      MOV A,22H    ;分

      ANL A,#0FH

      MOV 2DH,A   ;转换出分个位,存入2DH

      MOV A,22H

      ANL A,#0F0H

      SWAP A

      MOV 2CH,A   ;转换出分十位,存入2CH

      JB 46H,HOUR   ;如果长按按键(调时快进),则跳过闪烁处理

      CJNE R1,#2,HOUR  ;如果R1为2,闪烁分位待调整

      JB 48H,HOUR

      MOV 2DH,#0AH  ;使该位为10,查表得到使该位不显示的输出

      MOV 2CH,#0AH

      HOUR:

      MOV A,23H    ;时

      ANL A,#0FH

      MOV 2BH,A   ;转换出时个位,存入2BH

      MOV A,23H

      ANL A,#0F0H

      SWAP A

      MOV 2AH,A   ;转换出时十位,存入2AH

      JB 46H,DISP   ;如果长按按键(调时快进),则跳过闪烁处理

      CJNE R1,#1,DISP  ;如果R1为1,闪烁时位待调整

      JB 48H,DISP

      MOV 2BH,#0AH  ;使该位为10,查表得到使该位不显示的输出

      MOV 2AH,#0AH

      /*****数码管动态扫描显示*****/

      DISP:

      MOV DPTR,#TABLE

      MOV A,2FH

      MOVC A,@A+DPTR

      MOV P0,A

      CLR P2.7

      LCALL DELAY

      SETB P2.7   ;显示秒个位

      MOV A,2EH

      MOVC A,@A+DPTR

      MOV P0,A

      CLR P2.6

      LCALL DELAY

      SETB P2.6   ;显示秒十位

      MOV A,#0BFH

      MOV P0,A

      CLR P2.5

      LCALL DELAY

      SETB P2.5   ;显示“-”

      MOV A,2DH

      MOVC A,@A+DPTR

      MOV P0,A

      CLR P2.4

      LCALL DELAY

      SETB P2.4   ;显示分个位

      MOV A,2CH

      MOVC A,@A+DPTR

      MOV P0,A

      CLR P2.3

      LCALL DELAY

      SETB P2.3   ;显示分十位

      MOV A,#0BFH

      MOV P0,A

      CLR P2.2

      LCALL DELAY

      SETB P2.2   ;显示“-”

      MOV A,2BH

      MOVC A,@A+DPTR

      MOV P0,A

      CLR P2.1

      LCALL DELAY

      SETB P2.1   ;显示时个位

      MOV DPTR,#TABLE1 ;该位使用TABLE1以消除前置0

      MOV A,2AH

      MOVC A,@A+DPTR

      MOV P0,A

      CLR P2.0

      LCALL DELAY

      SETB P2.0   ;显示时十位

      RET

      /*****按键检测子程序*****/

      KEY[_]SCAN:

      CLR 46H    ;关闭长按调整(调时快进)标志

      MOV P1,#0FFH   ;将P1口设置成输入状态

      MOV A,P1

      CPL A

      ANL A,#0FH    ;P1口低4位连接4个按键,只判断该4位

      JZ EXIT[_]KEY   ;无键按下则返回

      LCALL DELAY   ;延时去抖动

      MOV A,P1   ;重新判断

      CPL A

      ANL A,#0FH

      JZ EXIT[_]KEY   ;键盘去抖动

      MOV R5,A    ;临时将键值存入R5

      MOV R4,#00H   ;用于控制调时快进速度

      ;设置为00H是为了在进入长按处理前加长延时区分用户的长按与短按,防止误快进

      LOOP:      ;进入长按处理

      LCALL DISPLAY  ;使长按时显示正常

      MOV A,P1

      CPL A

      ANL A,#0FH

      JB 47H,LOOP1

      INC R4    ;调时快进间隔时间基准加1

      LOOP1:

      CJNE R1,#03H,LOOP2 ;如果调秒时长按,则不处理

      LJMP LOOP3

      LOOP2:

      CJNE R4,#99H,LOOP3

      MOV R4,#70H   ;确认用户长按后,重新设定起始值,加快调时快进速度

      SETB 46H   ;长按调整(调时快进)标志

      LCALL ADD[_]KEY

      LCALL DEC[_]KEY

      LOOP3:

      JNZ LOOP    ;等待键释放

      MOV A,R5   ;输出键值

      RET

      EXIT[_]KEY:

      RET

      /*****延时子程序*****/

      DELAY:

      MOV R7,#150

      DJNZ R7,$

      RET

      /*****选择键处理子程序*****/

      SET[_]KEY:

      CJNE R5,#01H,EXIT ;选择键键值

      INC R1    ;调整选择功能标志加一

      SETB BEEP

      CJNE R1,#4,EXIT

      MOV R1,#0

      MOV 24H,#00H  ;调时闪烁基准清零

      RET

      /*****增加键处理子程序*****/

      ADD[_]KEY:

      CJNE R5,#02H,EXIT ;增加键键值

      CJNE R1,#01H,NEXT1 ;选择键功能标志为1,调时,否则跳出

      MOV A,23H

      ADD A,#01H

      DA A

      MOV 23H,A

      CJNE A,#24H,EXIT

      MOV 23H,#00H

      NEXT1:

      CJNE R1,#02H,NEXT2 ;选择键功能标志为2,调分,否则跳出

      MOV A,22H

      ADD A,#01H

      DA A

      MOV 22H,A

      CJNE A,#60H,EXIT

      MOV 22H,#00H

      NEXT2:

      CJNE R1,#03H,EXIT ;选择键功能标志为3,调秒,否则跳出

      MOV 21H,#00H  ;如增加键按下直接清零秒

      RET

      /*****减少键处理子程序*****/

      DEC[_]KEY:

      CJNE R5,#04H,EXIT ;减少键键值

      CJNE R1,#01H,NEXT3 ;选择键功能标志为1,调时,否则跳出

      MOV A,23H

      ADD A,#99H

      DA A

      MOV 23H,A

      CJNE A,#99H,EXIT

      MOV 23H,#23H

      NEXT3:

      CJNE R1,#02H,NEXT4 ;选择键功能标志为2,调分,否则跳出

      MOV A,22H

      ADD A,#99H

      DA A

      MOV 22H,A

      CJNE A,#99H,EXIT

      MOV 22H,#59H

      NEXT4:

      CJNE R1,#03H,EXIT ;选择键功能标志为3,调秒,否则跳出

      MOV 21H,#00H  ;如较少键按下直接清零秒

      RET

      /*****强制响铃键处理子程序*****/

      DALING[_]KEY:

      CJNE R5,#08H,EXIT ;选择键键值

      CPL BEEP

      RET

      /*****万用返回程序*****/

      EXIT:

      RET

      /*****数码管字形编码表*****/

      TABLE:

      DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H,0FFH ;字形显示编码

      TABLE1:

      DB 0FFH,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H,0FFH ;小时位的十位数编码,该位如果为0则不显示

      /*****打铃时间对比程序(起床、熄灯)*****/

      BIJIAO1:

      MOV A,23H

      CJNE A,#06H,B0

      MOV A,22H

      CJNE A,#00H,B0  ;6:00到

      SETB 45H   ;开启响铃方式1

      RET

      B0:  MOV A,23H

      CJNE A,#22H,EXIT[_]1

      MOV A,22H

      CJNE A,#30H,EXIT[_]1 ;22:30到

      SETB 45H   ;开启响铃方式1

      RET

      EXIT[_]1:

      CLR 45H

      RET

      /*****打铃时间对比程序(上、下课)*****/

      BIJIAO2:

      MOV A,23H

      CJNE A,#07H,B1

      MOV A,22H

      CJNE A,#30H,B1  ;7:30

      SETB 44H   ;开启响铃方式2

      RET

      B1:  MOV A,23H

      CJNE A,#08H,B2

      MOV A,22H

      CJNE A,#20H,B2  ;8:20

      SETB 44H

      RET

      B2:  MOV A,23H

      CJNE A,#08H,B3

      MOV A,22H

      CJNE A,#30H,B3  ;8:30

      SETB 44H

      RET

      B3:  MOV A,23H

      CJNE A,#09H,B4

      MOV A,22H

      CJNE A,#20H,B4  ;9:20

      SETB 44H

      RET

      B4:  MOV A,23H

      CJNE A,#09H,B5

      MOV A,22H

      CJNE A,#40H,B5  ;9:40

      SETB 44H

      RET

      B5:  MOV A,23H

      CJNE A,#10H,B6

      MOV A,22H

      CJNE A,#30H,B6  ;10:30

      SETB 44H

      RET

      B6:  MOV A,23H

      CJNE A,#10H,B7

      MOV A,22H

      CJNE A,#40H,B7  ;10:40

      SETB 44H

      RET

      B7:  MOV A,23H

      CJNE A,#11H,EXIT[_]2

      MOV A,22H

      CJNE A,#30H,EXIT[_]2 ;11:30

      SETB 44H

      RET

      EXIT[_]2:

      CLR 44H

      RET

      /*****响铃方式1程序(响5秒停2秒再响5秒)*****/

      DALING1:

      JNB 45H,EXIT[_]DALING

      MOV A,21H   ;响铃起始时间由秒实时控制

      CJNE A,#00H,L1

      CLR BEEP

      L1:

      MOV A,21H

      CJNE A,#05H,L2

      SETB BEEP

      L2:

      CJNE A,#07H,L3

      CLR BEEP

      L3:

      CJNE A,#12H,EXIT[_]DALING

      SETB BEEP

      RET

      /*****响铃方式2程序(响5秒)*****/

      DALING2:

      JNB 44H,EXIT[_]DALING

      MOV A,21H   ;响铃起始时间由秒实时控制

      CJNE A,#00H,L4

      CLR BEEP

      L4:

      MOV A,21H

      CJNE A,#05H,EXIT[_]DALING

      SETB BEEP

      RET

      EXIT[_]DALING:

      RET

      END     ;程序结束

提问者:cigudefeng 地点:- 浏览次数:1034 提问时间:05-24 08:27
我有更好的答案
提 交
撰写答案
提 交
1 / 3
1 / 3
相关电子百科
3D晶体管
双极性晶体管
大功率晶体管
光敏电阻器
晶体管时间继电器