多功能电子时钟程序课程设计.docx
- 文档编号:10816760
- 上传时间:2023-05-27
- 格式:DOCX
- 页数:50
- 大小:67.11KB
多功能电子时钟程序课程设计.docx
《多功能电子时钟程序课程设计.docx》由会员分享,可在线阅读,更多相关《多功能电子时钟程序课程设计.docx(50页珍藏版)》请在冰点文库上搜索。
多功能电子时钟程序课程设计
1.设计课题........................................1
2.设计目的.....................................1
3.设计任务以及基本设计要求........................1
4.总流程框图......................................3
5.方案比较........................................5
(1).定时中断的方案比较............................5
(2).消抖动方案....................................5
(3).键盘扫描方案..................................6
6.系统资源分配....................................6
7程序模块的基本设计思路和基本思想..................7
(1).始化,以及单元赋初值......................8
(2).自动检测程序思路..........................9
(3).消抖程序思路.............................9
(4).拆字子程序设计思路........................9
(5).有关键盘扫描与键盘控制程序思路..............9
(6).显示更新子程序思路.......................10
(7).手动切换程序思路.........................10
(8).温度采集程序思路.........................10(9).显示定时控制程序思路.....................10
8.系统调试..................................11
9.课程设计总结、心得体会......................13附录:
源程序清单..............................13
一、设计课题:
多功能电子时钟
二、设计目的:
通过小型微机应用产品的设计与调试过程,运用《微机原理及接口技术》课程所学的基本知识,在设计中加以应用,进而得到理解、巩固和提高发展,通过实践的过程学习掌握分析与解决实际问题的方法与手段,提高设计、编程与调试的实际动手能力,作为工程技术工作的一次基本训练。
三、设计任务以及基本设计要求:
设计一个以单片机为核心的多功能电子时钟。
具有符合精度要求的实时钟计时功能,平时显示时钟信息,以一定间隔穿插显示日期以及环境温度值,并可通过按钮开关的操控切换显示内容,通过键盘设置参数,在单片机实验板上模拟调试实现。
程序应具有以下功能:
1、开机进行接口部件及数码显示器、指示灯、讯响器等自检。
2、八位LED7段数码管显示时钟信息时可包括小时、分钟、秒钟或秒闪信号、星期等;显示日期时包括年、月、日;显示温度时包括温度值(保留一位小数)、温度单位“oC”。
3、设选用的温度传感变送器将检测的-50oC~+100oC温度变换为0~5V电压信号,综合误差为±0.5oC。
4、通过键盘设定的穿插显示间隔时间范围为10S~60S,每项穿插显示内容保持时间范围为1S~5S。
5、可通过键盘设定时钟、星期、日期等参数。
6、内部应存储2010年起20年内的阳历特征数据。
7、键盘可定义“0”~“9”键、“节拍设定”键、“时间设定”键、“确定”键、“取消”键,键盘设定参数过程可用闪烁方式指示当前修改位
8、设置一个“切换”按钮开关以实现手动切换显示内容。
9、对开关量输入进行软件消抖动处理。
10、应采取数字滤波技术提高模拟量测量稳定性。
扩展功能:
1、无操作时间超过3分钟后自动恢复为基本的时钟显示方式。
2、正点及半点报时功能。
3、单次或多次定时闹钟功能。
4、可选择24小时制或12小时制显示实时钟。
5、温度超上限告警功能,键盘设定温度上限值范围为-50.0oC~+100.0oC,监测到某回路温度超上限时有相应的显示闪烁提示、LED指示、讯响告警及继电器触点输出控制功能。
四、总流程框图:
根据设计任务以及基本要求,可以设计出整个程序的基本流程图,总的流程如下:
五、方案比较
1定时中断的方案比较
51单片机定时器有四种工作方式为:
13位定时\计数器、16位定时\计数器、8位自动重置定时\计数器、两个8位定时\计数器(只有T0有)。
每一个定时计数器定时计数时间到时产生溢出,使相应的溢出位置位,溢出可通过查询或中断方式处理。
方式0和方式1的最大特点是计数溢出后,计数器为全0.因此在循环定时应用时就存在用指令反复装入计数初值的问题。
这不仅影响定时精度,而且给程序设计带来麻烦,而方式2可以自动装载初值,解决了次问题。
精确是电子时钟的基本要求,所以本次设计采用方式2定时更为精确、更为简便。
2.消抖动方案
方案一:
软件延时消抖动。
即在消抖动的字程序中调用5ms~10ms的延时子程序,比较延时前后的电平值。
若相等则认为无抖动,将其电平值存在存放新电平值的单元若(2EH)。
但是如果开关老化抖动时间会大于10MS,这种消抖方法就显得不那么精确,而且延时会加大整个主流程循环的时间,直接影响数码管的相识更新时间,造成数码管不能正常显示。
方案二:
软件绝对消抖动。
采用滚动存储的方法,用几个连续的单元滚动存放最近几次的电平值,比较几个电平值,若相等则认为无抖动,将其值存储;若几次电平值不相等则认为有抖动,将其值舍弃。
这样简便可靠,且不会影响对时间有要求的程序模块。
故本设计采用方案二。
3.键盘扫描方案
方案一:
扫描法,先把某一列置为低电平,其余各列为高电平,检查各列线电平的变化,如果某行线电平为低电平,则可确定此行此列交叉点处的按键被按下,但这种方法编写程序较繁琐,要分两步走。
方案二:
让行线为输入线,列线为输出线,并使输出线输出全低电平,则行线中电平由高变低的所在行为按键所在行。
再把行线编程为输出线,列线编程为输入线,同理可得按键所在列,综合上述两步可得出按键号,因此线反转法非常简单适用,故用方案二。
六、系统资源分配
单片机片内数据存储器,128个单元,字节地址从00H---7FH,其分配如下:
00H
01H
02H
03H
04H
05H
06H
07H
第0组工作寄存器区
08H
09H
0AH
0BH
0CH
0DH
0EH
0FH
第1组工作寄存器区
10H
11H
12H
13H
14H
15H
16H
17H
第2组工作寄存器区
18H
19H
1AH
1BH
1CH
1DH
1EH
1FH
第3组工作寄存器区
20H
21H
22H
23H
24H
25H
26H
27H
20.0为闪烁标志21H.1为操作标志
线反转
组合八位行列码
键盘新键保存单元
键盘前态保存单元
键号初值00H,用于查找相应键号代码
29H
2AH
2BH
2CH
2DH
2EH
2FH
用于比较近5次电平的变化
新态
前态
PB口消抖存储电平的变化值
30H
31H
32H
33H
34H
35H
36H
37H
数码管显示缓存0
数码管显示缓存1
数码管显示缓存2
数码管显示缓存3
数码管显示缓存4
数码管显示缓存5
数码管显示缓存6
数码管显示缓存7
38H
39H
3AH
3BH
3CH
3DH
200us计数单位
10ms计算单位
秒单元
分单元
时单元
星期单元
41H
42H
43H
44H
46H
47H
48H
49H
日单元
初值30H
月单元
初值06H
年单元
初值10H
年单元
初值20H
温度
个位
温度
十位
温度
百位
符号位
50H
51H
52H
53CH
54H
55H
57H
58H
温度滚存采集单元
温度
低位
温度
高位
5AH
5BH
5DH
61H
62H
63H
65H
66H
时间显示保持时间
日期/温度显示保持时间
秒计数单元
温度部分和高位
温度部分和低位
温度累加次数
初值06H
闰年判断标志位
初值01H
与01F4的绝对差值的低位
67H
68H
69H
6EH
与01F4的绝对差值的高位
存43H单元的低位
存43H单元的高位
用于自检程序循环次数
闰年判断
七、各个程序模块的基本设计思路和基本思想
通过对程序的基本要求以及功能,总的把程序归纳为9个部分,以下是各个部分的总的设计思想:
1.初始化,以及单元赋初值
首先,设置复位入口,同时因为要进行实时钟计时,所以还要设定定时器0服务子程序入口地址。
其次,就是稍加延时,等待上电复位,设置栈底指针,让蜂鸣器响一秒,接着对数码管显示与矩阵键盘接口初始化,还有LED显示、开关、按键接口初始化,以及初始化T0为定时方式2。
最后,对一些单元进行赋初值,比如显示缓冲单元赋初值,200us、10ms单元赋初值,还有时间、日期、温度对应的各个单元进行赋初值,还有时间、温度和日期显示时间,秒计数以及闰年判断标志位单元进行赋初值。
2.自动检测程序思路:
让八个数码管同时显示,通过查表的方式,依次分别从0显示到9,并且带上小数点,判断数码管是否显示正常。
3.消抖程序思路:
对PB按键输入的电平进行最近5采集,通过4次比较,判断是否完全相等,如果完全相等,就对最近依次的电平进行更新,如果出现不相同的情况,就对其不做任何处理。
4.拆字子程序设计思路
首先,先对程序的进程进行判断,判断是属于哪个进程,在根据不同进程显示时间、日期、温度的不同特点,相应进行不同规则的拆字,分别放到30H---37H单元的显示缓冲中去。
5.有关键盘扫描与键盘控制程序思路:
用线反转法进行键盘扫描。
即以行线输出,列线输入,得到列线电平;再以列线输出,行线输入,得到行电平,将行列电平进行组合,再通过查表法,判断按下哪个键。
用键盘对节拍设定,日期以及时间进行修改。
例如,对节拍设定进行修改,首先,先通过对进程进行判断,判断其是否处于显示时间、日期、或者温度状态,如果是,在判断是否有控制修改节拍按键按下,如有,修改进程,将显示节拍修改单元值送入缓冲单元中。
如果已经判断出于节拍修改状态,接着判断是否有键按下。
如果确认有键按下,判断是什么键按下,分三种情况进行分析。
分别是0---9数字键,取消键,以及判断键。
如果不是以上三种,便不作处理。
对于0—9的按键按下,然后再结合当前进程,修改其所对应显示缓冲单元的值,并对进程进行修改;若判断是确认键按下,将节拍中显示缓冲单元的值送入对应时间显示保持时间、日期温度保持时间对应的单元中去,同时秒计时清零。
若判断是按下取消键,将进程修改为01,然后退出。
按键对于日期,以及时间的修改分析方法与对节拍设定修改分析方法、步骤是一致的。
6.显示更新子程序:
通过查表的方法,以动态显示的方式,将显示缓冲区的值显示到数码管中去,并保持显示1ms。
同时根据显示要求,对某些位进行是否需要加点进行判断,对需要加点的为进行加点。
当显示对节拍、时间、日期作修改时,通过每隔250ms,对20H.1位进行修改,结合进程信息,对20.1位进行分析,能够实现闪烁功能。
7.手动切换程序思路:
对PB0键进行判断,如已判断键按下,结合当前进程信息,对其进行修改,已到达对时间、日期、温度显示进行切换。
8.温度采集程序思路:
采用滚存的方式,通过A/D转换,保存最新六次采集结果,取其的平均值,通过一定的算法分析,最终将得到的温度值以规定的格式,输入到对应的显示缓冲单元中。
9.显示定时控制程序:
程序除了能够对时间进行基本计数外,还加入对闰年的判断。
通过对是否为闰年的情况,对二月的天数进行分类判断,其他月份判断不变。
对于闰年的判断方法是将存储年低位单元的值转换为十进制,然后再除以4,对余数是否为0进行判断,就可判断是否为闰年。
八、系统调试
原本计划能够实现一些功能的扩展,比如说正点以及半点报时,无操作时间超时3分钟后自动恢复为基本的时钟显示方式等扩展,但由于对课本的一些基础知识掌握的不到位,在程序设计同时,还要不断地进行复习与学习,以及对整个课程设计总体安排做得不够充分,由于后面时间实在太紧,最终只能放弃系统功能扩展部分。
根据以上的思路,编写出的程序通过调试,可以实现以下基本功能:
1、开机进行接口部件及数码显示器、指示灯、讯响器等自检。
2、八位LED7段数码管显示时钟信息时可包括小时、分钟、秒钟或秒闪信号、星期等;显示日期时包括年、月、日;显示温度时包括温度值(保留一位小数)、温度单位“oC”。
3、设选用的温度传感变送器将检测的-50oC~+100oC温度变换为0~5V电压信号。
4、通过键盘设定的穿插显示间隔时间范围为0--99S,每项穿插显示内容保持时间范围为0S~9S。
5、可通过键盘设定时钟、节拍设定、日期等参数。
6、能够进行闰年的判断。
7、键盘可定义“0”~“9”键、“节拍设定”键、“时间设定”键、“确定”键、“取消”键,键盘设定参数过程可用闪烁方式指示当前修改位
8、设置一个“切换”按钮开关以实现手动切换显示内容。
9、对开关量输入进行软件消抖动处理。
九、课程设计总结、心得体会
通过近两周的课程设计,基本上完成了多功能电子时钟的程序设计,回顾短短两周时间,还是有很多感想,以及一些心得体会。
首先,从学习的角度来看,从第一天到调试成功这段时间,真的学到了很多东西,对一些课本所学的知识加以巩固,学会了利用课本中的知识,还对课本中的一些知识进行了延伸,更重要的是补充了平时学习过程中遗落的一些知识点,比如有些知识点原理仅仅是对其表层进行理解,甚至仅仅是了解它的概念,通过这次设计,使我改变了对一些知识点的理解,更正了一些对一些知识点的错误理解。
从这个角度看,此次课程是一个使我进一步学习的过程。
其次,从对程序编写的角度来看,有了一些进一步的体会,比如说在编写程序时对一些总的,大概的思路要把握好,还有一些思考方式,最好能够制定一个整体流程,然后分模块进行编写,这样可以使问题简单化,而且还可以使程序显得更加清晰、明了,使在编写的初步阶段忽略各个模块之间的联系,减少思维负担。
还有,在编写过程中遇到瓶颈,遇到困难,是很正常的一件事,所以遇到问题,处理问题的方式也显得极其重要。
所以要很好的利用整个专业同学都在一个教室中这个契机、这个环境,遇到问题要善于与同学老师进行交流。
往往会出现这样一个情况,有时候,一个问题,靠自己,百思而不得其解,问一下同学,就一句话,就能使你把谜团打开。
因为有时候,你认为很难的问题,对别人来说,并非一定是难的,也许他掌握的很好。
所以应做到集思广益,很好的利用老师以及班级这个资源。
当然,我认为最为重要的是,通过这次课程设计,使我下定决心改掉我的一些性格上,或者说是处事上的一个很严重的问题-----办事拖拉,没有一个大局观,不能处理好局部与整体的关系。
尤其是办事拖拉,没效率这一点,是个很严肃的问题。
我认为这次不能完成扩展功能,就是因为这一点,导致效率太低,形成了一个前松后紧的局面,最后,还导致我第一次答辩未能通过。
所以我昨晚认真的反思了,想了很多克服这个毛病的方法,最终认为要想克服这个毛病最好的方法,就是在办一件事之前,应制定好一个详细而可行的计划,然后依计划行事,这样就可以提高效率,因为每个阶段都有一个目标,这样就不会是自己显得没有明确的目的。
原来我一直认为制定计划、目标没什么用,一切随机应变,靠自觉吧。
现在我发现错了,只有制定一个计划目标,才会是生活更加有动力,充实而有效率,凡事预则立不预则废。
最后,还有一点,我必须提,我们的指导老师余老师,以及蔡老师在我们编写程序过程中给予了很大的帮助,他们都很敬业,我很敬重他们。
尤其是余老师,对我们都有一个比较高的要求,这一点,同学们都是持相同观点的,但我深知,爱之深,责之切。
对你要求严的老师,并非是想为难你,而是想让你多学到一点知识,这是对学生负责的一种表现。
十、附录:
源程序清单
;电子0701学号:
0207104111姓名:
陈标
ORG0000H;复位入口
LJMPMAIN
ORG000BH;定时器0服务子程序入口(进
;钟计时)
LJMPIT0P
ORG0030H
MAIN:
LCALLD1S;稍加延时(1S),等待各芯片均上电复
位结束
MOVSP,#6FH;总初始化。
设定栈底指针
CLRP3.2;蜂鸣器响1秒
LCALLD1S;延时1S
SETBP3.2;关蜂鸣器
MOVP1,#0;P1口驱L0-7灯全亮1秒
LCALLD1S;延时1S
MOVP1,#0FFH;熄L0-7灯
MOVA,#89H;数码管显示与矩阵键盘接口8255A(U3)初始化
MOVDPTR,#0FEFFH;8255A(U3)
MOVX@DPTR,A;A、B口输出驱动字段、字位,C口输入
MOVA,#8BH;LED显示、开关、按键接口8255A(U5)初始
;化
MOVDPTR,#0FDFFH;8255A(U5)
MOVX@DPTR,A;A口输出驱L8-15,B口输入按键PB0-7,
;C口输入电平开关SW0-7
LCALLZJ;数码管,灯,蜂鸣器的自检程序
MOVR6,#01H;进程单元
MOV21H,#0FFH;按键的键号存放单元
CLR20H.0
MOV30H,#00H;30H-37H为显示缓冲单元
MOV31H,#00H
MOV32H,#00H
MOV33H,#00H
MOV34H,#00H
MOV35H,#00H
MOV36H,#00H
MOV37H,#00H
MOV38H,#00H;38H、39H为时钟200uS、10mS计
;数单元,清0
MOV39H,#00H
MOV3AH,#50H;秒单元
MOV3BH,#59H;分单元
MOV3CH,#23H;时单元,时钟初值23:
59:
50
MOV3DH,#01H;星期单元
MOV41H,#30H;41H--44H日,月,年缓冲单元
MOV42H,#06H
MOV43H,#10H
MOV44H,#20H
MOV46H,#01H;温度的个位
MOV47H,#05H;温度的十位
MOV48H,#08H;温度的百位
MOV49H,#00H;温度的符号位
;50-5557586667616263已用
MOV5AH,#10H;时间显示保持的时间
MOV5BH,#02H;日期和温度显示保持的时间
MOV5DH,#00H;一秒的计数单元
MOV65H,#01H;闰年判断标志位单元
MOVTMOD,#02H;初始化T0为定时方式2,TM=12×
;1/11.0592MHZ(uS
MOVTH0,#48H;00H-48H=184,184×TM≈
200uS(199.6527778uS)
MOVTL0,#48H
SETBEA;CPU允许中断(总允许)
SETBET0;开T0中断
SETBTR0;启动T0定时工作
LOOP:
LCALLXDPB;调用消抖
LCALLCZ;调用拆字子程序
LCALLKEY;键盘扫描子程序
LCALLKEY10
LCALLKEY100
LCALLKEY1000
LCALLDISP;显示更新子程序
LCALLPB;手动切换
LCALLWDCJ;温度采集
LJMPLOOP;反复循环主流程
;--------------自检子程序----------------------------------
ZJ:
MOVR0,#00H;自检程序(八位同时依
;次显示0~9)立即数0送给R3
MOV6EH,#0BH;检测循环的次数
MOVR1,#0FFH;取全部八位字位码
MOVA,R1
ZJ1:
MOVDPTR,#0FEFDH;8255-B口(字位码输出口)
MOVX@DPTR,A;输出全部字位码
MOVA,R0;RO里的数送给累加器
ADDA,#TAB0-NEXTPC0;加TAB0与NEXTPC0差址
MOVCA,@A+PC;查表得相应字段码
NEXTPC0:
MOVDPTR,#0FEFCH;8255-A口(字段码输出口)
MOVX@DPTR,A;输出字段码
LCALLD1S;保持显示1秒
INCR0;R3里的内容加1
MOVA,R1;重新取出全部字位码
DJNZ6EH,ZJ1;判断是否显示到9
RET
TAB0:
DB40H,79H,24H,30H,19H,12H,02H,78H,00H,10H,0FFH;"0."至"9.","全灭"的显示字段码表
;-------消抖动子程序-------------------------
XDPB:
MOV2FH,2EH;PB口输入并消抖动子程
;序。
原新态存为前态
MOV2DH,2CH;前4次输入的电平值前推
;至2AH~2DH单元
MOV2CH,2BH
MOV2BH,2AH
MOV2AH,29H
MOVDPTR,#0FDFDH;输入PB0~7新电平值存
;29H单元
MOVXA,@DPTR
MOV29H,A
MOVA,2DH;比较近5次输入的电平值不一致
;则新态照旧
CJNEA,2CH,XDR
CJNEA,2BH,XDR
CJNEA,2AH,XDR
CJNEA,29H,XDR
MOV2EH,A;输入的电平值一致则存为新态
XDR:
RET
;----手动切换子程序----------------------
PB:
JNB2FH.0,P02
JB2EH.0,P02
CJNER6,#01H,P00
MOVR6,#02H
MOV5DH,#00H
SJMPP02
P00:
CJNER6,#02H,P01
LCALLWDCJ
MOVR6,#03H
MOV5DH,#00H
SJMPP02
P01:
CJNER6,#03H,P02
MOVR6,#01H
MOV5DH,#00H
SJMPP02
P02:
RET
;----------拆字子程序------------------
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 多功能 电子 时钟 程序 课程设计
![提示](https://static.bingdoc.com/images/bang_tan.gif)