51单片机电子时钟课程设计实验报告.docx
《51单片机电子时钟课程设计实验报告.docx》由会员分享,可在线阅读,更多相关《51单片机电子时钟课程设计实验报告.docx(24页珍藏版)》请在冰豆网上搜索。
![51单片机电子时钟课程设计实验报告.docx](https://file1.bdocx.com/fileroot1/2022-11/30/afbec0d5-ccde-49bc-8ef0-237581f75a14/afbec0d5-ccde-49bc-8ef0-237581f75a141.gif)
51单片机电子时钟课程设计实验报告
《单片机原理与应用》课程设计
总结报告
题目:
单片机电子时钟的设计与实现
设计人员:
学号:
班级:
指导老师:
日期:
目录
1.题目与主要功能要求……………………………………2
2.整体设计框图及整机概述………………………………3
3.各硬件单元电路的设计、参数分析及原理说明………3
4.软件流程图和流程说明…………………………………4
5.总结设计及调试的体会…………………………………10
附录
1.图一:
系统电路原理图…………………………………11
2.图二:
系统电路PCB…………………………………12
3.表一:
元器件清单………………………………………13
4.时钟程序源码……………………………………………14
题目:
单片机电子时钟的设计与实现
课程设计的目的和意义
课程设计的目的与意义在于让我们将理论与实践相结合。
培养我们综合运用电子课程中的理论知识解决实际性问题的能力。
让我们对电子电路、电子元器件、印制电路板等方面的知识进一步加深认识,同时在软件编程、排错调试、焊接技术、相关仪器设备的使用技能等方面得到较全面的锻炼和提高,为今后能够独立完成某些单片机应用系统的开发和设计打下一个坚实的基础。
课程设计的基本任务
利用89S51单片机最小系统,综合应用单片机定时器、中断、数码显示、键盘输入、蜂鸣报警等知识,设计一款单片机和简单外设控制的电子时钟。
主要功能要求
最基本要求
1)使用6位数码管,前两位显示小时(24小时制),中间两位显示分钟,后两位显示秒。
时钟每走1秒,秒数码管加1显示,60秒后分钟数码管加1显示,60分钟后小时数码管加1显示。
2)设计89S51单片机最小系统
3)掌握使用Protel99绘制原理图和布板的过程、方法和技巧。
4)掌握单片机开发软件(KeilC51或Wave)的使用和调试。
5)编写并调试单片机定时及其中断程序,以实现电子时钟的功能。
6)设计八段数码管显示电路并编写驱动程序,输入并调试拆字程序和数码显示程序。
7)掌握硬件和软件联合调试的方法。
8)完成系统硬件电路的设计和制作。
9)完成系统程序的设计。
10)完成整个系统的设计、调试和制作。
11)完成课程设计报告。
基本要求
1)实现最基本要求的1~10部分。
2)键盘输入可以控制电子时钟的走时/调试。
3)设计键盘输入电路和程序并调试。
4)掌握键盘和显示配合使用的方法和技巧。
提高发挥部分
1)添加“闹时”功能,设计蜂鸣器闹铃电路和程序并调试。
2)添加“整点闹时”功能。
为走时准确性设计解决算法并编程实现。
3)用液晶模块代替数码管显示,设计相应硬件电路和软件程序并调试。
3)使用专用时钟芯片,设计硬件电路和软件程序实现年月日和星期显示。
整体设计框图及整机概述
整体设计框图
整机概述
1)开机为走时模式,正常显示时间。
在此模式下整点闹时,定点闹时有效。
2)共设置3个按键,分别为模式键、功能键1、功能键2。
按动模式键,模式将在‘走时/调时/日期显示及调整/闹钟显示及调整’4个模式下切换。
3)走时模式下,按动功能键1/功能键2停止闹时。
4)调时模式下,功能键1调整分钟数值,功能键2调整小时数值。
5)日期显示及调整模式下,功能键1调整日期数值,功能键2调整月份数值。
6)闹钟显示及调整模式下,功能键1调整闹钟分钟数值,功能键2调闹钟时钟数值。
7)由于按键设定原因:
只有2个功能键,年份调整功能取消,闹钟开关默认为开。
8)年月日通过代码而不是外部芯片实现。
初始值2010年12月24号。
数码管显示101224。
9)由于开机时钟与闹钟都为00:
00:
00,闹钟默认开启。
开机会报时1分钟。
各硬件单元电路的设计、参数分析及原理说明
电源电路
元件有限没有制作电源电路部分。
使用开发板或者实验箱上的5V电源进行供电。
按键
参考书本P232的键盘接口电路原理图,采用4.7KΩ的电阻防止输入口电流过大烧坏89S51芯片。
按键释放时,P1口通过4.7KΩ电阻与电源相连,得到一个高电平。
按下按键时,P1口接地,得到一个低电平。
通过内部代码将其转换为正逻辑。
模式键接P1.0口,功能键1接P1.1口,功能键2接P1.2口。
单片机最小系统
参考实验指导书与课本及网络资料设计按键电平复位。
LED数码管
首先P0口作为段码输出。
由于P0口输出级无上拉电阻,故需添加一排阻为其上拉电阻。
其次采用共阳极数码管。
段码端为低电平时导通LED,此时数码管向89S51芯片P0口灌电流,为防止芯片烧坏,还需加1个1KΩ的限流电阻。
考虑到数码管的亮度问题,采用了PNP三极管做驱动电路。
基极接上1KΩ电阻后再与P2口相连(P2.0~P2.5)进行位选。
发射极接5V电源,集电极接数码管位选。
蜂鸣器
蜂鸣器接P3.7口。
由于使用的是有源蜂鸣器,代码的编写简单化了。
只需对P3.7口清零与置位。
P3.7口先接上1KΩ电阻后再接PNP三极管的基极。
发射极接5V电源,集电极接蜂鸣器正极,蜂鸣器负极则接地。
软件流程图和流程说明
软件流程图
1)主程序流程图
流程图说明
初始化:
包括定时器赋
初值,初始化各内存单
元。
开定时器中断,开
CPU中断,送段码表头
地址给DPTR。
2)显示子程序流程图
3)按键扫描子程序
4)模式查询子程序
日期显示及调整子程序与闹钟显示及调整子程序流程图与调时模式子程序大同小异。
a)日期显示及调整子程序送给R3/R4/R5的数据为日/月/年,按功能键1日期加1,按功能键2月份加1。
至于数值的合法性在程序里有具体的判断。
b)闹钟显示及调整子程序送给R3/R4/R5的数据为闹钟开关值/闹钟分/闹钟时,按功能键1闹钟分加1,按功能键2闹钟时加1。
至于数值的合法性在程序里有具体的判断。
5)闹钟查询子程序
6)定时器中断子程序
数值合法性在程序中处理与判断,流程图中不表现。
总结设计及调试体会
硬件设计部分:
首先要通过计算与参考资料等决定参数。
而后通过仿真软件等调试,确定参数无误后再开始用Protel99SE画原理图,进而生成PCB进行布板。
软件设计部分:
设计软件首先要考虑要做的功能,确定出合理的算法。
合理的算法不仅要可以实现功能,而且在添加功能的时候要方便灵活。
有的人为了实现某种功能用了各种各样的方法来实现,结果程序结构吃死,当想要添加功能或者修改其他功能的时候,将修改程序大部分结构,也就是说要破坏程序现有的结构。
关于调试:
Keil软件调试单片机程序的时候,编译通过并不代表程序是正确的。
编译通过只能说明程序没有语法上的错误。
进行软件仿真或者下载到开发板上进行调试,经常会出现各种各样的错误。
许多超出预期效果的现象往往是一些微小错误引起的。
例如没有现场保护跟恢复现场等,所以养成良好的编程习惯也很重要。
有些想达成某些功能而添加的语句,实际上确一点效果也没有。
举个编程中的小问题:
当有按键按下时,我们都要有软件防抖。
正常的方法是调用一个延时。
在实际调试中,要跳过这个抖动,需要100MS左右。
如果使用正常的延时,会导致按键按下时CPU100MS内无法进行其他操作,也就是说。
平均1S内100MS不调用显示子程序,这样就会导致亮度降低。
这时候,考虑到显示子程序一次有十几毫秒,就特别写了一个调用7次显示的子程序来作为按键防抖的延时,实际上效果也是很不错的。
这个想法就是在修改了多次程序未达到想要的效果(有按键按下时显示亮度不降低)后最终想出来的办法。
最后在做完板,焊完电路后,在接通电源之前,要用万用表仔细检查电路是否有连接错,以免烧坏芯片和数码管。
五天以来的其他体会:
态度要积极,不要认为很简单就不紧不慢。
很多东西并不是自己设想的那么顺利,有时候一个小问题可以花上你半天甚至一天的时间。
虽然自己在程序上并没遇到太大的问题,但是因为态度不够积极,对于没画过的PCB图迟迟不去下手,在周四晚上才解决。
本以为周五一天可以做完板并完成整机调试,可是各种突发事件让自己措手不及。
发现板来不及做完后才将程序功能进行扩展。
这是我在这次实验中的一个教训,也让我明白了对于自己不能太过于自信,态度决定一切。
图一:
系统电路原理图
图二:
系统电路PCB
表一:
元器件清单
器件名称
编号
1K电阻
R12
1K电阻
R8
1K电阻
R7
1K电阻
R9
1K电阻
R10
1K电阻
R11
1K电阻
R13
1K电阻
R18
1K电阻
R17
1K电阻
R20
1K电阻
R19
1K电阻
R6
1K电阻
R15
1K电阻
R16
1K电阻
R14
4.7k电阻
R3
4.7k电阻
R4
4.7k电阻
R2
10K电阻
R5
11.0592M晶振
Y1
22u电容
C1
80C51单片机
U3
104电容
C4
104电容
C8
4148二极管
D1
PNP三极管
Q5
PNP三极管
Q6
PNP三极管
Q4
PNP三极管
Q2
PNP三极管
Q3
PNP三极管
Q7
PNP三极管
Q1
排阻
J1
数码管
J2
数码管
J3
按键(小时)
S3
按键(分钟)
S2
按键(模式)
S1
电源插针
J4
按键(复位)
S4
蜂鸣器
LS1
时钟程序源码
YEAR_HEQU30H;年份的高位
YEAR_LEQU31H;年份的低位
MONTHEQU32H;月份
DAYEQU33H;日期
DAY_MAXEQU34H;每月最大天数
HOUREQU35H;时钟
MINUTEEQU36H;分钟
SECONDEQU37H;秒钟
BOTTONEQU38H;键值
FLAGEQU39H;模式标记/0走时/1调时/2日期显示及调整/3闹钟调整及闹钟开关/
BEEPHEQU40H;闹钟时钟
BEEPMEQU41H;闹钟分钟
ENBEEPEQU42H;闹钟开关
ORG0000H
AJMPMAIN
ORG001BH
AJMPSERVE
MAIN:
MOVTMOD,#10H;设为模式1
MOVYEAR_H,#20H;年高位赋初值20
MOVYEAR_L,#10H;年低位赋初值10
MOVMONTH,#12H;月份赋初值01
MOVDAY,#24H;日期赋初值01
MOVR2,#14H;装入20次中断
CLRA;A清零
MOVHOUR,A;小时清零
MOVMINUTE,A;分钟清零
MOVSECOND,A;秒钟清零
MOVFLAG,A;初始化模式
CLRP3.7;关蜂鸣器
MOVENBEEP,#01H;闹钟默认开
MOVTH1,#4CH;赋初值
MOVTL1,#00H
SETBET1;开中断
SETBEA
SETBTR1;启动T1
MOVDPTR,#TAB;送段码表头
DIS:
LCALLDISPLAY;重复调用显示子程序
LCALLKEY;扫描按键状态
LCALLNEXT;查询当前模式
LCALLBEEP;查询闹钟开关
SJMPDIS
SERVE:
PUSHPSW;保护现场
PUSHACC
MOVTH1,#4CH
MOVTL1,#00H
;重新赋计数初值
DJNZR2,BRIDGE;未满10次,返回
AJMPBREAK1
BRIDGE:
LJMPRETURN
BREAK1:
MOVR2,#14H;重置中断次数
MOVA,#01H;秒加1
ADDA,SECOND
DAA;转为BCD码
MOVSECOND,A
CJNEA,#60H,BRIDGE;未满60秒,返回
MOVSECOND,#00H;秒清零
MOVA,#01H;分加1
ADDA,MINUTE
DAA;转为BCD码
MOVMINUTE,A
CJNEA,#60H,RETURN;未满60分,返回
MOVMINUTE,#00H;分钟清零
MOVA,#01H;时加1
ADDA,HOUR
DAA;转为BCD码
MOVHOUR,A
CJNEA,#24H,RETURN;未满24小时,返回
MOVHOUR,#00H;小时清零
MOVA,MONTH
DAA;转为BCD码
CJNEA,#1H,JUDGE2;不是1月,转跳
AJMPSETDAT_MAX1
JUDGE2:
CJNEA,#3H,JUDGE3;不是3月,转跳
AJMPSETDAT_MAX1
JUDGE3:
CJNEA,#5H,JUDGE4;不是5月,转跳
AJMPSETDAT_MAX1
JUDGE4:
CJNEA,#7H,JUDGE5;不是7月,转跳
AJMPSETDAT_MAX1
JUDGE5:
CJNEA,#8H,JUDGE6;不是8月,转跳
AJMPSETDAT_MAX1
JUDGE6:
CJNEA,#10H,JUDGE7;不是10月,转跳
AJMPSETDAT_MAX1
JUDGE7:
CJNEA,#12H,SETDAT_MAX2;不是12月,转跳
SETDAT_MAX1:
MOVDAY_MAX,#32H;天上限为31
AJMPCONTINUE;返回
SETDAT_MAX2:
CJNEA,#2H,SETDAT_MAX3;不是2月,转跳
MOVDAY_MAX,#29H;2月,天上限28
SETDAT_MAX3:
MOVDAY_MAX,#31H;天上限为30
CONTINUE:
MOVA,#01H;天加1
ADDA,DAY
DAA;转为BCD码
MOVDAY,A
CJNEA,DAY_MAX,RETURN;未满天数上限,返回
MOVDAY,#01H;天数置1
MOVA,#01H;月份加1
ADDA,MONTH
DAA;转为BCD码
MOVMONTH,A
CJNEA,#13,RETURN;未满12月,返回
MOVMONTH,#01H;月份置1
MOVA,#01H;年低位加1
ADDA,YEAR_L
DAA;转为BCD码
MOVYEAR_L,A
CJNEA,#99H,RETURN;未满99年,返回
MOVYEAR_L,#00H;年低位清零
MOVA,#99H;年高位加1
ADDA,YEAR_H
DAA;转为BCD码
MOVYEAR_H,A
CJNEA,#99H,RETURN;未满99年,返回
MOVYEAR_H,#00H;年高位清零
RETURN:
POPACC
POPPSW;恢复现场
RETI;中断返回
;========显示子程序==========================
DISPLAY:
PUSHPSW
PUSHACC
MOVA,R3
ANLA,#0FH
MOVCA,@A+DPTR
MOVP2,#0DFH
MOVP0,A
LCALLDELAY
MOVA,R3
SWAPA
ANLA,#0FH
MOVCA,@A+DPTR
MOVP2,#0EFH
MOVP0,A
LCALLDELAY
MOVA,R4
ANLA,#0FH
MOVCA,@A+DPTR
MOVP2,#0F7H
MOVP0,A
LCALLDELAY
MOVA,R4
SWAPA
ANLA,#0FH
MOVCA,@A+DPTR
MOVP2,#0FBH
MOVP0,A
LCALLDELAY
MOVA,R5
ANLA,#0FH
MOVCA,@A+DPTR
MOVP2,#0FDH
MOVP0,A
LCALLDELAY
MOVA,R5
SWAPA
ANLA,#0FH
MOVCA,@A+DPTR
MOVP2,#0FEH
MOVP0,A
LCALLDELAY
POPACC
POPPSW
RET
;==================按键扫描程序===============
KEY:
MOVP1,#0FFH
MOVA,P1
CPLA
ANLA,#07H
JNZKEY1
RET
KEY1:
LCALLDAD
MOVA,P1
CPLA
ANLA,#07H
JNZKEY2
RET
KEY2:
MOVBOTTON,A
JBACC.0,SETMODE
RET
SETMODE:
MOVA,FLAG
INCA
MOVFLAG,A
CJNEA,#04H,NEXT
MOVFLAG,#00H
RET
;=================模式查询程序===============
NEXT:
MOVA,FLAG
CJNEA,#00H,SETTIME
SETBTR1
MOVR3,SECOND
MOVR4,MINUTE
MOVR5,HOUR
MOVA,BOTTON
JBACC.1,STOP
JBACC.2,STOP
RET
;===============闹钟开关/查询=================
BEEP:
MOVA,FLAG
CJNEA,#00H,STOP
MOVA,ENBEEP
CJNEA,#01H,STOP
BEEPLAY:
MOVA,HOUR
CJNEA,BEEPH,STOP
MOVA,MINUTE
CJNEA,BEEPM,STOP
CLRP3.7
RET
STOP:
SETBP3.7
MOVBOTTON,#00H
RET
;==================调时程序==================
SETTIME:
CLRTR1
CJNEA,#01H,SETDATE
MOVR3,SECOND
MOVR4,MINUTE
MOVR5,HOUR
MOVA,BOTTON
JBACC.1,MIN
JBACC.2,HOR
RET
MIN:
MOVA,#01H
ADDA,MINUTE
DAA
MOVMINUTE,A
CJNEA,#60H,BACK
MOVMINUTE,#00H
MOVBOTTON,#00H
RET
HOR:
MOVA,#01H
ADDA,HOUR
DAA
MOVHOUR,A
CJNEA,#24H,BACK
MOVHOUR,#00H
MOVBOTTON,#00H
RET
BACK:
MOVBOTTON,#00H
RET
;============日期显示及调整子程序==================
SETDATE:
CJNEA,#02H,SETBEEP
MOVR3,DAY
MOVR4,MONTH
MOVR5,YEAR_L
MOVA,BOTTON
JBACC.1,DAYS
JBACC.2,MO
RET
DAYS:
MOVA,MONTH
DAA;转为BCD码
CJNEA,#1H,JUDGEA;不是1月,转跳
AJMPSETDAT_MAXA
JUDGEA:
CJNEA,#3H,JUDGEB;不是3月,转跳
AJMPSETDAT_MAXA
JUDGEB:
CJNEA,#5H,JUDGEC;不是5月,转跳
AJMPSETDAT_MAXA
JUDGEC:
CJNEA,#7H,JUDGED;不是7月,转跳
AJMPSETDAT_MAXA
JUDGED:
CJNEA,#8H,JUDGEE;不是8月,转跳
AJMPSETDAT_MAXA
JUDGEE:
CJNEA,#10H,JUDGEF;不是10月,转跳
AJMPSETDAT_MAXA
JUDGEF:
CJNEA,#12H,SETDAT_MAXB;不是12月,转跳
SETDAT_MAXA:
MOVDAY_MAX,#32H;天上限为31
AJMPCONTINUE1;返回
SETDAT_MAXB:
CJNEA,#2H,SETDAT_MAXC;不是2月,转跳
MOVDAY_MAX,#29H
RET
SETDAT_MAXC:
MOVDAY_MAX,#31H;天上限为30
CONTINUE1:
MOVA,#01H;天加1
ADDA,DAY
DAA;转为BCD码
MOVDAY,A
CJNEA,DAY_MAX,BACK1
MOVDAY,#01H
MOVBOTTON,#00H
RET
MO:
MOVA,#01H
ADDA,MONTH
DAA
MOVMONTH,A
CJNEA,#13H,BACK1
MOVMONTH,#01H
BACK1:
MOVBOTTON,#00H
RET
;============闹钟调整程序==================
SETBEEP:
MOVR3,ENBEEP
MOVR4,BEEPM
MOVR5,BEEPH
MOVA,BOTTON
JBACC.1,SETM
JBACC.2,SETH
RET
SETM:
MOVA,#01H
ADDA,BEEPM
DAA
MOVBEEPM,A
CJNEA,#60H,BACK2
MOVBEEPM,#00H
SETH:
MOVA,#01H
ADDA,BEEPH
DAA
MOVBEEPH,A
CJNEA,#24H,BACK2
MOVBEEPH,#00H
BACK2:
MOVBOTTON,#00H
RET
;============延时子程序=====================
DELAY:
MOVR0,#06H
DELAY1:
MOVR1,#0B2H
DJNZR1,$
DJNZR0,D