51单片机电子时钟课程设计实验报告.docx

上传人:b****5 文档编号:4355374 上传时间:2022-11-30 格式:DOCX 页数:24 大小:269.49KB
下载 相关 举报
51单片机电子时钟课程设计实验报告.docx_第1页
第1页 / 共24页
51单片机电子时钟课程设计实验报告.docx_第2页
第2页 / 共24页
51单片机电子时钟课程设计实验报告.docx_第3页
第3页 / 共24页
51单片机电子时钟课程设计实验报告.docx_第4页
第4页 / 共24页
51单片机电子时钟课程设计实验报告.docx_第5页
第5页 / 共24页
点击查看更多>>
下载资源
资源描述

51单片机电子时钟课程设计实验报告.docx

《51单片机电子时钟课程设计实验报告.docx》由会员分享,可在线阅读,更多相关《51单片机电子时钟课程设计实验报告.docx(24页珍藏版)》请在冰豆网上搜索。

51单片机电子时钟课程设计实验报告.docx

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

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高中教育 > 英语

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1