51单片机课程设计-电子时钟.docx
51单片机课程设计-电子时钟 51单片机课程设计-电 子时钟 -CAL-FENGHAI.-(YICAI)-Company One1 课程设计 课程名称:单片机课程设计 题目名称:单片机电子时钟 学院:电信学院 专业:电子工程 姓名:曾代科 学号: 3201 指导教师:杨加国 2022年11月7日 一、课程设计名称:51单片机电子时钟 二、设计方案: 1、通过单片机内部的计数/定时器,采用软件编程来实现时钟计数,一般称为软时钟,这种方法的硬件线路简单,系统的功能一般与软件设计相关,通常用在对时间精度要求不高的场合。 2、采用时钟芯片,它的功能强大,功能部件集成在芯片内部,具有自动产生时钟等相关功能,硬件成本相对较高;软件编程简单,通常用在对时钟精度要求较高的场合。 三、设计内容: 这里采用应用广泛的AT89C52作为时钟控制芯片,利用单片机内部的定时/计数器T0 实现软时钟的目的。首先将T0设定工作于定时方式,对机器周期计数形成基准时间(50ms),然后用另一个定时/计数器T1对基准时间计数形成秒,妙计60次形成分,分计60形成小时,小时计到12。最后通过数码管把它们的内容在相应的位置显示出来,达到时、分、秒计时的功能。 此外还要实现对时间的调整功能,89C52的、外接三个独立按键,当按下按键时,系统进入调时间的状态或启动时间显示的功能;当按下按键时,对显 示的数码管进行加一的功能;当按下按键时,对显 示的数码管进行减一的功能,达到调整时间的目的。 四、系统软件程序设计 1.主程序 先对显示单元和定时器/计数器初始化,然后重复调用数码管显示模块和按键处理模块,当有按键按下时,则转入相应的功能程序。 2、数码管显示模块 本实验有8个数码管,从右到左为妙、横线、分、横线、时。在本系统中数码管显示采用软件译码动态显示。在存储器中首先建立一张显示信息的字段码表,显示时,先从显示缓冲区中取出显示的信息,然后通过查表程序在字段表中查出所显示的信息的断码,从P0端口输出,同时在P2端口进行数码管显示。 3、定时器/计数器T0中断服务程序 T0用于计时,选中方式一,重复定时,定时时间设为50ms,定时时间到则中断,在中断服务程序中用一个计 数器对50ms计数,计20次则对秒单元加一。秒单元加到60则对分单元加一,同时秒单元清0;分单元加到60则对时单元加一,同时分单元清0;时单元加到24则对时单元清0,标 志一天时间计满。在对各单元计数的同时,把他们的值放到存储器单元的指定位置。流程图如下: 4、按键处理模块 按键设置为:如果没有按键吗,则时钟正常走时。当按下K0键时,进入调分状态,时钟停止走动;按K1和K2按键可以进行加一和减一操作;继续按K0键可以分别进行分和小时的调整;最后按K0键启动计时。 5、汇编语言程序 ORG 0000H LJMP START ORG 000BH LJMP INIT0 START: M OV R0,#70H ;主程序开始 MOV R7,#0CH INIT: MOV R0,#00H INC R0 DJN Z R7,INIT MOV 72H,#10 ;对连字符进行装值 MOV 75H,#10 MOV TMOD,#01H ;选择定时器/计数器T0的方式1 MOV TL0,#0B0H ;对低位赋初值 MOV TH0,#03CH ;高位赋初值 SETB EA SETB ET0 SETB TR0 START1: LCALL SCAN LCALL KEYSCAN SJMP START1 DL1MS: MOV R6,#14H ;延时1子程序 DL1: M OV R7,#19H DL2: D JNZ R7,DL2 DJNZ R6,DL1 RET DL20MS: ACALL SCAN ;延时20ms子程序 ACALL SCAN ACALL SCAN RET ;数码管显示程序开始 SCAN: MOV A,78H MOV B,#0AH DIV AB ;时间秒的十位送给A,时间秒的个位送B MOV 71H,A ;时间秒要显示的十位 MOV 70H,B ;时间秒要显示的个位 MOV A,79H MOV B,#0AH DIV AB ;时间分的十位送给A,时间分的个位送B MOV 74H,A ;时间分要显示的十位送地址 MOV 73H,B ;时间分要显示的个位送地址 MOV A,7AH MOV B,#0AH DIV AB ;时间时的十位送给A,时间时的个位送B MOV 77H,A ;时间时显示的十位送地址 MOV 76H,B ;时间时要显示的个位送地址 MOV R1,#70H MOV R5,#0FEH MOV R3,#08H SCAN1: MOV A,R5 ;数码管的显示程序 MOV P2,A MOV A,R1 MOV DPTR,#TAB MOVC A,A+DPTR ;对字段表取值显示 MOV P0,A MOV A,R5 LCALL DL1MS INC R1 MOV A,R5 RL A MOV R5,A DJNZ R3,SCAN1 MOV P2,#0FFH MOV P0,#0FFH RET ;"09"和"-"的字段表 TAB: DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H,0BFH ;定时/计数器T0中断程序 INIT0: PUSH ACC PUSH PSW CLR ET0 CLR TR0 MOV TL0,#0B0H MOV TH0,#03CH SETB TR0 INC 7BH MOV A,7BH CJNE A,#14H,OUTT0 ;50ms是否到20次,没有到就继续执行50ms的延时 MOV 7BH,#00 INC 78H MOV A,78H CJNE A,#3CH,OUTT0 ;一秒的延时是否计到60次,没有就继续执行 MOV 78H,#00 INC 79H MOV A,79H CJNE A,#3CH,OUTT0 MOV 79H,#00 INC 7AH MOV A,7AH CJNE A,#18H,OUTT0 ;60分钟的延时是否计到24次,没有就 继续执行程序 MOV 7AH,#00 OUTT0:SETB ET0 ;启动定时器T0 POP PSW POP ACC RETI ;按键处理程序 KEYSCAN:CLR EA JNB ,KEYSCAN0 ;有按键按下则跳转到子程序 JNB ,KEYSCAN1 ;有按键按下则跳转到子程序 JNB ,KEYSCAN2 ;有按键按下则跳转到子程序 KEYOUT: S ETB EA RET KEYSCAN0:LCALL DL20MS ;20ms的延时消抖 JB ,KEYOUT WAIT0: J NB ,WAIT0 ;判断按键是否松手,松手就往下执行程序INC 7CH MOV A,7CH CLR ET0 CLR TR0 CJNE A,#03H,KEYOUT ;按下第一次和第二次对时、分选定 MOV 7CH,#00 ;按下第三次时就启动计时 SETB ET0 SETB TR0 SJMP KEYOUT KEYSCAN1:LCALL DL20MS ;按键加一的程序 JB ,KEYOUT WAIT1: J NB ,WAIT1 MOV A,7CH CJNE A,#02H,KSCAN11 ;如果功能键按下则对时加一调整 INC 79H CJNE A,#3CH,KEYOUT ;如果加到60则清零 MOV 79H,#00 SJMP KEYOUT KSCAN11:INC 7AH ;如果功能键是按下第 二次则对分进行加一调整 MOV A,7AH CJNE A,#18H,KEYOUT MOV 7AH,#00 SJMP KEYOUT KEYSCAN2:LCALL DL20MS ;延时消抖程序 JB ,KEYOUT WAIT2: J NB ,WAIT2 ;判断是否放开按键 MOV A,7CH CJNE A,#02H,KSCAN21 ;如果功能键是按下第一次对时进行减一 DEC 79H MOV A,79H CJNE A,#0FFH,KEYOUT MOV 79H,#3BH SJMP KEYOUT KSCAN21:DEC 7AH ;如果功能键是按下第二次则对分进行减一 CJNE A,#0FFH,KEYOUT MOV 7AH,#17H SJMP KEYOUT END 6、软件编译环境:Keil uVision2 确保生成 ". Hex"文件 五、系统硬件电路的设计 系统的硬件主要包括单片机芯片,数码管显示,按键开关电路,它的硬件电路如下图所示,单片机采用广泛使用的AT89C52,系统时钟采用12MHz的晶振,八个数码管显示,小时与分钟与秒钟间用短横线,采用共阳极七段式数码管,P0口为段选码输出端,P2口为位选码输出端。 硬件电路如图所示: 六、课程设计总结 经过一周的时间以及对整本教材的知识总结,把课程设计分成了硬件和软件两大模块。 总的来说,硬件部分很好入手,电路也教简单,主要涉及的是简单的按键、电容、电阻、晶振和数码管。在软件部分,细分为了按键模块、显示模块、定时/计数模块,最后把几个模块整合在主程序模块中,使得程序简单明了。 整个设计过程中遇到的最大问题是软件的 编写,由于采用的是汇编语言,其间使用到的各种寄存器、存储器地址、变量很多,很难对程序的整体把握。通过电子钟的设计,对单片机的原理、结构、外