单片机电子钟课程设计报告(7)

2019-04-16 21:34

MOV R6,A MOV R7,#16 IBTL: CLR C MOV A,R3 RLC A MOV R3,A MOV A,R2 RLC A MOV R2,A MOV A,R6 ADDC A,R6 DA A MOV R6,A MOV A,R5 ADDC A,R5 DA A MOV R5,A MOV A,R4 ADDC A,R4 DA A MOV R4,A DJNZ R7,IBTL RET

;返回到主程序,等待下一个5ms

;------------------按键声程序------------------- RING:CLR P1.2 MOV R6,#10 D10: MOV R5,#10 D1: MOV R4,#249 DL1:DJNZ R4,DL1

DJNZ R5,D1 DJNZ R6,D10 SETB P1.2 RET

;-----------------延时程序----------------------- D10ms: MOV R5,#10

D1ms:MOV R4,#249

DL:DJNZ R4,DL NOP NOP

DJNZ R5,D1ms SETB P1.2 RET

;-----------------清除内存子程序--------------- CLR_MEM:MOV CLR_MEM1:

MOV INC

R0

@R0,#0 R0,#40H

;从40H单元开始至7FH单元

CJNE R0,#80H,CLR_MEM1 RET

;--------------------TABLE---------------------- LED_CODE:

DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H

DB 80H,90H,88H,83H,0C6H,0A1H,86H,8EH,0FFH

LED_SCAN_TABLE:

DB 01110000B,LED1

DB 10110000B,LED2 DB 11010000B,LED3 DB 11100000B,LED4

END

5. 设计过程问题总结

电子钟的设计贯穿了一整个学期。在设计的过程中,遇到了各种各样的问题,这些问题通过思考和与同学之间的讨论,最终得到了解决。以下是设计个性化电子钟过程中遇到的重要问题和解决方法。

1) 秒单元加到60后,数码管显示“0256”

在设计电子钟的初期阶段,遇到了电子钟秒单元加到60后,数码管显示0256,然后继续加1。这是因为当时将秒单元和分单元用一个二翻十程序进行转换,当秒单元为60时,秒清零,分加1,则下一次二翻十的结果就是0100H的十进制数,即256。

解决方法:在老师还未讲解此问题时,我将双字节二翻十程序修改成单字节二翻十程序,并成功在扫描显示程序中将秒单元和分开调用单字节二翻十并在同一个显示程序中显示。此次设计利用的是老师讲解的方法,将秒单元和分单元分开显示,在调用二翻十程序时将高字节清零。

2) 调时模式下,调时按键按下时,相应的单元停止闪烁

出现这个问题的原因是在按键按下时,单片机执行按键功能程序,此时扫描程序被中断,数码管就会出现停止闪烁或灭掉的情况。

解决方法:在按键功能程序中,执行完按键功能后,先调用扫描显示程序,COVERT_BCD,

再判断按键有无释放。

3) 按键音问题

在编写按键音程序的时候,一开始使用的是按键按下将P1.2置0,松开按键将其置1的方法。而如果使用这种方法,在按键一直按着的情况下蜂鸣器就会一直响,不方便使用。

解决方法:一开始使用的方法是利用防抖动程序中的延时,将蜂鸣器置0之后延时再置1。但因为防抖动的时间是10MS,按键音时间过短而且很微弱,在存在按键抖动时还会发出两次响声。最后使用的方法是再编一个程序,将蜂鸣器置0,延时100MS后再置1,在按键防抖动程序之后再调用此按键音程序。这样就不会被去抖动程序干扰。

4) 闹铃开关问题

因为闹铃程序的变量初始是0,和时钟的变量是一样的,如果不设开关,那么一开机闹铃就会开启。所以在编写了闹铃程序后,就存在一个开关的问题:假如用一个标志位控制闹铃变量的判断,按下某个按键将其取反,那么在闹铃还没开启时,可以将标志位取反使闹铃开启。但闹铃开启后是将P1.2置0,取反标志位只是不再判断闹铃变量是否与时钟变量相等,而不会改变P1.2的值,即闹铃会一直响。

