一、课程设计的内容和要求:
1了解单片机的种类,掌握单片机的工作原理; 2 掌握利用单片机进行系统设计的方法;
3掌握利用protel进行原理图设计和PCB设计的方法; 4学会进行单片机硬件调试和软件调试; 5 了解单片机系统整个设计开发流程。 二、设计装置功能
1、用单片机实现设计要求 (1)实现功能:
①正常的24小时制的电子表功能显示(时/分/秒)。 ②任意时间(时/分/秒)闹钟时刻的设置并在设定时刻响铃。 (2)所使用器件:
STC 89C52RC单片机1个、2位共阳极数码管3个、蜂鸣器1个、74LS138一片、74LS47一片、74HC04一片、电阻、电容及其他辅助电子元件。 (3)显示时间与闹钟时刻的设置: 单片机的人机操作部分由六个按钮组成。 从电子钟电路板上(从左到右)分别是:
①单片机复位键 ②闹钟开关 ③小时位累加键 ④分钟位累加键 ⑤秒钟位累加键 ⑥闹钟/时间显示切换键 按键说明:
复位键——把3个2位数码管显示数字全部清零。 闹钟开关键——按下键,闹钟开关模式切换。
1
时针位累加键——按下键,则实现时针位的累加00-23(累加循环)。 分针位累加键——按下键,则实现分针位的累加00-59(累加循环)。 秒针位累加键——按下键,则实现秒针位的累加00-59(累加循环)。 闹钟/时间显示切换键——按下键,能够实现数码管闹钟和时间两种显示功能的切换。 三、设计问题分析
面对的问题主要是两方面:一个是软件的设计,也就是实现计时定时的控制功能的程序编辑,在电脑上模拟需要实现的功能;另一个是硬件的设计,需要我们自己购买器件、设计并焊接电路板。
而更为重要的一步是将软件、硬件相结合,做好电路后,我们试着把程序写入芯片测试,然而没有获得应该有的显示,接着我们多次检查电路,修改程序,在不断调试中终于实现正确显示。 四、设计思路
本次设计的系统以动态显示显示时分秒模块,它能显示正确的时间,而且所显示时间与北京时间相同,基本做到同步,显示清晰明亮,可读性强。
系统主程序开始后,首先是对系统环境初始化,设置好时分秒后系统开始运行;然后可打开闹钟,预设响铃的时刻,计时系统到该时刻后自动响设定铃声。使用者还可以根据自身的需要随时打开关闭闹钟。
由于系统的操作符合现在市面上电子表的显示和使用风格,设计人性化,因此该系统的实用性较强。
在闹铃的设置上,原本想用单片机唱出歌曲“最炫民族风”的,可惜作为编程员的我技术有限,虽然实现在不计时的情况下唱出声音,但是没能封装进现有
2
的计时程序中,这个是一件比较遗憾的事情。最后设置闹铃为“滴滴”的响声,一秒变换一次,虽然简单,不过使用可靠,并具有状态显示提示的功能。 (1)实验原理图
3
(2)Proteus Professional仿真图
4
(3)pcb接线板图
五、实验程序设计 单片机运行程序如下:
ORG 0000H LJMP MAIN
ORG 000BH
LJMP SERVE0 ;设置计数器0溢出跳转参数 MAIN:MOV SP,#60H MOV P1,#00H
MOV TMOD,#01H ;设置计时器0使用1模式 MOV TL0,#0E5H
MOV TH0,#0F0H ;设置计时器0初值
CLR P2.6 ;初状态关闭闹铃信号灯
5
SETB P2.7 ;初状态关闭闹铃响声
SETB ET0 SETB TR0
SETB EA ;打开中断,开始计时
MOV R1,#253 ;设置计数器0溢出次数 MOV R2,#00H ;设置时钟动态扫描初值为0
MOV R3,#00H ;时钟闹铃切换标志位,默认为显示时钟 MOV R4,#00H ;设置闹铃动态扫描初值为0
MOV R5,#00H ;设置是否按键开启闹铃,默认为不开启 MOV R6,#00H ;闹铃条件满足后,闹铃的响应次数,默认为0 MOV 30H,#00H ;时钟秒针位 MOV 31H,#00H ;时钟分针位 MOV 32H,#00H ;时钟时针位
MOV 40H,#00H ;闹铃秒针位 MOV 41H,#00H ;闹铃分针位
MOV 42H,#00H ;闹铃时针位,以上程序段为初始化各变量参数 LOOP:JB P0.0,NOPRESS2
CALL FILTER MOV A,R3 CPL A MOV R3,A
NOPRESS1:JNB P0.0,$
CALL FILTER ;对按键0的设置,实现闹铃与时钟切换,默认显示时钟 NOPRESS2:JB P0.1,NOPRESS4
CALL FILTER
CJNE R3,#00H,LING1
MOV A,30H ADD A,#1 DA A
MOV 30H,A
CJNE A,#60H,NOPRESS3 MOV 30H,#00H JMP NOPRESS3 LING1:MOV A,40H
6
ADD A,#1
DA A
MOV 40H,A
CJNE A,#60H,NOPRESS3 MOV 40H,#00H JMP NOPRESS3
NOPRESS3:JNB P0.1,$
CALL FILTER ;对按键1的设置,实现分别对时钟与闹铃的秒针的值
的更改
NOPRESS4:JB P0.2,NOPRESS6
CALL FILTER
CJNE R3,#00H,LING2 MOV A,31H ADD A,#1 DA A
MOV 31H,A
CJNE A,#60H,NOPRESS5 MOV 31H,#00H JMP NOPRESS5
LING2:MOV A,41H ADD A,#1 DA A
MOV 41H,A
CJNE A,#60H,NOPRESS5 MOV 41H,#00H JMP NOPRESS5
NOPRESS5:JNB P0.2,$
CALL FILTER ;对按键2的设置,
实现分别对时钟与闹铃的分针的值的更改
NOPRESS6:JB P0.3,NOPRESS8
CALL FILTER
CJNE R3,#00H,LING3 MOV A,32H ADD A,#1 DA A
MOV 32H,A
7
CJNE A,#24H,NOPRESS7 MOV 32H,#00H JMP NOPRESS7 LING3:MOV A,42H ADD A,#1 DA A
MOV 42H,A
CJNE A,#24H,NOPRESS7 MOV 42H,#00H JMP NOPRESS7
NOPRESS7:JNB P0.3,$
CALL FILTER ;对按键3的设置,实现分别
对时钟与闹铃的时针的值的更改
NOPRESS8:JB P0.4,NOPRESS10
CALL FILTER CPL P2.6 MOV A,R5 CPL A MOV R5,A MOV R6,#00H SETB P2.7
NOPRESS9:JNB P0.4,$
CALL FILTER ; 对按键4的设置,实现闹铃状态的切换,
默认闹铃为关
NOPRESS10: JMP LOOP ;以上为按键的设置 SERVE0:MOV TL0,#0E5H MOV TH0,#0F0H DJNZ R1,SCAN
MOV A,30H
CJNE A,40H,TURN1 MOV A,31H
CJNE A,41H,TURN1 MOV A,32H
CJNE A,42H,TURN1
8
CJNE R5,#0FFH,TURN1
MOV R6,#60 ;判断闹铃条件
TURN1: MOV A,30H ADD A,#1 DA A
MOV 30H,A
CJNE R6,#00H,MING SETB P2.7
JMP OK ;无闹铃状态下,秒值增加时对闹铃强制复位,
防止手触电路板造成闹铃误响
MING: CPL P2.7 DEC R6
CJNE R6,#00H,OK
CLR P2.6 ;满足闹铃状态时,每过1秒钟
对闹铃的电位进行一次修改, 达到响铃的目的
OK: CJNE A,#60H,INC_TIM MOV 30H,#00H
MOV A,31H ADD A,#1 DA A
MOV 31H,A
CJNE A,#60H,INC_TIM
MOV 31H,#00H ;时钟对分针值的自加 MOV A,32H ADD A,#1 DA A
MOV 32H,A
CJNE A,#24H,INC_TIM
MOV 32H,#00H ;时钟对时针值的自加
INC_TIM:MOV R1,#253 ;设置计时器0计时溢出时的操作
SCAN:CJNE R6,#00H,PROTECT
SETB P2.7 ;无闹铃时每一次溢出操作都闹铃复位,防止误
响
9
PROTECT: CJNE R3,#0,EXCHANGE ;判断条件,满足则动态显示闹铃,否则动态显
示时钟
CJNE R2,#6,DISPLAY2 MOV R2,#00H
DISPLAY2:CJNE R2,#0,CHK_12
MOV A,30H ANL A,#0FH ADD A,#00H JMP RELOAD2 CHK_12:CJNE R2,#1,CHK_22
MOV A,30H SWAP A ANL A,#0FH ADD A,#10H
JMP RELOAD2 CHK_22:CJNE R2,#2,CHK_32 MOV A,31H
ANL A,#0FH ADD A,#20H
JMP RELOAD2 CHK_32:CJNE R2,#3,CHK_42 MOV A,31H SWAP A ANL A,#0FH ADD A,#30H
JMP RELOAD2 CHK_42:CJNE R2,#4,CHK_52
MOV A,32H ANL A,#0FH ADD A,#40H
JMP RELOAD2 CHK_52:CJNE R2,#5,RELOAD2 MOV A,32H SWAP A ANL A,#0FH
;显示时钟秒针的个位 ;显示时钟秒针的十位 ;显示时钟时针的个位 10
;显示时钟分针的个位;显示时钟分针的十位
ADD A,#50H
JMP RELOAD2 ;显示时钟时针的十位
RELOAD2:MOV P1,A INC R2
MOV TH0,#0F0H
MOV TL0,#60H ;完成一次跳转 BACK:RETI
EXCHANGE:CJNE R4,#6,DISPLAY1
MOV R4,#00H ;当满足显示闹铃条件,则动态显示闹铃 DISPLAY1:CJNE R4,#0,CHK_11
MOV A,40H
ANL A,#0FH
ADD A,#00H
JMP RELOAD1 ;显示闹铃秒针个位 CHK_11:CJNE R4,#1,CHK_21 MOV A,40H SWAP A ANL A,#0FH ADD A,#10H
JMP RELOAD1 ;显示闹铃秒针十位 CHK_21:CJNE R4,#2,CHK_31 MOV A,41H ANL A,#0FH ADD A,#20H
JMP RELOAD1 ;显示闹铃分针个位 CHK_31:CJNE R4,#3,CHK_41 MOV A,41H SWAP A
ANL A,#0FH ADD A,#30H
JMP RELOAD1 ;显示闹铃分针十位 CHK_41:CJNE R4,#4,CHK_51 MOV A,42H ANL A,#0FH ADD A,#40H
JMP RELOAD1 ;显示闹铃时针个位
11
CHK_51:CJNE R4,#5,RELOAD1
MOV A,42H SWAP A ANL A,#0FH ADD A,#50H
JMP RELOAD1 ;显示闹铃时针十位 RELOAD1:MOV P1,A INC R4
MOV TH0,#0F0H MOV TL0,#0E5H
JMP BACK ;完成一次跳转
FILTER:MOV R6,#60H ;设置防抖动子程序
D1:MOV R7,#248 DJNZ R7,$ DJNZ R6,D1 RET END
原定闹铃代码(未封装)
ORG 0000H LJMP START ORG 000BH
INC 20H ;中断服务,中断计数器加1 MOV TH0,#0D8H
MOV TL0,#0EFH ;12M晶振,形成10毫秒中断 RETI
START: MOV SP,#50H MOV TH0,#0D8H
MOV TL0,#0EFH MOV TMOD,#01H MOV IE,#82H MUSIC0: NOP
MOV DPTR,#DAT ;表头地址送DPTR MOV 20H,#00H ;中断计数器清0 MOV B,#00H ;表序号清0 MUSIC1: NOP
12
CLR A
MOVC A,@A+DPTR ;查表取代码 JZ END0 ;是00H,则结束 CJNE A,#0FFH,MUSIC5 LJMP MUSIC3 MUSIC5: NOP
MOV R6,A INC DPTR MOV A,B
MOVC A,@A+DPTR ; MOV R7,A
SETB TR0 ;MUSIC2: NOP
CPL P2.0 MOV A,R6 MOV R3,A LCALL DEL MOV A,R7
CJNE A,20H,MUSIC2 ; ; MOV 20H,#00H ; INC DPTR ; INC B
LJMP MUSIC1 MUSIC3: NOP
CLR TR0 ; MOV R2,#0DH MUSIC4: NOP
MOV R3,#0FFH LCALL DEL
DJNZ R2,MUSIC4 INC DPTR LJMP MUSIC1 END0: NOP
MOV R2,#64H ;MUSIC6: MOV R3,#00H LCALL DEL
DJNZ R2,MUSIC6
取节拍代码送R7 启动计数 中断计数器(20H)=R7否? 不等,则继续循环 等于,则取下一代码 休止100毫秒 歌曲结束,延时1秒后继续 13
LJMP MUSIC0
DEL: NOP
DEL3: MOV R4,#02H DEL4: NOP
DJNZ R4,DEL4 NOP
DJNZ R3,DEL3 RET NOP DAT:
DB 39h,20h,39h,10h,40h,10h,39h,20h,30h,20h
DB 2bh,10h,26h,05h,2bh,05h,30h,10h,2bh,10h,26h,40h DB 39h,10h,1ch,10h,1ch,10h,20h,10h
DB 2bh,10h,26h,05h,2bh,05h,30h,10h,2bh,10h,26h,40h
DB 30h,10h,39h,10h,39h,10h,30h,10h,2bh,20h,40h,10h,40h,10h DB 26h,10h,20h,10h,26h,10h,2bh,10h,2bh,10h,30h,40h DB 39h,10h,30h,10h,2bh,10h,26h,10h,2bh,10h,30h,10h DB 40h,10h,4bh,10h,39h,40h END
六、实验过程及其结果
(1)制定好硬件原理图,编写好单片机运行程序后,我们在Proteus上进行了仿真,然后开始设计PCB板。以便购买元件在进行焊接。
(2)在我们组员同心协力,共同努力下,在不断调试中,经历了很多挫折,但是最终还是完成了预定功能的24小时制电子闹钟系统。
(3)功能在长期的检验下合格。时间显示每四天落后三秒钟,符合日常使用的标准,任意时间的闹钟也按时响,符合日常使用标准。
(4)在解决单片机电源的问题上,为了节约电池与稳定运行,我们使用了USB接口提供5V的电压供电子闹钟使用,这一措施具有很大促进作用,极大方便了软件调试、元件的精准的测量。
七、实验总结
作为我组的程序设计员,我得到以下体会:
1. 这次程序设计的过程让我进一步熟悉了KEIL与Proteus软件的使用,掌握了时钟编程的细节过程,进一步理解课本知识,对元器件的认识也进一步加深。
2. 通过这次设计,理解了51单片机的优点以及通用普遍性,可知单片机在现实生活中的应用是十分广泛的。
14
3. 在编写代码时应该小心谨慎,稍有差错变不会得出正确的结论,KEIL软件只能查出简单的语法错误,然而一些细节的逻辑错误KEIL软件无法查出,所以应该一步一步实现功能,脚踏实地检查代码的正确性。虽然编写程序单调繁琐,但是我还是能从中找到乐趣,在每一次进步,每一次成功封装的背后都少不了辛勤的汗水,所以个人感想:编程的感觉很好。 4. 单片机实物系统开发中我们经历了很多挫折,其中最难的一部分是将仿真的系统如何变成实物的过程。我们在最初仿真成功后,焊好电路板却发现这个系统不能运行,在使用万用表检查线路之后,发现了不少短线以及接触不良,在修整了以上错误之后,依然不能实现,因此有对芯片的电位进行了测量,找了不少网上芯片的真值表的资料,最后发现错误在显示管的极性上,更换为共阳极数码管后即可正确显示。
5. 调试的时候遇到的小问题还有许多,最主要的是时间与北京时间不同步,原因在与中断的时间与理想值不同,因此我们不断地修改定时程序,在一个定值范围内并不断检验,最后时间不断与北京时间趋近,最后经过四天检验,落后北京时间仅仅三秒。本应再加矫正部分实现更为精准的显示,然而因为时间问题不能进一步修改了,望老师见谅。
6. 在闹铃的设计上,我采用了“滴滴”的响声,听起来感觉就像家里的洗衣机,没有美感,在实验程序后面我附上了原来应该封装进去的“最炫民族风”的代码,虽然核心思想是别人的,但是谱子部分是我原创的,如果老师感兴趣,直接将代码放入Proteus软件的模拟中则可以欣赏。
7. 最后感谢我的组员,没有他们的努力,我们就不能实现目标,顺利完成任务。在此也非常感谢老师,在教会我们知识的同时也让我们在实践中体会到单片机的魅力,我们会继续努力,争取更大进步!
八、主要参考文献、资料:
[1] 梅丽凤、等。单片机原理及接口技术-习题详解与实验指导,清华大学出版社,北京交通大学出版
社,2007。
[2] 梅丽凤、等。单片机原理及接口技术,清华大学出版社,北京交通大学出版社,2007。 [3] 万光毅,等。单片机实验与实践教程(一)。北京航空航天大学出版社,2003 [4] 范蟠果。单片机实验与应用系统设计。国防工业出版社,2007 [5] 汪建,等。MCS-96系列单片机原理及应用技术(第二版)。华中科技大学出版社,2006 [6] 刘复华。MCS296单片机及其应用系统设计。清华大学出版社,2004
[7] 邓奕,马双宝,谢龙汉。Protel 99 SE原理图与PCB设计。人民邮电出版社,2011。 [8] 赵景波。Protel 99 SE电路设计与制板。机械工业出版社,2010。
[9] 赵月飞,郭会平,胡仁喜。Protel 99 SE基础与实例教程。机械工业出版社,2010。
15
因篇幅问题不能全部显示,请点此查看更多更全内容