单片机报告时间控制器.doc
《单片机报告时间控制器.doc》由会员分享,可在线阅读,更多相关《单片机报告时间控制器.doc(10页珍藏版)》请在冰豆网上搜索。
信息科学与技术学院
本科四年级
单片机课程设计
专业:
班级:
姓名:
学号:
2010年12月17日
一设计题目:
时间控制器的设计
二设计内容:
用89S52单片机设计一个时间控制器,有8位数码管显示年月日及时分秒,具有日历和时钟功能,有一路输出控制电灯,有一路输出控制蜂鸣器,可以设置年月日及时分秒,可以设置一张时间表,该时间表记录什么时间开、关电灯,什么时间开、关蜂鸣器,而单片机按这张时间表来控制电灯和蜂鸣器。
该时间表要求掉电时仍能保存不掉数据,所以需要用一片EEPROM来保存数据,如用24C02/04/08等。
三设计要求:
1)提交设计报告,设计报告中包含设计原理,程序框图,电路图
2)程序清单和PCB图,用PROTEL画
3)建议有条件的同学做出实物。
4)时间:
12周到16周,16周上交。
四设计基本原理
时钟是利用单片机内部的定时器/计数器来实现,它的处理过程如下:
首先设定单片机内部的一个定时器/计数器工作于定时方式,对机器周期计数形成基准时间(如10ms),然后用另一个定时器/计数器或软件计数的方法对基准时间计数形成秒(对10ms计数100次),秒计60次形成分,分计60次形成小时,小时计24次则计满一天。
然后通过数码管把它们的内容在相应位置显示出来即可。
用定时/计数器T0,工作于定时,采用方式1,对12MHZ的系统时钟进行定时计数,初值设为15536。
形成定时时间为50ms。
用片内RAM的7BH单元对50ms计数,计20次1秒钟到,然后对秒计数器78H单元加1,秒计数器加到60后向分进位,则分计数器79H单元加1而秒计数器78H单元清零;分计数器加到60后又向时进位,则时计数器7AH单元加1而分计数器79H单元清零;时计数器加到24则时计数器清零。
然后把秒、分、时计数器分成十位和个位放到8个数码管的显示缓冲区,通过数码管显示出来。
显示格式为小时十位、小时个位、分十位、分个位、秒十位、秒个位。
在处理过程中加上了按键判断程序,能对按键处理。
另外添加两个按键,一个显示时间,一个用于显示年月日。
此外,还从P0口引出两条线,分别控制led灯,蜂鸣器。
所用的主要器件为:
单片机:
80C52LED数码管:
7SEG-MPX8-CA-BLUE(CA:
共阳)
五设计成果
1.仿真电路图
2.日历界面
3.计时器界面
六流程图:
开始
显示单元清零
T0、T1设为16位计数模式
允许T0中断
调用显示子程序
进入功能程序
按下键否?
否
是
七主要代码:
ORG0000H
LJMPSTART
ORG000BH
LJMPINTT0
START:
MOVR0,#70H
MOVR7,#0CH
INIT:
MOV@R0,#00H ;存储单元清零
INCR0
DJNZR7,INIT
MOV72H,#10 ;时、分、秒之间的短横显示
MOV75H,#10
MOVTMOD,#01H
MOVTL0,#0B0H ;50ms定时初值
MOVTH0,#03CH
SETBEA
SETBET0
SETBTR0
START1:
LCALLSCAN
LCALLKEYSCAN
SJMPSTART1
;延时1MS子程序
DL1MS:
MOVR6,#14H
DL1:
MOVR7,#19H
DL2:
DJNZR7,DL2
DJNZR6,DL1
RET
;延时20MS子程序
DL20MS:
ACALLSCAN
ACALLSCAN
ACALLSCAN
RET
;数码管显示程序
SCAN:
MOVA,78H;秒计数值由二进制转十进制后
MOVB,#0AH ;送入显示缓冲区相应位置
DIVAB
MOV71H,A
MOV70H,B
MOVA,79H ;分计数值由二进制转十进制后
MOVB,#0AH ;送入显示缓冲区相应位置
DIVAB
MOV74H,A
MOV73H,B
MOVA,7AH ;时计数值由二进制转十进制后
MOVB,#0AH ;送入显示缓冲区相应位置
DIVAB
MOV77H,A
MOV76H,B
MOVR1,#70H;循环扫描显示
MOVR5,#80H;显示秒个位的位码(LED共阳)
MOVR3,#08H
SCAN1:
MOVA,R5
MOVP2,A ;位码从P2口送出
MOVA,@R1
MOVDPTR,#TAB
MOVCA,@A+DPTR
MOVP0,A ;字段码从P0口送出
MOVA,R5
LCALLDL1MS ;延时1ms
INCR1
MOVA,R5
RRA
MOVR5,A
DJNZR3,SCAN1
MOVP2,#00H
MOVP0,#0FFH
RET
TAB:
DB0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H,0BFH
;“0~9”,“-”的共阳极字段码
INTT0:
PUSHACC
PUSHPSW
CLRET0
CLRTR0
MOVTL0,#0B0H
MOVTH0,#03CH
SETBTR0
INC7BH
MOVA,7BH
CJNEA,#14H,OUTT0
MOV7BH,#00
INC78H
MOVA,78H
CJNEA,#3CH,OUTT0
MOV78H,#00
INC79H
MOVA,79H
CJNEA,#3CH,OUTT0
MOV79H,#00
INC7AH
MOVA,7AH
CJNEA,#18H,OUTT0
MOV7AH,#00
OUTT0:
SETBET0
poppsw
popacc
RETI
;按键处理程序
KEYSCAN:
CLREA
JNBP1.0,KEYSCAN0
JNBP1.1,KEYSCAN1
JNBP1.2,KEYSCAN2
KEYOUT:
SETBEA
RET
KEYSCAN0:
LCALLDL20MS
JBP1.0,KEYOUT
WAIT0:
JNBP1.0,WAIT0
INC7CH
MOVA,7CH
CLRTR0
CLRET0
CJNEA,#03H,KEYOUT
MOV7CH,#00
SETBTR0 ;K0按3次后又恢复走时
SETBET0
SJMPKEYOUT
KEYSCAN1:
LCALLDL20MS
JBP1.1,KEYOUT
WAIT1:
JNBP1.1,WAIT1
MOVA,7CH
CJNEA,#02H,KSCAN11
INC79H ;分计数器加1
MOVA,79H
CJNEA,#3CH,KEYOUT
MOV79H,#00
SJMPKEYOUT
KSCAN11:
INC7AH ;时计数器加1
MOVA,7AH
CJNEA,#18H,KEYOUT
MOV7AH,#00
SJMPKEYOUT
KEYSCAN2:
LCALLDL20MS
JBP1.2,KEYOUT
WAIT2:
JNBP1.2,WAIT2
MOVA,7CH
CJNEA,#02H,KSCAN21
DEC79H
MOVA,79H
CJNEA,#0FFH,KEYOUT
MOV79H,#3BH ;把59给分计数器
SJMPKEYOUT
KSCAN21:
DEC7AH
MOVA,7AH
CJNEA,#0FFH,KEYOUT
MOV7AH,#17H ;把23给时计数器
SJMPKEYOUT
END
八心得体会
经过这次课程设计,我发现了很多单靠课堂知识无法解决的问题,通过自己动手实践也加强了处理问题的能力,能够排除困难和问题完成设计。
第一次实际使用protues,出现了许多问题,甚至包括系统兼容问题,通过查找资料逐步解决问题,使得自己的实践能力有了较大提高,对protues的应用环境也更为熟悉。
而实际的设计电路编写程序更是对本学期课程的检验。
再说代码的编写,程序设计过程有如解决一实际问题,从解决实际问题的角度,我们可以这样来看:
首先要了解这个问题的基本要求,即输入、输出、完成从输入到输出的要求是什么;其次,从问题的要害入手,从前到后的解决问题的每个方面,即从输入开始入手,着重考虑如何从输入导出输出。
最后在不断地调试改进后,终于完成了这一设计。
而整个过程表明实践能力还有待加强,在今后的学习工作中,需要逐渐加强这一点。