51单片机电子设计报告.docx
- 文档编号:15942352
- 上传时间:2023-07-09
- 格式:DOCX
- 页数:66
- 大小:149.68KB
51单片机电子设计报告.docx
《51单片机电子设计报告.docx》由会员分享,可在线阅读,更多相关《51单片机电子设计报告.docx(66页珍藏版)》请在冰点文库上搜索。
51单片机电子设计报告
微机课程设计
专业:
通信工程
班级:
1301班
姓名:
学号:
3131902101
指导老师:
时间:
2015年12月
第一部分设计要求
设计题目:
数字电子钟的设计
1.1设计目的:
通过单片机应用产品的设计与调试过程,巩固《微机原理及接口技术》课程所学理论知识,初步了解单片机应用系统设计与调试的方法。
1.2设计任务:
设计一个以AT89S51单片机为核心的数字电子钟控制器,实现电子钟的时间、日期交替显示、闹钟功能,并可通过按钮开关或键盘切换显示内容、调整参数、设置闹钟,在单片机实验板上模拟调试实现控制器的功能。
具体设计要求如下:
1.开机自检,检查相关接口及数码管显示器、指示灯、蜂鸣器等外设是否正常。
2.8位数码管显示器平常以一定的时间间隔、合适的格式显示时间和日期信息,时间显示时、分、秒;日期显示年(2000~2099)、月、日;设置闹钟功能时显示时、分、开/关状态。
3.可通过按键设定时间、日期、闹钟等参数、手动切换显示。
按键可用独立式按键或行列式键盘实现。
设定参数过程有合适的方式指示当前可修改的内容。
4.对开关量输入进行软件消抖动处理,参数的设定有容错处理,如:
小时不能超过23,日期中每月最大天数、闰年等。
5.参数设定过程中,较长时间无操作,则自动恢复为正常显示方式。
1.3扩展功能(选做):
1.可设置多次闹钟。
2.显示星期功能。
3.显示环境温度,温度可由A/D转换实现或由1-Wire温度传感器DS18B20获取。
4.用Protel设计相应上述功能的控制器的原理图。
5.其它自选的扩展功能。
第二部分设计总体方案介绍及原理说明
2.1总体方案:
本系统主要设计思想是:
整个系统用单片机为中央控制器,由单片机执行采集时钟电路的时间信号并通过显示模块来输出信号及相关的控制功能。
时钟电路产生时钟信号,利用单片机的I/O口传给单片机,并通过8255的A口和B口控制数码管显示时间或日期,通过C口外接4*4矩阵按键对时间、日期和闹钟进行调整。
2.1.1总体方案图
AT89s51
如下图所示:
数码管显示
译码器
振荡电路
矩阵键盘
LED灯
2.1.2接口电路逻辑图:
图2.1.38255与89s51的连接
图2.1.4键盘与数码管
图2.1.5蜂鸣器的连接
2.2原理说明:
该电子时钟由89s51、8255、八段数码管等组成,采用晶振电路作为驱动电路,由定时器和循环程序产生一秒定时,达到时分秒的计时,六十秒为一分钟,六十分钟为一小时,满二十四小时为一天从而实现计时的功能。
由八个LED数码管分别显示小时十位、小时个位、分钟十位、分钟个位、秒钟十位、秒钟个位。
结合本设计实验来说,要求显示的时间为时、分、秒,以HH-MM-SS形式显示,显示日期以20YY.MM.DD形式显示,并且都用数码管来实现显示。
因此,具体设计程序,应尽可能多用一些子程序与数据暂存器单元。
本程序设计中,在主程序之外,可以设置一些数据单元作为数据寄存器。
具体系统资源分配见表1.1。
表2.2.1RAM分配情况及说明
20H.0
20H.1
20H.2
20H.3
25H
26H
30H
31H
闹钟满1min标志位
闹钟开关标志位
满1s标志位
满0.25s标志位
正常进程下的闪烁存储单元
调整时的闪烁存储单元
第一位显示缓存单元
第二位显示缓存单元
32H
33H
34H
35H
36H
37H
38H
39H
第三位显示缓存单元
第四位显示缓存单元
第五位显示缓存单元
第六位显示缓存单元
第七位显示缓存单元
第八位显示缓存单元
软件计数存储单元
软件计数存储单元
3AH
3BH
3CH
3DH
3EH
3FH
40H
41H
秒单元
分单元
时单元
日单元
月单元
年低位单元
年高位单元
无按键时按键状态存储单元
42H
43H
44H
45H
46H
47H
4AH
50H
按键时键值存储单元
滚动存储单元
滚动存储单元
滚动存储单元
滚动存储单元
按键状态值存储单元
软件计数存储单元
进程单元
51H
52H
闹钟分单元
闹钟时单元
2.3工作原理说明:
(1)实现时钟计时的基本方法
51系列单片机的可编程定时/计数器用中断方式实现时钟定时。
(a)计数器初值计算:
把定时器设为工作方式2(8位的常数自动重载的定时器/计数器),计数值=2^8=256,定时时间为(256*12/11.0592)*10^(-6)=277.78us,则计数溢出90*10*4=3600次即可得到时钟计时最小单位秒(总计时时间(256*3600*12/11.0592)*10^(-6)=1s),而计数方式可用软件实现。
初值x满足:
2^8-x=256,因为单片机的工作频率fosc=11.0592MHz,则刚好可满足计时1s的要求。
定时器初值即为00H
(b)从秒到分到时到日到月再到年的计时是通过累加和数值比较实现。
(2)电子钟的时间与日期显示
LED7LED6LED5LED4LED3LED2LED1LED0
时十位时个位—分十位分个位—秒十位秒个位
20年十位年低位.月十位月个位.日十位日个位
(3)按键设置
电子钟设置16个按键通过程序控制来完成电子钟的时间、日期、闹钟的时间调整以及闹钟开关、显示切换、确定功能。
第三部分软件流程图及流程说明
3.1.1主程序流程图:
开始
自检
初始化
调用自动切换显示子程序
调用闹钟查询子程序
调用拆字子程序
调用键盘扫描子程序
调用显示子程序
调用闪烁子程序
长时间无键按下返回
3.1.2流程图说明:
初始化:
包括定时器赋初值,初始化各内存单元。
开定时器中断,开CPU中送段码表头地址给DPTR。
3.2.1自动切换显示子程序流程图:
自动切换显示子程序
N
20H.2为1?
Y
N
Y
02H送给50H
N
01H送给50H
返回
A为02H?
A为01H?
重新给R2赋值12,50H的存储值送给A
Y
N
Y
R2的值减1为0?
20H.2清零
(1)
3.2.2流程图说明:
本次设计开始默认是时间显示模式,自动切换时间设为12秒,即每满12秒切换显示一次,主要在时间显示与日期之间切换。
3.3.1闹钟查询子程序流程图:
闹钟查询子程序
N
N
N
N
蜂鸣器响1min
是关闭闹钟开关?
Y
关蜂鸣器
Y
Y
满1min?
Y
蜂鸣器响
与当前时间一致
取闹钟数据
闹钟开关开?
返回
3.3.2流程图说明:
闹钟在程序开始默认为关,先进行闹钟开关的查询,开关开则依次比较分钟与小时若都与当前时间一致则蜂鸣器响,此时再按下开关还可以关闭蜂鸣器,若不选择关闭则蜂鸣器将响满一分钟才停止。
3.4.1键盘扫描子程序流程图:
键盘扫描子程序
Y
Y
返回
确定有键按下?
转向键功能处理子程序
按键消抖
查表,B中等于键值?
行、列合并得键盘状态值存入B
A和F0H相与得到行线值存入A
行线输出值存入A
定义行线输入,并赋初值0000
列线值存入B
A和0FH相与得到列线值存入A
列线输出值存入A
定义列线输入,并赋初值0000
滚动存储
N
N
3.4.2流程图说明:
键盘扫描法采用滚动扫描消除抖动,并将键值拆分为行线和列线,无键按下41H(前一状态)与42H(后一状态)都将保持FFH,若有键按下消抖以后42H将不再是FFH而是键值,再跳转到相应的键功能处理即可。
3.5.1显示子程序流程图
N
Y
八位是否全显示完?
消串显
R0加1指向下一显示单元
调用延时1ms子程序
段码送A口
送位选码到B口
读R0所指单元数值,拆出当前位并查表转成段码
返回
送位选码到B口
送位选码到B口
送位选码到B口
送位选码到B口
送位选码到B口
送位选码到B口
显示子程序
3.5.2流程图说明:
先从30H开始显示,延时一毫秒,再利用循环依次将后面七位显示过去,由于人眼的余晖作用会以为八位同时亮,此时的显示子程序的功能即可实现。
3.6.1中断子程序流程图:
T0中断
N
N
N
N
N
N
N
Y
Y
Y
Y
Y
Y
年单元加1
满1年?
月单元加1
满1月?
日单元加1
满1天?
时单元加1
满1hour?
分单元加1
满1min?
秒单元加1
满1s?
保护现场
返回
恢复现场
3.6.2流程图说明:
根据正常的时间依次进行秒分时日月年的进位,不过在日期到达一个月时会有一个当前月份有几天的查表判断看到底是28天、30天还是31天后才将月份进位,而且在2月28日的时候还有判断平闰年的判断,确定是否进位到2月29日还是3月1日。
第四部分系统功能与操作说明
4.1总体功能说明:
本次设计的电子钟,开机后将开始自检,具体表现为P1.0-P1.7先全亮1秒,然后蜂鸣器响1秒,最后数码管从右到左依次循环点亮1秒过去,每个数码管的每一段包括小数点都会被点亮,之后就会按照设定的初始值进入正常的走时状态,同时数码管的显示状态为时间显示。
显示状态会每12秒切换一次可方便使用者实时地读取当前时间与日期。
闹钟开关打开时,若当前时间到达闹钟时间时,数码管显示时间停止(但实际上芯片内部的时间仍然在走),蜂鸣器开始响,当再次按下闹钟开关,蜂鸣器将停止蜂鸣,时间正常显示并走时,若关闭闹钟开关,蜂鸣器将一直响到一分钟后才能关闭。
还有整点报时的功能,每当时间到达整点的时候,蜂鸣器将响一秒提醒使用者整点到了。
按键除了K15键都有对应的功能,请见下面的说明。
当长时间无按键操作时系统会自动返回时间显示并走时的功能,
4.2按键操作说明:
各按键功能如下图所示:
K3
K2
K1
K0
时间设置
日期设置
闹钟设置
显示切换
无
闹钟开关
确定
时间上调
K7
K6
K5
K4
日期上调
闹钟上调
K11
K10
K9
K8
日期下调
闹钟下调
时间下调
K13
K14
K15
K12
日期调整右移
闹钟调整右移
时间调整右移
系统有三个设置键,分别为时间设置键、日期设置键和闹钟设置键,分别搭配上调、下调和右移键可进行时间、日期和闹钟的调整。
除了设置键还有显示切换键,确定键,以及闹钟开关键。
下面依次介绍各个键的功能。
时间设置键(K0):
正常显示状态按下以后,时的十位将开始闪烁进入时间调整状态,等待使用者对时间的修改。
时间上调键(K4):
其他状态按下无效,只有在时间调整状态按下后,方可对当前调整位显示值进行加1的操作,当加到最大值后将不能再往上加,再加又会回到0。
而且在时的十位为2的情况下,个位加到3将不能再加,再加又会回到0。
时间下调键(K8):
其他状态按下无效,只有在时间调整状态按下后,方可对当前调整位的显示值进行减1的操作,当减到最小值后将不能再往下减,再减又会回到最大值.同样的,在时的十位为2的情况下,个位减到0再减将回到3重新开始减。
时间调整右移键(K12):
其他状态按下无效,只有在时间调整状态按下后,方可对当前调整位进行右移的操作,每按一次右移一位同时当前调整位闪烁,等待调整,移到最右边再按又会回到最左边形成循环。
日期设置键(K1):
正常显示状态按下以后,日期的年份的十位开始闪烁进入日期调整状态,等待使用者对日期的修改。
日期上调键(K5):
其他状态按下无效,只有在日期调整状态按下后,方可对当前调整位的显示值进行加1的操作,当加到最大值将不能再往上加,如果是年份(或月份的十位、日的十位)再加会回到0,如果当前月份十位为0,个位加到最大值再加将从1开始加,同样如果当前天的十位为0,个位加到最大值再加将从1开始加。
在2月份的情况下,且日的十位为2时,会先进行一个平闰年的判断,平年则日的个位只能加到28再加会从01开始加,闰年会加到29再加从01开始加。
日期下调键(K9):
其他状态按下无效,只有在日期调整状态按下后,方可对当前调整位的显示值进行减1的操作,当减到最小值将不能再往下减,如果是年份(或月份的十位、日的十位)再减会回到9(或1、3或2),如果当前月份十位为0,个位减到最小值再减将从9开始减,同样如果当前天的十位为0,个位加到最大值再加将从9开始减。
同上调键一样,在2月情况下,且日的十位为2时,会先进行平闰年判断,平年个位减到最小值将从28再开始减,闰年个位减到最小值将从29开始减。
日期调整右移键(K13):
其他状态按下无效,只有在日期调整状态按下后,方可对当前调整位进行右移的操作,每按一次右移一位同时当前调整位闪烁,等待调整,移到最右边再按又会回到最左边形成循环。
闹钟时间设置键(K2):
正常显示状态按下以后,闹钟时的十位将开始闪烁进入时间调整状态,等待使用者对闹钟时间的修改。
闹钟时间上调键(K6):
其他状态按下无效,只有在闹钟时间调整状态按下后,方可对当前调整位显示值进行加1的操作,当加到最大值后将不能再往上加,再加又会回到0。
而且在时的十位为2的情况下,个位加到3将不能再加,再加又会回到0。
闹钟时间下调键(K10):
其他状态按下无效,只有在闹钟时间调整状态按下后,方可对当前调整位的显示值进行减1的操作,当减到最小值后将不能再往下减,再减又会回到最大值.同样的,在时的十位为2的情况下,个位减到0再减将回到3重新开始减。
闹钟时间调整右移键(K14):
其他状态按下无效,只有在闹钟时间调整状态按下后,方可对当前调整位进行右移的操作,每按一次右移一位同时当前调整位闪烁,等待调整,移到最右边再按又会回到最左边形成循环。
确定键(K7):
在其他状态按下无效,只有在时间(或日期或闹钟时间)调整状态按下后可对调整后的时间或日期进行确定的功能,若时间调整则按下将从当前时间走时,且如果先调整时间(或闹钟)的时的个位调到超过3再转去将时的十位调到2,再按确定个位会自动变到3,可对时间有一个容错的功能。
闹钟开关(K11):
初始默认开关关闭,按下将开启闹钟同时与89s51的P1.1口相连的L1将亮,提醒使用者当前闹钟开着,若关闭则L1灭。
第五部分调试记录
本次实验过程中,编好程序在仿真与烧录到实验板上时遇到以下几方面的问题:
5.1定时时间不准确的问题:
刚开始对于定时方式2理解不够,程序写完发现总是快了1倍,本来应该定时1s的,总是0.5s的时候时间的秒就已经进位了。
解决方法:
因为T0定时器的定时方式2最长只可以定时512us,而且只有当定时器与定时缓存单元的值的乘积正好为256*3600才可以保证在定时1s的时间才是准确的,所以我将定时器初值设为00H,这样计数值可达到256,但是开始对方式2定时方式理解不够准确,方式2是可以自动重新装载定时器初值的方式,而且只用到低四位,开始以为四位的初值计完,重新装载之后会继续计数直到八位全计完才进行进位,所以后面的缓存单元多乘了2,这样时间就会比原计划快了1倍,后来又重新理解了对于定时器的定时方式2的定义修改了一下缓存单元的计数值,时间就可以正常按1s走时了。
5.2蜂鸣器不能关闭的问题:
闹钟时间到达蜂鸣器响,之后再按闹钟开关蜂鸣器不能关闭。
解决方法:
到实验室进行程序的运行时出现问题,检查程序,发现本来仿真是用P1口控制的L2~L7的亮暗来代表蜂鸣器的响和不响,在后面的闹钟开关键功能子程序那里,关闭闹钟只对P1口进行控制灯全暗的操作,没有对蜂鸣器进行关闭的操作。
还是因为考虑不够全面,前面闹钟扫描都有对P1口及蜂鸣器的设置,后面闹钟开关程序隔得太远忘记设置了。
5.3日期调整显示出现问题:
在日期月份十位为0时,对日期月份低位进行上调操作时加到9再加又变为不带点的1。
解决方法:
因为月份个位是带小数点的所以在日期加1功能键判断完个位调到9(带小数点为14H)以后再加也要给1带小数点即再加应给月份个位缓存单位存0CH,后面的下调操作也是相应的解决方法。
在判断年份个位和月份个位都要判断加上小数点以后的值,在加到最大或减到最小重新赋值也有要加上小数点,考虑得不够全面。
5.4确定键没有容错的功能:
如果时间的时的十位为1的情况把个位调到大于3(4、5或其他大于3的数)时,再右移到十位调十位到2,按下确认时间会超过23。
解决方法:
由于开始编写程序只实现基本功能,没有考虑到确定键也要设置容错处理。
而且时间调整只是依照顺序判断的,所以调完个位再回来调十位还要再进行判断个位有没有超过3,这里我将个位设置为调完时间若时超过23则一律重新赋值为23,即最大只能调到23小时。
闹钟也是同样的道理。
这样确定键的功能就完善了。
5.5平闰年判断出现问题:
本来平年2月只能加到28天,闰年可加到29天,结果全相反了。
平年可加到29天,闰年可加到28天。
解决方法:
在使用JZ与JNZ两条语句上记反了。
本来进行判断以后A中存的是余数,余数为0(即A为0)说明是闰年,应该跳转到闰年情况下的处理,如果不为0则继续进行平年情况下的处理。
JNZ的功能为判断累加器不是0则转移,JZ的功能为判断累加器为0则转移,所以换到JZ语句进行判断以后平闰年为正常的判断情况。
5.6月份为12时,日的十位只能加到2的问题:
本来十位是可以加到3的,但只能加到2判断应该是12月也按2月来进行处理了。
解决方法:
在对调整位的判断出现问题,后来修改了判断方法,在日的十位调整状态下先对10、11和12月的情况进行判断,如是则继续判断十位有没有到3到则清零,再对不是10、11或12月的情况往下进行是否为2月的判断,如果是2月则只能最大只能加到2,如果不是则可最大加到3。
不能直接判断个位是否为2月再判断是否日的十位加到2,忘记先对日的十位进行判断筛选了。
第六部分:
课程设计总结
为期两周的课程设计终于结束了。
感觉自己从什么都不会到可以自己设计一个成功的电子钟还是很不容易的。
单片机作为我们的主要的专业课程之一,我觉得单片机的课程设计很有必要,而且能让学生得到提高。
但是在刚开始拿到设计题目,真的无从下手,虽然课本上的知识理解,但是要让自己真正设计一套结合按键的电子钟的程序真觉得太困难了。
自己就尽量请教同学,上网查阅各种相关资料,终于几天后有了一个大概思路,然后着手去做,在自己电脑上仿真,拿到实验室在实验板上测试,遇到问题,解决问题,一个又一个问题解决以后,2星期时间也差不多了,终于完成了老师交给的任务。
在这次课程设计中,运用到很多以前学到的课本上的专业知识,虽然以前从来没有独立应用过它们。
但在学习的过程中带着想要解决的问题去学真的能够掌握到很多,而且效率还很高,毕竟是为了解决问题,这是我做课程设计有所收获的地方。
毕竟课本知识都是孤立在课本上的,只有应用才将它们立体起来,而且在自己脑海里也对知识有一个立体的印象,比如具体的指令在单片机上是怎样运行出结果的。
这次课程设计让我明白了,要做好一个课程设计,就必须做到:
在设计之前,对所使用的单片机的内部结构有一个系统的了解,了解该单片机内有哪些资源,这些资源该怎么运用到自己的设计中;必须要有一个很清晰地思路和一个完整的软件流程图;在设计程序时,不能妄想一次就将整个程序设计好,那是不可能的,一个程序要经过反复的仿真,修改,不断改进才能够完善,就像软件设计出来在使用的过程中也需要维护是一样的道理,只有去仿真去在实验板上测试才能发现设计中什么地方不合理,什么地方需要改进;还应该随写随着注释程序的好习惯,不然不仅自己过一段时间可能会看不大懂,别人也会不理解,一个程序的完美与否不仅仅是实现功能,更重要的是应该让人一看就能明白你的思路,这样也为资料的保存和交流提供了方便;在设计课程过程中遇到问题是再正常不过的,但是我们应该将每次遇到的问题记录下来,并分析清楚,以免下次再遇到同样问题,而且也能给自己带来提高。
虽然这次课程设计结束了,但是让我从中学到的不仅仅是专业上的知识,发现、提出、分析、解决问题和动手实践的能力都使我得到了相应的提高。
这些解决问题的能力还能让我在以后的学习、工作和生活中受益。
但这毕竟是第一次做课程设计,而且我自己毕竟也没有参见单子竞赛之类的设计,难免会遇到很多的问题,遇到就去解决,问题从来都是要解决的,越解决设计思路越清晰。
这次设计中,发现了自己的不足之处,对以前学过的知识理解不够深刻,掌握得不够牢固,对各单元知识掌握得不够系统,不能加以灵活的运用,总之,缺点慢慢改正总会越来越好的。
通过这次设计,我更加懂得了学习的重要性,了解到理论知识与实践相结合的重要意义,学会了坚持、耐心和努力,这将为自己今后的学习和工作增色添彩。
另外还要感谢老师的孜孜教导以及对每个学生的不放弃,教会了我应该怎样规范设计以及对问题的一些很重要的思考方法。
附录:
程序清单及详细注释
ORG0000H;主程序入口
LJMPCLOCK;转主程序初始化
ORG000BH;T0中断入口
LJMPTP0;转T0中断服务程序
ORG0030H;主程序初始化
CLOCK:
MOVSP,#6FH;设栈底指针
LCALLD1S
MOVA,#89H;8255(U2)初始化,A口、B口为输出,
;C口高低4位全为输入
MOVDPTR,#0FEFFH;指向8255控制口
MOVX@DPTR,A;将控制字写入控制寄存器
;=========================自检=====================================
CHECK:
MOVP1,#00H;P1口输出全‘0',所驱动的L0~L7指示灯
;全亮
LCALLD1S;延时1S
MOVP1,#0FFH;熄L0~L7指示灯
CLRP3.2;蜂鸣器响
LCALLD1S;延时1S
SETBP3.2;关蜂鸣器
MOVDPTR,#0FEFCH;数码管上从右到左依次点亮
MOVA,#00H
MOVX@DPTR,A
MOVA,#01H
MOVDPTR,#0FEFDH
CHECK1:
MOVX@DPTR,A
LCALLD1S
RLA
CJNEA,#01H,CHECK1
;=========================初始化相关单元========================
SECEQU3AH
MINEQU3BH
HOUREQU3CH
DAYEQU3DH
MONEQU3EH
YEARLEQU3FH
YEARHEQU40H
AMINEQU55H
AHOUREQU56H
MOVSEC,#00H;时间初值“秒”
MOVMIN,#05H
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 51 单片机 电子设计 报告