目一.作品介⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯ 2 二.片机系原理及工作原理描述⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯ 2 三.程中碰到的及解决方法⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯ 4 四.数据及差分析⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯ 4 五.⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯ 5 六.程序模框⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯ 5 七.程序清⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯7单片机的个性化电子钟设计报告一.作品简介该作品是个性化电子钟设计,技术上主要用单片机(AT89S52)主控, 4 位 LED 数码显示,分别显示“小时:分钟”。
该作品主要用于24 小时计时显示,能整时报时 ,能作为秒表使用,能定时闹铃 1 分钟。
使用方法 :开机后显示日期,学号,时钟在00:00:00 起开始计时。
(1)长按进入调分状态 :分单元闪烁 ,按加 1,按减 1.再长按进入时调整状态 ,时单元闪烁 ,加减调整同调分 .按长按退出调整状态。
(2)按进入设定闹时状态: 12:00: ,可进行分设定,按分加 1,再按为时调整 ,按时加 1,按调闹钟结束.在闹铃时可按停闹,不按闹铃 1 分钟。
(3)按下进入秒表状态:再按秒表又启动,按暂停 ,再按秒表清零 ,按退出秒表回到时钟状态。
二.单片机系统原理图及工作原理描述(1)总原理图如原理图所示,硬件系统主要由单片机最小应用系统、LED数码管显示模块组成。
(2)各个模块说明1.单片机最小系统AT89S52 是一款非常适合单片机初学者学习的单片机,它完全兼容传统的8051 ,8031 的指令系统,他的运行速度要比8051 快最高支持达33MHz 的晶体震荡器,在此系统中使用12MHz 的晶振。
AT89S52 具有以下标准功能:8k 字节 Flash, 256字节 RAM,32 位 I/O口线,看门狗定时器, 2 个数据指针,三个16 位定时器 / 计数器,一个 6 向量 2 级中断结构,全双工串行口,片内晶振及时钟电路。
另外,AT89S52图正面图可降至 0Hz 静态逻辑操作,支持 2 种软件可选择节电模式。
空闲模式下,CPU 停止工作,允许 RAM、定时器 / 计数器、串口、中断继续工作。
掉电保护方式下,RAM 内容被保存,振荡器被冻结,单片机一切工作停止,直到下一个中断或硬件复位为止。
2、显示模块在实际应用中,用户很少直接设计LCD 显示器驱动接口,一般是直接使用专用的LCD显示驱动器和LCD显示模块。
其中,LCD显示模块LCM( Liquid Crystal Display Module )是把 LCD显示器、背景光源、线路板和驱动集成电路等部件构成一个整体,作为一个独立的部件使用,具有功能较强、易于控制、接口简单等优点,在单片机系统中应用较多。
其内部结构如图2-8 所示。
LCD显示模块只留一个接口与外部通信。
显示模块通过这个接口接收显示命令和数据,并按指令和数据的要求进行显示。
外部电路通过这个接口读出显示模块的工作状态和显示数据。
LCD 显示模块一般带有内部显示RAM 和字符发生器,只要输入ASCII码就可以进行显示。
LCD显示模块按功能显示可分为:LCD段式显示模块、LCD字符型显示模块、LCD图形显示块三类。
本系统利用 4 位 LED数码管显示时间,共阳极结构。
LED数码管由7 段发光二极管组成,当要显示某个数字时只要将数字所对应的引脚送入低电平。
3.按键模式本设计中主要有三个控制按键,按键功能为:为调时间模式,长按进入调分状态:分单元闪烁 ,按加1,按减 1.再长按进入时调整状态,时单元闪烁 ,加减调整同调分.按长按退出调整状态。
按进入设定闹时状态: 12:00: , 可进行分设定,按分加 1,再按为时调整 ,按时加1,按调闹钟结束.在闹铃时可按停闹,不按闹铃 1 分钟。
(3)按下进入秒表状态:再按秒表又启动 ,按暂停 ,再按秒表清零 ,按退出秒表回到时钟状态。
4.元件器材图 3.按键引脚图元器件型号 /大小单片机AT89S52译码器74LS164七段数码显示管一位共阳极LED发光二极管蜂鸣器二极管1N4007、 1N4148电阻1K、 10K、排阻电容10uF、 30pF、 100uF、 220uF晶振12M开关按键USB口其它芯片底槽、导线三.设计过程中碰到的问题及解决方法硬件方面:( 1)焊接三极管时,由于三个引脚间的距离太近,自己过于急躁,弄了很多锡在上面,造成短路;最后用吸锡器弄干净,重新焊接,有些锡粘在板上,必须用小刀把两引脚间的锡削掉。
这里花费了大量时间。
(2) LED 显示器有一排显示不出来,查明是接口虚焊问题。
重新补焊接显示器接口。
软件方面:(1)程序编写开始有点混乱,最后重新构思,确定各个按键功能,再根据各个功能编写,这样一步步来,思路比较清晰。
( 2)程序编写时感觉最难的是按键切换,开始感觉无法下手。
最后找了一些按键方面的程序,慢慢看,慢慢了解;然后根据自己设计的特点编写程序。
( 3)调试时感觉按键声太吵,影响到宿舍其他人,觉得作用不大,就去掉。
四.测试数据及误差分析(1 )测试数据如下:实际时间显示时间校准前12: 17: 00 12:17: 00校准后20: 52: 53 20:52: 50 测试总时间长度是8:35: 53,设计的时钟误差比实际时间慢 3 秒。
(2 )误差分析误差由元件的精确度和焊接导致的连接不稳定,以及软件算法上的缺陷而产生。
要消除这些误差,首先必须提高焊接电工技术,其次可以通过了解各元器件的特点,针对这些特点编写程序,用软件算法来克服这些误差。
本次设计时钟测试时比实际时间慢 3 秒,可以通过降低 T0 对机器周期计数时间来提高它的准确率。
五.总结数字电子钟所有功能都以实现,可以通过按键进行模式切换,并对其数值进行调节。
在这基础上还添加了省电模式,开机显示时间和学号,还有秒表,闹铃功能。
存在不足是设计的电子钟存在一定的误差,不能在实际中运用。
通过本次课程设计,对单片机AT89S52有更深入的了解,同时在对单片机进行软件编程的过程中,学会了单片机编程的流程控制,熟悉了单片机显示按键系统的编程实现。
六.程序模块框图硬件框图:蜂鸣器DOWNLOAD AT89S52LDE显示器时钟调整模式:N秒表模式:开始系统初始化是否按下设置键Y时间调整模式是否退出调整模式Y是否跟闹钟时间一致Y启动闹铃开始系统初始化是否按功能切换键Y切换秒表NN显示时间N显示时间整点报时模式:开始显示时间N分钟是否为00Y蜂鸣器响一次N七.程序清单;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AT89S52时钟程序;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;******************************************************************************;定时器 T0、 T1 溢出周期为50MS,T0 为秒计数用,T1 为调整时闪烁及秒表定时用,;、、为调整按钮, P0 口为字符输出口,P2 为扫描口,为蜂呜器口,采;用共阳显示管。
;50H-55H 为闹钟定时单元,60H-65H 为秒表计时单元,72H-75H 为显示时间单元,76H-79H ;为分时计时单元。
;03H 标志 =0 时钟闪烁, =1 秒表,05H=0,不闹铃, =1 要闹铃 .07H 每秒改变一次, ;用作间隔呜叫 .;******************************************************************************DISPFIRST EQU 30H;显示首址存放单元BELL EQUCONBS EQU 2FH;存放报时次数CLOCK EQU2DH;;****************************************;;中断入口程序;;;****************************************;ORG 0000H;程序执行开始地址LJMP START ;跳到标号START执行ORG 0003H;外中断 0 中断程序入口RETI;外中断 0 中断返回ORG 000BH;定时器 T0 中断程序入口LJMP INTT0 ;跳至 INTTO 执行ORG 0013H;外中断 1 中断程序入口RETI;外中断 1 中断返回ORG 001BH; 定时器 T1 中断程序入口LJMP INTT1 ;跳至 INTT1 执行ORG 0023H;串行中断程序入口地址RETI;串行中断程序返回;;****************************************;;以下程序开始;;;****************************************;整点报时用QQQQ:MOV A,#10HMOV B,79HMUL ABADD A,78HMOV CONBS,ABSLOOP: LCALL DS21MSLCALL DL1SLCALL DL1SLCALL DL1SDJNZ CONBS,BSLOOPCLR 08H;清整点报时标志AJMP START1;;****************************************;;主程序开始;;;****************************************;START: LCALL ST ;上电显示年月日及班级学号MOV R0,#00H ;清 00H-7FH 内存单元MOV R7,#80H ;CLEARDISP: MOV @R0,#00H ;INC R0 ;DJNZ R7,CLEARDISP ;MOV 20H,#00H ;清 20H(标志用)MOV 55H,#1MOV 54H,#2MOV 7AH,#0AH ;放入 " 熄灭符 " 数据MOV TMOD,#11H ;设 T0、 T1 为 16 位定时器MOV TL0,#0B0H ;50MS 定时初值( T0 计时用)MOV TH0,#3CH ;50MS 定时初值MOV TL1,#0B0H ;50MS 定时初值( T1 闪烁定时用)MOV TH1,#3CH ;50MS 定时初值SETB EA;总中断开放SETB ET0 ;允许 T0 中断SETB TR0 ;开启 T0 定时器MOV R4,#14H ;1 秒定时用计数值(50MS×20)MOV DISPFIRST,#72H显;示单元为 72-75H;以下主程序循环START1: LCALL DISPLAY ;调用显示子程序JNB ,SETMM1 ;口为 0 时转时间调整程序JNB ,TSFUN ;定时闹铃设定JNB ,FUNPT ;秒表功能( STOP,RUN,CLR)JB 08H, QQQQAJMP START1 ; 口为 1 时跳回 START1FUNPT: LJMP FUNPTTSTART12: LJMP START1;以下闹铃时间设定程序,按进入设定TSFUN:LCALL DS20MSJB,START1;WAIT113: JNB,WAIT113;等待键释放JB 05H,CLOSESP;闹铃已开的话,关闹铃MOV DISPFIRST,#52H ; 进入闹铃设定程序,显示52-55H 闹钟定时单元;DSWAIT: SETB EALCALL DISPLAYJNB ,DSFINC;分加 1JNB ,DSDEC;分减 1JNB ,DSSFU;进入时调整AJMP DSWAIT;CLOSESP: CLR 05H;关闹铃标志CLR BELLAJMP START1DSSFU: LCALL DS20MS;消抖JB, DSWAITLJMP DSSFUNN;进入时调整;SETMM1: LJMP SETMM;转到时间调整程序SETMM;DSFINC : LCALL DS20MS ;消抖JB , DSWAITDSWAIT12: LCALL DISPLAY ;等键释放JNB , DSWAIT12CLR EAMOV R0,#53H ;LCALL ADD1 ;闹铃设定分加 1MOV A,R3 ; 分数据放入 ACLR C ; 清进位标志CJNE A,#60H,ADDHH22 ;ADDHH22: JC DSWAIT ;小于 60 分时返回ACALL CLR0 ; 大于或等于60 分时分计时单元清 0AJMP DSWAITDSDEC : LCALL DS20MS ;消抖JB , DSWAITDSWAITEE: LCALL DISPLAY; 等键释放JNB, DSWAITEECLR EAMOV R0,#53H;LCALL sub1;闹铃设定分减 1LJMP DSWAIT;以下秒表暂停清零功能程序;按下切换秒表功能,再按开始计时,暂停或清0,最后按退出秒表回到时钟计时FUNPTT: LCALL DS20MSJB ,START12WAIT22:JNB ,WAIT21CPL 03HJNB 03H,TIMFUNMOV DISPFIRST,#60H ;显示秒表数据单元MOV 60H,#00HMOV 61H,#00HMOV 62H,#00HMOV 63H,#00HMOV 64H,#00HMOV 65H,#00HMOV TL1,#0F0H ;10MS 定时初值MOV TH1,#0D8H ;10MS 定时初值WAIT88:LCALL DS20MSJB,WAIT81WAIT99:JNB,WAIT99SETB TR1;T1 运行控制软件SETB ET1;T1 溢出中断允许WAIT33:LCALL DS20MSJB,WAIT31WAIT44:JNB,WAIT41CLR ET1CLR TR1WAIT55:LCALL DS20MSJB,WAIT51WAIT66:JNB,WAIT61MOV60H,#00HMOV61H,#00HMOV62H,#00HMOV63H,#00HMOV64H,#00HMOV65H,#00HTIMFUN:MOV DISPFIRST,#72H ;显示时钟数据单元CLR ET1CLR TR1AJMP FUNSS11FUNSS11: AJMP START1;以下键等待释放时显示不会熄灭用WAIT21:LCALL DISPLAYAJMP WAIT22WAIT31:LCALL DISPLAYAJMP WAIT33WAIT41: LCALL DISPLAYAJMP WAIT44WAIT51: LCALL DISPLAYAJMP WAIT55WAIT61: LCALL DISPLAYAJMP WAIT66WAIT81: LCALL DISPLAYAJMP WAIT88WAIT91: LCALL DISPLAYAJMP WAIT99 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 1 秒计时程序;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;T0 中断服务程序INTT0: PUSH ACC ;累加器入栈保护PUSH PSW ;状态字入栈保护CLR ET0 ; 关 T0 中断允许CLR TR0 ;关闭定时器 T0MOV A,#0B7H ;中断响应时间同步修正ADD A,TL0 ;低 8 位初值修正MOV TL0,A ;重装初值(低8 位修正值)MOV A,#3CH ;高 8 位初值修正ADDC A,TH0 ;MOV TH0,A ;重装初值(高8 位修正值)SETB TR0 ; 开启定时器 T0DJNZ R4, OUTT0 ;20 次中断未到中断退出ADDSS: MOV R4,#14H ;20 次中断到( 1 秒)重赋初值CPL 07H ; 闹铃时间隔呜叫用MOV R0,#71H ;指向秒计时单元(71H-72H)ACALL ADD1 ;调用加 1 程序(加 1 秒操作)MOV A,R3 ; 秒数据放入A(R3为 2 位十进制数组合)CLR C ;清进位标志CJNE A,#60H,ADDMM ;ADDMM: JC OUTT0 ;小于 60 秒时中断退出ACALL CLR0 ; 大于或等于 60 秒时对秒计时单元清0MOV R0,#77H ; 指向分计时单元( 76H-77H)ACALL ADD1 ;分计时单元加 1 分钟MOV A,R3 ;分数据放入 ACLR C ;清进位标志CJNE A,#60H,ADDHH ;ADDHH: JC OUTT0 ;小于 60 分时中断退出ACALL CLR0 ; 大于或等于 60 分时分计时单元清0LCALL DS20MS ; 正点报时SETB 08HMOV R0,#79H ;指向小时计时单元( 78H-79H)ACALL ADD1 ;小时计时单元加 1 小时MOV A,R3 ; 时数据放入 ACLR C ;清进位标志CJNE A,#24H,HOUR ;HOUR: JC OUTT0 ;小于 24 小时中断退出ACALL CLR0 ; 大于或等于 24 小时小时计时单元清0 OUTT0: MOV 72H,76H ;中断退出时将分、时计时单元数据移MOV 73H,77H ; 入对应显示单元MOV 74H,78H ;MOV 75H,79H ;LCALL BAOJPOP PSW ;恢复状态字(出栈)POP ACC ;恢复累加器SETB ET0 ;开放 T0 中断RETI ;中断返回;****************************************;;闪动调时程序秒表功能程序;;;****************************************;T1 中断服务程序,用作时间调整时调整单元闪烁指示或秒表计时INTT1: PUSH ACC ;中断现场保护PUSH PSW ;JB 03H, MMFUN ;=1 时秒表MOV TL1, #0B0H ;装定时器 T1 定时初值MOV TH1, #3CH ;DJNZ R2,INTT1OUT ;秒未到退出中断( 50MS 中断 6 次)MOV R2,#06H ;重装秒定时用初值CPL 02H ;秒定时到对闪烁标志取反JB 02H,FLASH1 ;02H 位为 1 时显示单元 " 熄灭 "MOV 72H,76H ;02H 位为 0 时正常显示MOV 73H,77H ;MOV 74H,78H ;MOV 75H,79H ;INTT1OUT: POP PSW ;恢复现场POP ACC ;RETI ;中断退出FLASH1: JB 01H,FLASH2 ;01H 位为 1 时,转小时熄灭控制MOV 72H,7AH ;01H 位为 0 时, "熄灭符 "数据放入分MOV 73H,7AH ; 显示单元(72H-73H),将不显示分数据MOV 74H,78H ;MOV 75H,79H ;AJMP INTT1OUT ;转中断退出FLASH2: MOV 72H,76H ;01H 位为 1 时, " 熄灭符 " 数据放入小时MOV 73H,77H ; 显示单元(74H-75H),小时数据将不显示MOV 74H,7AH ;MOV 75H,7AH ;AJMP INTT1OUT ;转中断退出;MMFUN : CLR TR1MOV A,#0F7H ;中断响应时间同步修正,重装初值( 10ms)ADD A,TL1 ;低 8 位初值修正MOV TL1,A ;重装初值(低 8 位修正值)MOV A,#0D8H ;高 8 位初值修正ADDC A,TH1 ;MOV TH1,A ;重装初值(高 8 位修正值)SETB TR1 ; 开启定时器 T1MOV R0,#61H ; 指向秒计时单元( 71H-72H)ACALL ADD1 ;调用加 1 程序(加1 秒操作)CLR C ;MOV A,R3 ;JZ FSS1 ;加 1 后为 00,C=0FSS1: ACALL CLR0 ;大于或等于 60 秒时对秒计时单元清0MOV R0,#63H ;指向分计时单元(76H-77H)ACALL ADD1 ;分计时单元加 1 分钟MOV A,R3 ;分数据放入 ACLR C ;清进位标志CJNE A,#60H,ADDHH1 ;ADDHH1: JC OUTT01 ;小于 60 分时中断退出LCALL CLR0 ;大于或等于 60 分时分计时单元清0MOV R0,#65H ;指向小时计时单元( 78H-79H)ACALL ADD1 ;小时计时单元加 1 小时OUTT01:POP PSW ;恢复状态字(出栈)POP ACC ;恢复累加器RETI ;中断返回;;****************************************;; 加1子程序;;;****************************************ADD1: MOV A,@R0 ;取当前计时单元数据到 ADEC R0 ;指向前一地址SWAP A ;A 中数据高四位与低四位交换ORL A,@R0 ; 前一地址中数据放入 A 中低四位ADD A,#01H ;A加 1操作DA A ;十进制调整MOV R3,A ;移入 R3 寄存器ANL A,#0FH ;高四位变 0MOV @R0,A ; 放回前一地址单元INC R0;指向当前地址单元SWAP A;A 中数据高四位与低四位交换ANL A,#0FH;高四位变0MOV @R0,A;数据放入当削地址单元中RET;子程序返回;****************************************;;分减1子程序;;;****************************************;SUB1: MOV A,@R0 ;取当前计时单元数据到 ADEC R0 ;指向前一地址SWAP A ;A 中数据高四位与低四位交换ORL A,@R0 ; 前一地址中数据放入 A 中低四位JZ SUB11DEC A ;A减1操作SUB111: MOV R3,A ;移入 R3 寄存器ANL A,#0FH ;高四位变 0CLR C ;清进位标志SUBB A,#0AHSUB1111: JC SUB1110MOV @R0,#09H; 大于等于 0AH,为 9SUB110: MOV A,R3 ;取回 R3 中暂存数据INC R0 ;指向当前地址单元SWAP A ;A 中数据高四位与低四位交换ANL A,#0FH ;高四位变 0MOV @R0,A ;数据放入当削地址单元中;SUB11: MOV A,#59HAJMP SUB111SUB1110:MOV A,R3; 移入 R3 寄存器ANL A,#0FH;高四位变0MOV@R0,AAJMP SUB110;****************************************;; 时减1子程序;;;****************************************SUBB1:MOV A,@R0 ;取当前计时单元数据到 ADEC R0 ;指向前一地址SWAP A ;A 中数据高四位与低四位交换ORL A,@R0 ; 前一地址中数据放入 A 中低四位JZ SUBB11 ;00 减 1 为 23(小时)DEC A ;A减1操作SUBB111:MOV R3,A ;移入 R3 寄存器ANL A,#0FH ;高四位变 0CLR C ;清进位标志SUBB A,#0AH ;时个位大于 9 为 9SUBB1111: JC SUBB1110 ;MOV @R0,#09H; 大于等于 0AH,为 9SUBB110: MOV A,R3 ;取回 R3 中暂存数据INC R0 ;指向当前地址单元SWAP A ;A 中数据高四位与低四位交换ANL A,#0FH ;高四位变 0RET; 子程序返回;SUBB11: MOV A,#23HAJMP SUBB111SUBB1110:MOV A,R3;时个位小于0A 不处理ANL A,#0FH;高四位变0MOV@R0,A;个位移入AJMP SUBB110;****************************************;;清零程序;;;****************************************;对计时单元复零用CLR0: CLR A;清累加器MOV@R0,A;清当前地址单元DEC R0;指向前一地址MOV@R0,A;前一地址单元清0RET;子程序返回;;****************************************;;时钟时间调整程序;;;****************************************;当调时按键按下时进入此程序SETMM: cLR ET0;关定时器 T0 中断CLR TR0;关闭定时器T0LCALL DL1S;调用 1 秒延时程序LCALL DS20MS ;消抖JB ,CLOSEDIS ; 键按下时间小于 1 秒,关闭显示(省电)MOV R2,#06H ;进入调时状态,赋闪烁定时初值MOV 70H,#00H ;调时时秒单元为00 秒MOV 71H,#00HSETB ET1 ;允许 T1 中断SETB TR1 ;开启定时器 T1SET2: JNB ,SET1 ;口为 0(键未释放),等待SETB 00H ; 键释放,分调整闪烁标志置1 SET4: JB ,SET3 ;等待键按下LCALL DL05S ;有键按下,延时秒LCALL DS20MS ;消抖JNB ,SETHH ;按下时间大于秒转调小时状态MOV R0,#77H ; 按下时间小于秒加 1 分钟操作LCALL ADD1 ;调用加 1 子程序MOV A,R3 ; 取调整单元数据CLR C ; 清进位标志CJNE A,#60H,HHH ; 调整单元数据与60 比较HHH: JC SET4 ;调整单元数据小于60 转 SET4循环LCALL CLR0 ;调整单元数据大于或等于60时清0CLR C ; 清进位标志AJMP SET4 ;跳转到 SET4循环CLOSEDIS: SETB ET0 ;省电( LED不显示)状态。