萬用電路板

----纯属爱好,谁与共鸣

« 改进版8位数码管汇编数字钟为方便日后升级,LED3216接线更改说明 »

单片机课程设计之自动打铃系统

        这是我们本学期的单片机课程设计题目,程序就是在昨天的数字钟的基础上增加了一些内容,不想继续做了,还有一门考试要复习。

设计一台自动打铃系统
一、设计任务
       用单片机器件为主体,设计一台自动打铃系统。
       (1)按照设计标准,画出系统框图和系统硬件电路图。
       (2)完成该课题的程序设计,提交程序设计框图及程序设计清单。
       (3)提交课程设计报告
二、设计要求
(一)基本要求
       (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秒。
       (4)特色和创新自选。
三、设计步骤
       (1)设计能正常工作的一个单片机最小硬件系统,外围电路包括设置键盘,LCD或LED的显示屏;
       (2)进行软件设计,利用单片机系统时钟先设计一个高精度的内部时钟系统,最小精确时间为期1秒;
       (3)在秒计数器的基础上设计一个24小时时钟,并设计若干定时功能;
       (4)设计打铃执行机构,完成自动打铃功能。
四、课程设计说明书要求
        后面略......
 
公开我的主要设计资料:
 
系统硬件电路图(点击放大):
 

主程序流程图:

汇编程序清单:

/***************************************************************
程序名称:51单片机自动打铃系统
简要说明:实现24小时制电子钟,8位数码管显示,显示时分秒
    显示格式:23-59-59(小时十位如果为0则不显示)
    到预定时间启动蜂鸣器模拟打铃,蜂鸣器BEEP:P3.7
    打方式分起床、熄灯铃和上、下课铃两种
    系统使用4只按键,3只按键用来调整时间,另一只为强制打铃按钮
    调整选择键SET_KEY:P1.0;通过选择键选择调整位,选中位闪烁
    增加键ADD_KEY:P1.1;按一次使选中位加1
    减少键DEC_KEY;P1.2;按一次使选中位减1
    如果长按ADD_KEY或DEC_KEY,识别后则进行调时快进,此时停止闪烁
    如果选中位是秒,则按增加键或减少键都是将秒清零
    强制打铃键DALING_KEY:P1.3;用来强制打铃或强制关闭铃声
    P0口输出数码管段选信号,P2口输出数码管位选信号。晶振12M
编    写:JiangX.net
最后更新:09/1/2晚
***************************************************************/
  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     ;程序结束

原创作品如转载,请注明:转载自萬用電路板 [ http://www.jiangx.net/ ]

  • quote 18.影子
  • 你好!我想问一下,如果加入DS1302时钟芯片,那么应该怎样编写程序呢?谢谢!!
  • 2010-3-23 14:16:16 回复该留言
  • quote 17.rongpeng
  • 您好!!我只是一个刚刚接触单片机的大三学生 来到你这看到了好多有用的东西,能把你的邮箱给我吗??我的邮箱在上面写了 ,我想以后有什么问题(如果你有时间)也可以找你帮忙!!谢谢!!
  • 2009-11-17 20:48:00 回复该留言
  • quote 15.飘絮
  • jiangx 你好! 我是初学者,这个程序有几个地方没看懂,比如46H表示什么啊?前面似乎没有说明 可否讲下哈。
    SETB 47H ;使用一个bit位用于产生脉冲用于调时快进时基,如何产生脉冲,快进时基又是什么啊?
    我问题比较多,版主你可不可以加我qq呢 请的qq:514993855 万分感谢!
  • 2009-7-17 10:14:47 回复该留言
  • quote 14.jiangx
  • 回复吖7:可行!
    啊7 于 2009-5-6 9:44:31 回复
    那要怎样改呢? 帮忙改一下好不好? 我现在一头雾水..
    啊7 于 2009-5-6 9:44:51 回复
    谢谢了!!!
  • 2009-5-5 14:50:25 回复该留言
  • quote 13.吖7
  • 版主,你好,我想问一下,可以改下程序用按键来改变闹钟时间吗??(我老师说可以,下面有我跟他的聊天记录)可以的话该怎样呢?等待你的回答,谢谢!

    老师 22:29:13
    在程序中有个默认的电铃时间
    程序运行后复制到数据存储区
    按某个键后进入修改这个闹铃时间
    你只需修改电铃时间输入、修改部分
    电铃时间是个数组表

    我 22:32:14
    噢 用不用外接存储芯片呢?

    罗老师啦 22:32:40
    看数据大小
    估计可以不用
    每个时间可以用1字节表示
    高4位表示小时
    低4位表示分钟
  • 2009-5-5 13:07:18 回复该留言
  • quote 12.jiangx
  • 回复辛格尔:型号是LG3641BH。
    这个不重要,只要知道是四位一体共阳数码管,会用就行了
    辛格尔 于 2009-4-23 20:14:13 回复
    谢谢版主!
  • 2009-4-22 23:14:38 回复该留言
  • quote 11.jiangx
  • 回复小米:加了,如果问题能够列出来,建议还是先留言,这样其它爱好者也可以参考和解答。
  • 2009-4-22 23:12:25 回复该留言
  • quote 10.辛格尔
  • 版主,请问你那个自动打铃系统用的数码管是什么型号?谢谢!
  • 2009-4-22 20:45:30 回复该留言
  • quote 9.小米
  • jiangx 你好,对于你这个电路图,我有问题想问你,可以加我qq吗?534093016 谢谢!!
  • 2009-4-22 19:57:02 回复该留言
  • quote 7.蓝田雨
  • jiangx哥您好,自动打铃器中如果单片机外加扩展at93c46电擦除可编程只读存储器,那at93c46中存储哪些程序?
  • 2009-4-8 16:49:45 回复该留言
  • quote 6.飞翔
  • jiangx哥 您好,自动打铃器如果单片机外部扩展at93c46电擦除可编程只读存储器的话,那么at93c46里面都存放哪些程序?
  • 2009-4-8 16:44:21 回复该留言
  • quote 5.蓝田雨
  • 我是一个初学者,偶然的机会看到了这个网页,感觉受益匪浅,哈哈,太崇拜你了。
    能qq加我吗?我的是369964088
    jiangx 于 2009-4-9 23:02:46 回复
    加了。
  • 2009-4-8 14:32:42 回复该留言
  • quote 4.小米
  • 你好Jiangx 我现在就是做这个毕业设计的,看你做得很好,能发一份给我吗?nickyluo110@163.com 谢谢!!
    jiangx 于 2009-3-9 9:51:40 回复
    很抱歉我们做的时候是用手写的,没有电子档,最后仅存上面这些硬件电路图和软件设计。
  • 2009-3-8 13:42:59 回复该留言
  • quote 3.淡淡
  • 我刚学单片机,看起来比较深,请问下此设计的工作原理和各部分作用。
  • 2009-3-6 16:11:47 回复该留言
  • quote 2.单片机课程设计之自动打铃系统
  • 请问下,你的打铃时间是固定的吧,那如果要改变打铃时间,是不是要重新编译。
    jiangx 于 2009-2-16 20:25:58 回复
    对,改变打铃时间只有在程序里改了再重新编译
  • 2009-2-16 17:26:28 回复该留言
  • quote 1.请教下您
  • 如果再加两个点是不是该这样写呢?B8和B9那两段?
    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,B8
    MOV A,22H
    CJNE A,#30H,B8 ;11:30
    SETB 44H
    RET

    B8: MOV A,23H
    CJNE A,#13,B9;13:30
    MOV A,22H
    CJNE A,#30H,B9
    SETB 44H
    RET
    B9: MOV A,23H
    CJNE A,#14,EXIT_2;14:20
    MOV A,22H
    CJNE A,#20,EXIT_2
    SETB 44H
    RET


    EXIT_2:
    CLR 44H
    RET
    jiangx 于 2009-1-20 14:04:11 回复
    你好,没错!
  • 2009-1-12 18:16:56 回复该留言

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

赞助商广告

最近发表

热文排行

最新评论及回复

广告

图标汇集

Powered By Z-Blog 1.8 Walle Build 100427

Copyright 2008-2011 JiangX.com 萬用電路板 All Rights Reserved.
鄂ICP备08003060号 [login]