电子时钟课程设计.docx
《电子时钟课程设计.docx》由会员分享,可在线阅读,更多相关《电子时钟课程设计.docx(22页珍藏版)》请在冰点文库上搜索。
![电子时钟课程设计.docx](https://file1.bingdoc.com/fileroot1/2023-5/19/4dc39986-f599-4d55-b275-cafe9f2a1f16/4dc39986-f599-4d55-b275-cafe9f2a1f161.gif)
电子时钟课程设计
单片机课程设计
报告
题目:
电子时钟
姓名:
学号:
班级:
专业:
学院:
指导教师:
2008年12月25日
一、实验要求
1.P1.3接地,设置p1.3行上从左到右4个键依次为:
切换键,校正键,加1键,确定键。
2.切换键的功能:
每按一次切换键显示“月份日期”、“时分”、“分秒”。
如由“12.05”到“14.35”到“34.23"或相反,表示由12月5日切换到“14点35分”再切换到“34分23秒”或相反。
3.校正键的功能:
第1次按下,校月,月份闪烁,通过加1键校正月份。
第2次按下,校日,日期闪烁,通过加1键校正日期。
第3次按下,校时,小时闪烁,通过加1键校正小时数。
第4次按下,校分,分钟闪烁,通过加1键校正分钟数。
第5次按下,校秒,秒钟闪烁,通过加1键校正秒钟数。
4.加1键的功能:
闪烁的内容不进位加1。
校月时,月份显示为1~12,校日时,日期显示为1~31,校时时,小时显示为0~23,校分时,分钟显示为0~59,校秒时,秒显示为0~59。
5.确定键的功能:
校正的内容生效,返回正常显示,在切换状态按下确定键,返回正常显示。
6.开机后从某一特定的时间开始显示,用第2个数码管的小数点以1秒的周期闪烁,切换到日期显示时该小数点不闪烁,其他3个数码管的小数点不亮。
7.按切换键时,始终任然走时。
8.按校正键时,时钟继续走时,按确定键后按新设定的时间继续走时。
二、实验内容
1.编写程序,完成上面要求,利用定时器中断和静态显示,实现电子钟走时和校时。
2.时间或日期显示用四个数码管分别显示时、分(分、秒)或月、天。
显示格式如下:
1
2
1
2
月日
或
1
2
0
0
时分
或
3
0
0
0
分秒
三、资源分配
1、44H、43H、42H、41H、40H五个地址单元分别存储秒、分、时、日、月。
2、30H、31H作为缓显区。
3、2FH.0作为校准状态指针。
4、50H存放等键释放除键值。
5、51H存40H按加键时作需加1的地址指针。
6、20H校准对象指针,21H中断次数指针,22H切换指针。
7、P1.4切换键,P1.5校正键,P1.6加键,P1.7确定。
四、编程原理与思路
电路原理图
1、电子时钟正常走时
电子时钟的走时通过中断记时,中断时间到1S时,秒加1,到60S,秒重新记时分加1,分到60,分清0时加1,时到24,时清0天加1,天到31,天清0月加1,月到13,月置1。
有按键则进行按键处理,需显示的数送缓显区调用显示子程序,中断返回,等待下次中断。
2、按键的判断
键的判断放到中断里面处理,人正常按一次键所需时间在100ms左右,中断时间为1/16S,在中断里面判键肯定不会漏键,判键的前提要等键释放,无键或没放键不执行判键程序。
正常的等键释放如:
JNBP1.4$。
在中断里面这中方法行不通,如果你按键时间超过1/16S,当下次中断来临时,程序还在等键处(中断里面),无法执行中断。
此处等键释放用以下几条指令实现MOVA,P1;CJNEA,50H,NEXT0;NEXT0:
MOV50H,A(50H存上次的键码,取P1口,与上次的键码比较,相等则表示没按键或没放键,不相等则有新的按键,并把这次键码存下已便与下次的键码比较)。
校正状态做总线,在此基础上分别判断各按键,2FH.0做校正状态标志,第一次按下校正键,建立校正标志,20H做校正对象指针,20H置0。
校正状态时,每按一次校正键,20H加1,当20H等于5时清0。
校正时数码管闪烁,把前两个数码管看成高位,后两数码管看成低位。
当校月或时时,高位闪烁,校日、分或秒时,低位闪烁,用20H.0、20H.1判断是哪个位闪烁,如:
(20H.0)等与1,表示校正对象是日或分即低位闪烁,20H.2单独用来判断秒的闪烁。
3、加键的处理
加键只在校正状态下起作用,非校正状态下按此键无效。
每按一次加键,对应的值加1。
50H存月的地址,50H加20H的内容为要加1的地址,如:
校时是,按加键,时需加1,即((50H)+(20H))加1,(50H)+(20H)存放的值等于时的地址。
校正时,无进位加1,每按一次加键后,对应的数值加1,当数值加到最大时,则清0,但不进位。
4、切换键的处理
切换键只在非校正状态下起作用,校正状态下按此键无效。
22H作切换指针,第一次按下切换键,显示日期,22H置1,每按一次切换键,22H加1,当22H等于3时清0,用22H的低3位判断显示“日期”、“时和分”或“分和秒”。
正常显示下20H置0即显示“分和秒”。
确定键按下,初始化各指针即可。
5、显示的实现
显示子程序里面有校正位闪烁和秒点闪烁(由于秒已显示出来,故秒点闪烁不再处理)。
数码管是共阳极的,当送#0FF时,数码管灭。
当在校正状态时,确定闪的位置方法与校正位置判断同理,不闪的数码管正常送数,取反F0,当F0等与1时,缓显地址里面的数,当F0等0时,送#0FFH。
五、流程图如下:
主函数流程图
开始
给堆栈指针赋值
初使化显示地址和各标志地址
设置中断方式,定时器设初值
设置SCON,开中断,
等待中断
结束
中断程序流程图
开始
记时指针=16?
清0记时指针,调用记时子程序
定时器重赋值,记时指针加1
是否校正状态?
等键释放?
N
N
Y
是否校正状态?
切换键?
NY
显示标志22H加1
(A)
YNY
确定键?
加键?
无操作
校正键?
N(A)
确定键?
(22H)=3?
校正键?
22H清0
YN
校正指针加1
调用加键子程序
清校正标志和时间日期标志
YYY
建立校正状态标志,校正指针置0
NYN
(22H)=1?
?
Y
20H.1=1?
N
Y
N
20H.2=1?
分和秒送缓显,调用显示子程序
时和分送缓显,调用显示子程序
日期送缓显,调用显示子程序
Y
N
中断返回
显示子程序
开始
表首地址给DPTR,清TI
校正状态?
取反F0
Y
F0=0?
后两数码管闪?
秒闪?
NN
Y
NYY
HHOU分离分别给SBUF
#0FF连送两次给SBUF
HHOU分离分别给SBUF
F0=0?
HMIN分离分别给SBUF
Y
HMIN分离分别给SBUF
#0FF连送两次给SBUF
N
中断返回
加键子程序
开始
(20H)加(51H)值(需加1的地址)存入R0
((R0))加1,并DA转换
月加1?
天加1?
秒加1?
时加1?
分加1?
Y
YYYYY
((R0))=60?
((R0))=60?
((R0))=24?
((R0))=31?
((R0))=13?
NN
YYYYY
存分的地址清0
存秒的地址清0
存时的地址清0
存天的地址清0
存月的地址清0
中断返回
记时子程序
开始
秒加1并DA转换
秒=60?
N
Y
秒清0分加1并DA转换
分=60?
N
分清0时加1并DA转换
Y
时=24?
N
时清0天加1并DA转换
Y
天=31?
N
Y
天置1月加1并DA转换
月=13?
N
Y
月置1并DA转换
中断返回
六、运行与调试
1、打开KEIL单片机软件仿真软件,在其上写好上面源程序后,建立工程并进行编译,发现有很多汇编语言语法上面的错误,对这些进行一一改正至完全正确。
2、将电脑与单片机仿真器进行连接,连接成功后,再按照实物原理图将试验箱上的元件进行连接,检查硬件电路的问题。
使其成为完整的电子钟系统。
3、点击运行后,发现走时完全正确,但秒点的闪烁时间间隔有点长,从理论上推应该是初始值没有设好,查看程序,从理论上说是会有一定的误差的,主要是语句的运行。
4、在检查程序的是后必要是可以将T0的值改为一定大使其计数时间缩短,方便检查错误。
保存编译后运行再观察,看原来错误是否得到解决。
5、在检验校时功能时发现有乱码出现,检查程序发现没有很好的控制按键的按与未按,必须加上去抖语句。
6、在调试按键功能时,首先要判断P1.7是否按下,再去抖,再判断P1.7是否按下,来实现分秒独显,在调试判断P1.6,P1.5,若按下拉则看是否能实现分时加1功能,能够则功能实现,否则就的继续调试,检查其相应语句及端口直到功能实现。
七、总结
通过本次设计,使我对单片机的应用有了初步的了解。
在做具体的时钟时,必须全面考虑程序的功能。
在编程时,必须利用板块化编程。
将每一个小的功能实现,再将所有小的功能组合在一起就可以实现一个大的系统功能。
在进行软件和硬件同时设计时,我们必须考虑软硬两方面的原因。
必须先保证硬件没问题时,因为硬件电路可以通过我们已有的电路、模电、数电和信号等知识能快速的找到硬件存在的问题。
再单方面的从软件入手就可以做到有的放矢,事半功倍。
在做一个具体的设计时,必须有扎实的基础和较强的动手能力才能做到游刃有余。
在实际编程过程中会遇到很多不同的错误,有时候是一些很明显很细节的语法错误,这些可以通过编译来查找错误的所在,然而那些并不明显难以查找的隐性错误却真让人头痛,没有办法只好利用断点调试来一步步检查代码中的错误,这样为了找一个错误花费了大量的时间,但是找出错误之后的感觉却是非常“爽”的。
同时我翻阅了大量的书籍,尽管大部分书都只是翻了一部分页码而已,却给了我一个非常有价值的经验。
N7)y__mQ=#
总之,此次系统设计给我们提供了一个既动手又动脑、自学、独立实践的机会,使我们养成了勤翻阅各种相关资料的习惯,将书本上的理论知识和实际有机地结合起来,锻炼了实际分析问题和解决问题的能力,提高了适应实际、实践编程的能力,为今后的学习和实践打下了良好的基础。
附表
YUEEQU40H;月
TIANEQU41H;天
HOUEQU42H;时
MINEQU43H;分
SECEQU44H;秒
HHOUEQU30H;时间缓冲区
HMINEQU31H
ORG0000
LJMPMAIN
ORG000BH
LJMPTT0
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;主程序
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
ORG0030H
MAIN:
MOVSP,#65H
MOV2FH,#00;校准状态指针
MOV21H,#00;做中断次数指针
MOV50H,#0FFH;处理等键释放
MOV51H,#40H;按加键时,存放要加1的单元
MOV20H,#00;做校准指对象指针
MOV22H,#00;做切换键指针
MOVSCON,#00
MOVTMOD,#01
MOVTL0,#0EEH
MOVTH0,#85H
MOVHOU,#12H
MOVMIN,#25H
MOVSEC,#00
MOVHHOU,#00H;时间缓冲区设初值
MOVHMIN,#00H;时间缓冲区设初值
MOVYUE,#03H
MOVTIAN,#09
SETBET0
SETBTR0
SETBEA
XTIME:
MOVDPTR,#TAB
CLRTI
JNB2FH.0,KK3;判断是否为校正状态
CPLF0
JB20H.0,KK3;判断校正的对象
JB20H.2,KK3
JBF0,KK3
LCALLKK6
LJMPKK2
KK3:
MOVA,HHOU
ANLA,#0F0H
SWAPA
MOVCA,@A+DPTR
MOVSBUF,A
LCALLKK7
MOVA,HHOU
ANLA,#0FH
MOVCA,@A+DPTR
MOVC,21H.3
;ANLC,20H.0;点的闪烁
MOVACC.0,C
MOVSBUF,A
LCALLKK7
KK2:
JB20H.2,PP7;是高电平则秒闪
JNB20H.0,KK4
PP7:
JBF0,KK4
LCALLKK6
LJMPEXIT
KK4:
MOVA,HMIN
ANLA,#0F0H
SWAPA
MOVCA,@A+DPTR
MOVSBUF,A
LCAALKK7
MOVA,HMIN
ANLA,#0FH
MOVCA,@A+DPTR
MOVSBUF,A
LCALLKK7
LJMPEXIT3
EXIT2:
MOVA,#00
MOVSBUF,A
LCALLKK7
MOVSBUF,A
LCALLKK7
EXIT3:
RET
KK7:
JNBTI,$
CLRTI
RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;中断处理(有按键处理)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
TT0:
MOVTL0,#0EEH
MOVTH0,#85H
INC21H
MOVA,21H
CJNEA,#10H,NEXT1
MOV21H,#00
LCALLCTIME;调用记时子程序
NEXT1:
MOVA,P1;等键释放
CJNEA,50H,NEXT0
JNB2FH.0,NEXT8
LJMPTOP1
NEXT0:
MOV50H,A
JNB2FH.0,NEXT2;是否校正状态
JBP1.4,NEXT3;P1.4做校正键,看是否按下此键
INC20H
MOVA,20H
CJNEA,#05,TOP1
MOV20H,#00
TOP1:
JB20H.1,PP5;是高电平则显示时间
JB20H.2,PP3;是高电平则显示分和秒
OUT1:
LJMPKK1
NEXT3:
LCALLAKEY;调用是否有加键按下的子程序
JBP1.7,TOP1;是否按下确定键
MOV2FH,#00
MOV20H,#00
LJMPKK1
NEXT2:
JBP1.5,NEXT4;P1.5做切换键,看是否按下此键
INC22H
MOVA,22H
CJNEA,#03,NEXT8
MOV22H,#00;重新循环
CLRA
LJMPPP3
NEXT4:
JBP1.4,PP9;判断校正键是否已按下
SETB2FH.0;建立校正标记
MOV20H,#00;校正指针置0
LJMPKK1
PP9:
JBP1.7,TOP1;判断是否按下确定键
MOV22H,#00
NEXT8:
MOVA,22H
CJNEA,#01,NEXT5;是,则显示日期
KK1:
MOVHHOU,YUE
MOVHMIN,TIAN
SJMPXIAN
NEXT5:
CJNEA,#02,PP3
PP5:
MOVHHOU,HOU
MOVHMIN,MIN
SJMPXIAN
PP3:
;CJNEA,#00,EXIT;相等显示分和秒
MOVHHOU,MIN
MOVHMIN,SEC
XIAN:
LCALLXTIME;调用显示子程序
EXIT:
RETI
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;加键子程序;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
AKEY:
JBP1.6,LP0
MOVA,20H
ADDA,51H
MOVR0,A
MOVA,#01
ADDA,@R0
DAA
MOV@R0,A
CJNER0,#YUE,LP1;是否是月加1
CJNEA,#13H,LP0
MOVYUE,#01
LP1:
CJNER0,#TIAN,LP3;是否是天加1
CJNEA,#32H,LP0
MOVTIAN,#01
LP3:
CJNER0,#HOU,LP4
CJNEA,#24H,LP0
MOVHOU,#00
LP4:
CJNER0,#MIN,LP5
CJNEA,#60H,LP0
MOVMIN,#00
LP5:
CJNER0,#SEC,LP0
CJNEA,#60H,LP0
MOVSEC,#00
LP0:
RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;记时程序段
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
CTIME:
MOVA,#01
ADDA,SEC
DAA
MOVSEC,A
CJNEA,#60H,LP7
MOVSEC,#00
MOVA,#01
ADDA,MIN
DAA
MOVMIN,A
CJNEA,#60H,LP7
MOVMIN,#00
MOVA,#01
ADDA,HOU
DAA
MOVHOU,A
CJNEA,#24H,LP7
MOVHOU,#00
MOVA,#01
ADDA,TIAN
DAA
MOVTIAN,A
CJNEA,#32H,LP7
MOVTIAN,#01
MOVA,#01
ADDA,YUE
DAA
MOVYUE,A
CJNEA,#13H,LP7
MOVYUE,#01
LP7:
RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;闪烁子程序
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
KK6:
MOVA,#00
MOVSBUF,A
LCALLKK7
MOVC,21H.3
ANLC,20H.0;点的闪烁
MOVACC.0,C
MOVSBUF,A
LCALLKK7
RET
TAB:
DB0FCH,60H,0DAH,0F2H,066H,0B6H,0BEH,0E0H,0FFH,0E6H
END