解决方法:如果在取反按键中加上CPL P1.2这条语句,会影响闹铃的正常运行。最终的解决方法是在取反标志位的前面加上SETB P1.2这条语句,这样不管开启还是关闭闹铃,都不会和闹铃程序有冲突,并且能够控制闹铃声。

5) 秒表时间与时钟运行时间冲突的问题

在设计秒表时,是和时钟运行共用同一个定时器计时。如果过秒表和时钟运行程序使用同一个秒单元,虽然能够正常计时,但秒表的使用就会影响时钟的正常运行。

解决方法:定义一个秒表的秒单元变量TS_MEM,此变量不受TIMER_COUNT控制,只有当XS_MEM为100时才会加1。这样秒表的时间就不会和时钟运行时间冲突。

6) 复位按钮不能使用的问题

在设计好程序之后,我发现复位按钮按下并不会改变电子钟的数值。复位按钮的作用是使单片机进入初始化状态,让程序从头开始执行,但不会改变变量的值。因此必须在程序的开头清除内存。

解决方法:在主程序的开始部分,调用用于清除内存的子程序,将40H到7FH单元的内容全部清零。

6. 数据测试和误差校准

6.1 数据测试和误差分析

经测定,10小时后电子钟比实际时间慢57.5秒。虽然记数初值是按照电子钟的晶振频率来计算的,但在程序处理过程中。中断服务执行的结果要显示到数码管上是存在时差的,对于误差存在的原因,我认为有以下几点:

1) 电子钟的晶振频率为11.0592MHZ,计算计数初值的结果只是精确到个位,并不是准确值。

2) 程序指令的执行需要时间,中断服务程序、扫描显示程序和BCD码转换程序的执行都可能影响时间的准确度。 3) 手动测试数据的时候会存在误差。

6.2 数据校准

由于10小时慢了57.5秒,则每秒慢了57.5/36000=1.5972ms。

每次中断的时间为5ms,200次中断为1秒,则每次中断慢了1.5972/200=0.007986ms 计数初值的公式中N的理论值为5ms/(12/11.0592)us=4608

则实际值N=(5-0.007986)ms/(12/11.0592)us=4601,所以应将N改为4601 以下是校准前后测试10小时误差对比

测试时间 校准前 校准后

电子钟实际时间 10:00:00 10:00:00 手机秒表显示时间 10:00:57.5

7. 心得体会与建议

7.1 心得体会

在本次课程设计的过程中,我遇到了很多困难,有些困难还花费了我大量的时间,所幸这些问题最后都得到了解决,并且在问题解决后,我得到了巨大的成就感。我很庆幸自己学习了单片机这门课程,让我发现了编程的乐趣,从而确定了人生的方向。这次课程设计,真的让我学会了很多。我觉得做设计的意义不在于你做出了什么,而在于学到了多少。每次问题的解决,都让我对单片机有了更深的了解,都为下次问题的解决提供了很好的思路。虽然一开始做起来会困难重重,而随着对变成技术的提高,到后面就越做越轻松,并且越能感受到编程的乐趣。这门课对于我来说,是一个受益终生的,宝贵的财富。

7.2 建议

关于对这门课的建议,我希望老师可以多提供几个课程设计的题目选择,并且每一个都能有具体要求。因为这样就不会使每个学生做出来的都千篇一律,能让学生更加自由地发挥。而且虽然有些同学想做做不一样的题目,但因为对于单片机了解还不是很深所以就无从选择了。我在做课程设计的时候,虽然想做很多创新的东西,但是因为当时买的开发板功能太少,很多东西都做不出来,只能放弃了。所以也希望老师能够给我们推荐一个功

能齐全的开发板,让我们能够作更多的创新。

参考文献

【1】 李全利主编.《单片机原理与接口技术》.第2版. 高等教育出版社,2009年1月 【2】 李丽荣、张常全、郑建红主编.《51单片机应用设计》.北京理工大学出版社,2012

年 8月

【3】 郑锋、王巧芝、李英健、刘瑞国编著.二

版.中国铁道出版社,2011年7月

51单片机应用系统典型模块开发大全》.第


单片机电子钟课程设计报告(7).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:英语专业导读书目doc

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: