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