大工13秋《单片机原理及应用》大作业单片机电子时钟设计杨建军.pdf
网络教育学院网络教育学院单片机原理及应用大作业单片机原理及应用大作业单片机电子时钟设计题题目目:学习中心:学习中心:大连学习中心大连学习中心层层次:次:高中起点专科专专业:业:电气工程及其自动化电气工程及其自动化年年级:级:1209 年春/秋 季学学号:号:学生姓名:学生姓名:单片机电子时钟设计单片机电子时钟设计一、一、摘要摘要1957 年,Ventura 发明了世界上第一个电子表,从而奠定了电子时钟的基础,电子时钟开始迅速发展起来。现代的电子时钟是基于单片机的一种计时工具,采用延时程序产生一定的时间中断,用于一秒的定义,通过计数方式进行满六十秒分钟进一,满六十分小时进一,满二十四小时小时清零。从而达到计时的功能,是人民日常生活补课缺少的工具。现在高精度的计时工具大多数都使用了石英晶体振荡器,由于电子钟、石英钟、石英表都采用了石英技术,因此走时精度高,稳定性好,使用方便,不需要经常调试,数字式电子钟用集成电路计时时,译码代替机械式传动,用 LED 显示器代替指针显示进而显示时间,减小了计时误差,这种表具有时、分、秒显示时间的功能,还可以进行时和分的校对,片选的灵活性好。二、时钟的基本原理二、时钟的基本原理电子时钟由 89C51,BUTTON,六段数码管等构成,采用晶振电路作为驱动电路,由延时程序和循环程序产生的一秒定时,达到时分秒的计时,六十秒为一分钟,六十分钟为一小时,满二十四小时为一天。而电路中唯一的一个控制键却拥有多种不同的功能,按下又松开,可以实现屏蔽数码管显示的功能,达到省电的目的;直接按下不松开,则可以通过按键实现分钟的累加,每按一次分钟加一;而连续两次按下按键不放松,则可实现小时的调节,同样每按一次小时加一并通过一个控制键用来实现时间的调节和是否进入省电模式的转换。应用 Proteus 的 ISIS 软件实现了单片机电子时钟系统的设计与仿真。该方法仿真效果真实、准确,节省了硬件资源。三、设计方案和论证三、设计方案和论证本次设计时钟电路,使用了 ATC89C51 单片机芯片控制电路,单片机控制电路简单且省去了很多复杂的线路,使得电路简明易懂,使用键盘键上的按键来调整时钟的时、分、秒,用一扬声器来进行定时提醒,同时使用汇编语言程序来控制整个时钟显示,使得编程变得更容易,这样通过四个模块:键盘、芯片、扬声器、LED 显示即可满足设计要求。(一)(一)总设计原理框图如下图所示:时钟电路微 型控 制器数据显示校时输入声光报时(二)设计方案的选择(二)设计方案的选择1.计时方案方案 1:采用实时时钟芯片现在市场上有很多实时时钟集成电路,如 DS1287、DS12887、DS1302 等。这些实时时钟芯片具备年、月、日、时、分、秒计时功能和多点定时功能,计时数据的更新每秒自动进行一次,不需要程序干预。因此,在工业实时测控系统中多采用这一类专用芯片来实现实时时钟功能。方案 2:使用单片机内部的可编程定时器。利用单片机内部的定时计数器进行中端定时,配合软件延时实现时、分、秒的计时。该方案节省硬件成本,但程序设计较为复杂。2.显示方案对于实时时钟而言,显示显然是另一个重要的环节。通常LED 显示有两种方式:动态显示和静态显示。静态显示的优点是程序简单、显示亮度有保证、单片机 CPU 的开销小,节约 CPU 的工作时间。但占有 I/O 口线多,每一个 LED 都要占有一个 I/O 口,硬件开销大,电路复杂。需要几个LED 就必须占有几个并行口,比较适用于LED 数量较少的场合。当然当 LED 数量较多的时候,可以使用单片机的串行口通过移位寄存器的方式加以解决,但程序编写比较麻烦。LED 动态显示硬件连接简单,但动态扫描的显示方式需要占有 CPU 较多的时间,在单片机没有太多实时测控任务的情况下可以采用。本系统需要采用 6 位 LED 数码管来分别显示时、分、秒,因数码管个数较多,故本系统选择动态显示方式。(三)硬件部分(三)硬件部分1 1、STC89C51STC89C51 单片机介绍单片机介绍STC89C51 单片机是由深圳宏晶公司代理销售的一款 MCU,是由美国设计生产的一种低电压、高性能 CMOS 8 位单片机,片内含 8kbytes 的可反复写的 FlashROM 和 128bytes 的 RAM,2 个 16 位定时计数器5。STC89C51 单片机内部主要包括累加器 ACC(有时也简称为 A)、程序状态字 PSW、地址指示器 DPTR、只读存储器 ROM、随机存取存储器 RAM、寄存器、并行 I/O 接口 P0P3、定时器/计数器、串行 I/O 接口以及定时控制逻辑电路等。这些部件通过内部总线联接起来,构成一个完整的微型计算机。其管脚图如图所示。STC89C51单片机管脚结构图VCC:电源。GND:接地。P0 口:P0 口为一个 8 位漏级开路双向 I/O 口,每脚可吸收 8TTL 门电流。当P1 口的管脚第一次写 1 时,被定义为高阻输入。P0 能够用于外部程 序数据存储器,它可以被定义为数据/地址的第八位。在 FIASH 编程时,P0 口作为原码输入口,当 FIASH 进行校验时,P0 输出原码,此时 P0 外部必须被拉高。P1 口:P1 口是一个内部提供上拉电阻的 8 位双向 I/O 口,P1 口缓冲器能接收输出 4TTL 门电流。P1 口管脚写入 1 后,被内部上拉为高,可用作 输入,P1 口被外部下拉为低电平时,将输出电流,这是由于内部上拉的缘故。在 FLASH编程和校验时,P1 口作为第八位地址接收。P2 口:P2 口为一个内部上拉电阻的 8 位双向 I/O 口,P2 口缓冲器可接收,输出 4 个 TTL 门电流,当 P2 口被写“1”时,其管脚被内部上拉电阻 拉高,且作为输入。并因此作为输入时,P2 口的管脚被外部拉低,将输出电流。这是由于内部上拉的缘故。P2 口当用于外部程序存储器或 16 位地址外部数据存 储器进行存取时,P2 口输出地址的高八位。在给出地址“1”时,它利用内部上拉优势,当对外部八位地址数据存储器进行读写时,P2 口输出其特殊功能寄存器 的内容。P2 口在 FLASH 编程和校验时接收高八位地址信号和控制信号。P3 口:P3 口管脚是 8 个带内部上拉电阻的双向 I/O 口,可接收输出 4 个TTL 门电流。当 P3 口写入“1”后,它们被内部上拉为高电平,并用作输入。作为输入,由于外部下拉为低电平,P3 口将输出电流(ILL)这是由于上拉的缘故。P3 口也可作为 AT89C51 的一些特殊功能口,如下表所示:口管脚 备选功能P3.0 RXD(串行输入口)P3.1 TXD(串行输出口)P3.2/INT0(外部中断 0)P3.3/INT1(外部中断 1)P3.4 T0(记时器 0 外部输入)P3.5 T1(记时器 1 外部输入)P3.6/WR(外部数据存储器写选通)P3.7/RD(外部数据存储器读选通)P3 口同时为闪烁编程和编程校验接收一些控制信号。RST:复位输入。当振荡器复位器件时,要保持 RST 脚两个机器周期的高电平时间。ALE/PROG:当访问外部存储器时,地址锁存允许的输出电平用于锁存地址的地位字节。在FLASH 编程期间,此引脚用于输入编程脉冲。在平时,ALE 端以不变的频率周期输出正脉冲信号,此频率为振荡器频率的1/6。因此它可用作对外部输出的脉冲或用于定时目的。然而要注意的是:每当用作外部数据存储器 时,将跳过一个 ALE 脉冲。如想禁止 ALE 的输出可在 SFR8EH 地址上置 0。此时,ALE只有在执行 MOVX,MOVC 指令是 ALE 才起作用。另外,该引脚被略微拉高。如果微处理器在外部执行状态 ALE 禁止,置位无效。PSEN:外部程序存储器的选通信号。在由外部程序存储器取指期间,每个机器周期两次/PSEN 有效。但在访问外部数据存储器时,这两次有效的/PSEN 信号将不出现。EA/VPP:当/EA 保持低电平时,则在此期间外部程序存储(0000H-FFFFH),不管是否有内部程序存储器。注意加密方式 1 时,/EA 将内部锁定为 RESET;当/EA 端保持高电平时,此间内部程序存储器。在FLASH 编程期间,此引脚也用于施加 12V 编程电源(VPP)。2 2、上电按钮复位电路、上电按钮复位电路本设计采用上电按钮复位电路:首先经过上电复位,当按下按键时,RST 直接与 VCC 相连,为高电平形成复位,同时电解电容被电路放电;按键松开时,VCC对电容充电,充电电流在电阻上,RST 依然为高电平,仍然是复位,充电完成后,电容相当于开路,RST 为低电平,单片机芯片正常工作。其中电阻 R2 决定了电容充电的时间,R2 越大则充电时间长,复位信号从 VCC 回落到 0V 的时间也长。3 3、晶振电路、晶振电路本设计晶振电路采用 12M 的晶振。晶振的作用是给单片机正常工作提供稳定的时钟信号。单片机的晶振并不是只能用 12M,只要不超过20M 就行,在准许的范围内,晶振越大,单片机运行越快,还有用12M 的就是好算时间,因为一个机器周期为 1/12 时钟周期,所以这样用 12M 的话,一个时钟周期为 12us,那么定时器计一次数就是 1us 了,电容范围在 20-40pF 之间,这里连接的是 30pF 的电容。机器周期=10*晶振周期=12*系统时钟周期4.4.下载端口下载端口设计用到的 STC89C52 单片机芯片的 ISP 下载线是通过单片机的 TXD,RXD引脚把程序烧进去的。管脚 TXD 和 RXD 用于异步串行通信。其实 STC89C52 单片机的 ISP 下载线就是一个 max232 芯片连接 STC 和计算机的串行通信口。计算机把程序从九针串口送到 max232 芯片,电平转换后送进单片机的串行口,也就是TXD 和 RXD。然后单片机的串行模块把数据送到程序区。5 5、显示电路、显示电路就时钟而言,通常可采用液晶显示或数码管显示。由于一般的段式液晶屏,需要专门的驱动电路,而且液晶显示作为一种被动显示,可视性相对较差;对于具有驱动电路和微处理器接口的液晶显示模块(字符或点阵),一般多采用并行接口,对微处理器的接口要求较高,占用资源多。另外,89C2051本身无专门的液晶驱动接口,因此,本时钟采用数码管显示方式。数码管作为一种主动显示器件,具有亮度高、价格便宜等优点,而且市场上也有专门的时钟显示组合数码管。对于实时时钟而言,显示显然是另一个重要的环节。通常LED 显示有两种方式:动态显示和静态显示。静态显示的优点是程序简单、显示亮度有保证、单片机 CPU 的开销小,节约 CPU 的工作时间。但占有 I/O 口线多,每一个 LED 都要占有一个 I/O 口,硬件开销大,电路复杂。需要几个LED 就必须占有几个并行口,比较适用于LED 数量较少的场合。当然当 LED 数量较多的时候,可以使用单片机的串行口通过移位寄存器的方式加以解决,但程序编写比较麻烦。LED 动态显示硬件连接简单,但动态扫描的显示方式需要占有 CPU 较多的时间,在单片机没有太多实时测控任务的情况下可以采用。本系统需要采用 6 位 LED 数码管来分别显示时、分、秒,因数码管个数较多,故本系统选择动态显示方式。6 6、时钟显示校正电路、时钟显示校正电路本设计利用按键开关来校正时钟显示的数字。当按钮按下时,将在相应的端口输入一个低电平,通过相应的程序来改变时钟显示。其中 S1 按键开关用来选择要修改的数字;S2 按键用来增加所选数字的数值;S3 按键用来减少所选数字的数值。7 7、蜂鸣器电路、蜂鸣器电路电路接法:三极管选定 PNP 型,基极 B 连接 5V 电压,发射极 E 连接一个 1K 左右的电阻后接 I/O 口,集电极 C 连接蜂鸣器后接地。单片机在复位后的个 I/O 口是高电平,此时三极管是截止的,编写程序使选定的I/O 为低电平,此时三极管导通,导通后蜂鸣器与电源正极连通,构成一个工作回路,从而发出滴滴的响声。其中电阻 R1 在电路里起分压限流的作用,PNP 三极管起到模拟开关的作用。8 8、外接电源电路、外接电源电路外接电源电路用于连接外部 5V 电源与电子时钟电路,通过自锁开关控制电路的导通与断开,当开关闭合时,电路导通,外部电源给电路正常供电,电子时钟正常工作。当开关断开时,电路停止工作。9 9、总电路原理图、总电路原理图(五)软件部分根据上述电子时钟的工作流程,软件设计可分为以下几个功能模块:(1)主程序模块。主程序主要用于系统初始化:设置计时缓冲区的位置及初值,设置 8155 的工作方式、定时器的工作方式和计数初值等参数。主程序流程如下图所示。开始定义堆栈区8155、T0、数据缓冲区、标志位初始化调用键盘扫描程序否是 C/R 键?是地址指针指向计时缓冲区调用时间设置程序主程序流程图主程序流程图(2)计时模块。即定时器0 中断子程序,完成刷新计时缓冲区的功能。系统使用 6MHz 的晶振,假设定时器 0 工作在方式 1,则定时器的最大定时时间为 65.536ms,这个值远远小于 1s。因此本系统采用定时器与软件循环相结合的定时方法。设定时器 0 工作在方式 1,每隔 50ms 溢出中断一次,则循环中断 20 次延时时间是 1s,上述过程重复 60 次为 1 分,分计时 60 次为 1 小时,小时计时 24 次则时间重新回到 00:00:00。因定时器 0 工作在方式 1,则 50ms 定时对应的定时器初值为:6553650ms/2us=40536=9E58H,即 TH0=9EH,TH0=58H。但应当指出:CPU 从响应 T0 中断到完成定时器初值重装这段时间,定时器 T0 并不停止工作,而是继续计数。因此,为了确保 T0 能准确定时 50ms,重装的定时器初值必须加以修正,修正的定时器初值必须考虑到从原定时器初值中扣除计数器多计的脉冲个数。由于定时器计数脉冲的周期恰好和机器周期吻合,因此修正量等于 CPU 从响应中断到重装完 TL0 为止所用的机器周期数。CPU 响应中断通常要 38 个机器周期。经过测试,定时器 0 重装的计数初值设为 9E5FH9E67H,可以满足精度要求。另外,MCS-51 单片机只有二进制加法指令,而时间是按十进制递增,因此用加法指令后必须进行二-十进制转换。计时模块流程图如下图所示。保护现场重装定时器初值循环次数减 1否满 20 次?是秒单元加 1否60s 到?是秒单元清 0,分单元加 1否60 分到?是分单元清 0,时单元加 1否24 小时到?是时单元清 0恢复现场返回计时模块流程图计时模块流程图(3)时间设置模块。该模块由键盘输入相应的数据来设置当前时间。程序通过调用一个键盘设置子程序通过键盘扫描将键入的6位时间值送入显示缓冲区。设置时间后,时钟要从这个时间开始计时,而时分秒单元各占一个字节,键盘占 6 个字节。因此程序中要调用一个合字子程序将显示缓冲区中的 6 位BCD 码合并为 3 位压缩 BCD 码,并送入计时缓冲区,作为当前计时起始时间。该程序同时要检测输入时间值的合法性,若键盘输入的小时值大于 23,分、秒值大于 59,则不合法,将取消本次设置,清零重新开始计时。时间设置和键盘设置子程序的流程图如下图所示。保护现场调用键盘设置子程序 KETIN调用合字子程序 COMB恢复现场返回时间设置流程图时间设置流程图保护现场显示缓冲区首地址送 R0 键盘输入次数送 R7调用键盘扫描程序 KEYSCAN键号送R0显示缓冲区地址加 1循环次数减 1否循环结束?是恢复现场返回键盘设置子程序流程图键盘设置子程序流程图(4)显示模块。该模块完成时分秒 6 位 LED 的动态显示。因为显示为 6位,二计时是 3 个字节单元,为此,必须将3 字节计时缓冲区中的时分秒压缩 BCD 码拆分为 6 字节 BCD 码,并送入显示缓冲区中。当按下调整时间键后,在6 位设置完成之前,这6 个 LED 应该显示键人的数据,不显示当前的时间。为此,我们设置了一个计时显示允许标志位 F0,在时间设置期间 F0=1,不调用刷新显示缓冲区的子程序。显示程序流程图如下图所示。保护现场否允许显示?调用拆字程序是动态扫描显示返回显示程序流程图显示程序流程图扫描键盘否调用显示程序有键按下?是调用显示程序否有键按下?是求取键号返回键盘扫描程序流程图键盘扫描程序流程图程序:ORG 0000HAJMP MAINORG 000BHAJMP TIMEORG 0300HMAIN:mov 20h,#00hMOV 21H,#00HMOV 22H,#00HMOV 23H,#00HMOV IP,#02H;IP,IE 初始化MOV IE,#82HMOV TMOD,#01H;设定定时器工作方式?MOV TL0,#0B0HMOV TH0,#3CHSETB TR0;启动定时?MOV SP,#40H;重设堆栈指针NEXT:LCALL DISP;调用显示子程序?LCALL KEY;调用按键检测子程序JZ NEXT;LCALL ANKEY;调用按键处理子程序SJMP NEXT;重新循环NOPNOPNOP;定时中断处理程序:TIME:PUSH ACC;保护现场PUSH PSWMOV TL0,#0B4H;赋定时初值MOV TH0,#3CHINC 20H;MOV A,20HCJNE A,#20,RETI1MOV 20H,#00H;一秒钟时间到MOV A,21HADD A,#01HDA AMOV 21H,ACJNE A,#60H,RETI1MOV 21H,#00H;一分钟时间到MOV A,22HADD A,#01HDA AMOV 22H,ACJNE A,#60H,RETI1MOV 22H,#00H;一小时时间到MOV A,23HADD A,#01HDA AMOV 23H,ACJNE A,#24H,RETI1MOV 23H,#00H;到时间达到 24 小时,清零.RETI1:POP PSW;恢复现场POP ACCRETI;中断返回?NOPNOP;显示子程序DISP:ANL 2FH,#10H;处理小数点MOV A,21H;处理秒 21H-2DH,2EHANL A,#0FHORL A,2FHMOV 2FH,AMOV A,21HANL A,#0F0HSWAP AMOV 2EH,AANL 2DH,#10HMOV A,22H;处理分钟 22H-2CH,2DHANL A,#0FHORL A,2DHMOV 2DH,AMOV A,22HANL A,#0F0HSWAP AMOV 2CH,AANL 2BH,#10HMOV A,23H;处理小时 23H-2AH,2BHANL A,#0FHORL A,2BHMOV 2BH,AMOV A,23HANL A,#0F0HSWAP AMOV 2AH,AMOV R0,#2FH;显示偏移量MOV R3,#06HMOV DPTR,#TABLEMOV A,#0BFHLOOP1:MOV B,A;MOV P2,aMOV A,R0MOVC A,A+DPTRMOV P0,a;送显示MOV R2,#80H;延时DJNZ R2,$DEC R0MOV A,BRR ADJNZ R3,LOOP1;循环显示RETTABLE:db 28h,7eh,0a2h,62h,74h,61h,21h;不带小数点DB 7ah,20h,60h,00,00,00,00,00,00DB 8H,5eH,82H,42H,54H,41H,1H,5aH;带小数点DB 00H,40H,00,00,00,00,00,00NOPNOP;按键判断程序KEY:MOV P3,#0FFH;MOV A,P3CPL AANL A,#3CHJZ RETX;无键按下则返回LCALL DISP;LCALL DISPMOV A,P3CPL AANL A,#3CHJZ RETX;键盘去抖动。MOV R6,A;将键值存入 R6。LOOP2:LCALL DISP;MOV A,P3CPL AANL A,#3CHJNZ LOOP2;等待键释放MOV A,R6RETX:RETNOPNOP;按键处理子程序ANKEY:CLR EA;关中断LX:MOV A,R6JB ACC.2,L1;是功能键转 L1JB ACC.3,L2;是确认键转 L2JB ACC.4,L3;是减 1 键转 L3JNB ACC.5,L12;不是增 1 键,转 L12JB 2BH.4,L6;判断使哪一位(时、分、秒)的值加 1JB 2DH.4,L8JB 2FH.4,L9L12:LCALL DISPLCALL DISPLCALL KEY;判断有无键按下。JZ L12LJMP LXL2:MOV 25H,#00H;确认键处理程序CLR 2BH.4CLR 2DH.4CLR 2FH.4SETB EARETL3:JB 2BH.4,L61;增一键处理程序JB 2DH.4,L81JB 2FH.4,L91AJMP L12L1:MOV A,25H;功能键处理程序JZ LB1JB ACC.0,LB2JB ACC.1,LB3JNB ACC.2,L12LB1:MOV 25H,#01H;25H 单元是标志位,(25H)=01H 调节时单元的值SETB 2BH.4CLR 2DH.4CLR 2FH.4AJMP L12LB3:MOV 25H,#04H;25H 单元是标志位,(25H)=01H 调节秒单元的值SETB 2FH.4CLR 2DH.4CLR 2BH.4AJMP L12LB2:MOV 25H,#02H;25H 单元是标志位,(25H)=01H 调节分单元的值SETB 2DH.4CLR 2BH.4CLR 2FH.4AJMP L12L61:AJMP L611;L81:AJMP L811;L91:AJMP L911L6:MOV A,23H;时加一ADD A,#01HDA AMOV 23H,ACJNE A,#24H,L15L15:JC L112MOV 23H,#00HL112:AJMP L12L8:MOV A,22H;分加一ADD A,#01HDA AMOV 22H,ACJNE A,#60H,L16L16:JC L112MOV 22H,#00HAJMP L12L9:MOV A,21H;秒加一ADD A,#01HDA AMOV 21H,ACJNE A,#60H,L17L17:JC L112MOV 21H,#00HAJMP L12L611:MOV A,23H;时减一ADD A,#99HDA AMOV 23H,ACJNE A,#99H,L112MOV 23H,#23HAJMP L12L811:MOV A,22H;分减一ADD A,#99HDA AMOV 22H,ACJNE A,#99H,L112MOV 22H,#59HAJMP L12L911:MOV A,21H;秒减一ADD A,#99HDA AMOV 21H,ACJNE A,#99H,L112MOV 21H,#59HAJMP L12NOPNOPEND四、四、设计总结设计总结做了两周的课程设计,有很多的心得体会,有关于单片机的,也有关于模电数电等基础科目的。因为单片机已经很久没复习,刚拿到题目,不知道从哪入手,后来通过对书本的回顾,加深了对单片机的记忆。有些知识会迁移和联系模电数电。课堂教学考虑到大多数同学的需求,主要强调“基本”基本知识、基本理论、基本方法、基本技能。而这次设计正是为我们提供了一个深入学习、探索的机会,成为课堂教学的有益补充。我们正面临就业问题,这次课设给了我们一个机会去试验。单片机理论的学习是为课程的设计作准备的,但有时学习的理论也解决不了实践中的问题。实践中获得的知识能让我对单片机的知识有更好的认识和理解。虽然这次的课程设计我参考了一些文献资料,没有做到创新,但在对程序的读写过程中我明白了许多。这次课程设计的最大收获是只有把理论用到实践中我们才能真正掌握好所学知识。五、参考文献五、参考文献1 谢自美 电子线路设计 实验 测试M 武汉:华中理工大学出版社,1992.2 何立民单片机应用系统设计M北京:北京航空航天大学出版社,1993.3 楼然笛单片机开发M北京:人民邮电出版社,1994.4 付家才单片机控制工程实践技术M北京:化学工业出版社 2004.3.5 李光才单片机课程设计实例指导M北京:北京航空航天大学出版社2004.6 朱定华单片机原理及接口技术实验M北京:北方交通大学出版社2002.11.7 刘湘涛江世明单片机原理与应用M.北京:电子工业出版社,2006.