




已阅读5页,还剩29页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第一章 绪论1.1 MCS-51发展状况单片机于1976年由Intel公司推出MCS-48开始,迄今已有二十多年了。由于单片机集成度高、功能强、可靠性高、体积小、功耗低、使用方便、价格低廉等一系列优点,目前已经渗入到人们工作的方方面面,几乎“无所不在,无所不为”单片机的应用领域已从面向工业控制、通讯、交通、智能仪表等迅速发展到家用消费品、办公自动化、汽车电子、PC机外围以及网络通讯等广大领域。单片机有两种基本结构形式:一种是在通用微型计算机中广泛采用的,将程序存储器和数据存储器合用一个存储器空间的结构,成为普林斯顿结构。另一种是将程序存储器和数据存储器截然分开,分别寻址的结构,一般需要较大的程序存储器,目前采用程序存储器和数据存储器截然分开的结构为多。本文讨论的单片机多功能定时器的核心是目前应用极为广泛的51系列单片机,配置了外围设备,构成了一个可编程的计时定时系统,具有体积小,可靠性高,功能强等特点。不仅满足所需要求而且还有很多的功能可供开发,有着广泛的应用领域MCS-51系列单片机是美国Inter公司在1980年推出的高新能8位单片机,它包含51和52 两个子系列。对于51子系列,主要有8031、8051、8751三种机型,它们的指令系统和芯片引脚完全兼容,仅片内程序存储器有所不同,8031芯片不带ROM,8051芯片带4KB的ROM,8751芯片带4KB的EPROM。对于52子系列,有8032、8052、8752 三种机型。52子系列与51子系列大部分相同,不同之处在于:52子系列的片内数据存储器曾至256B;8032芯片不带ROM,8052带8KB的ROM,8752芯片带8KB的EPROM;有3个16位定时器/计数器,6个中断源。1.2 研究的主要内容目前市面上的数字时钟种类繁多,有可爱型的,有带计算型的,有数码管显示的,有液晶显示的等等。(1)本设计为巩固所学知识,对单片机的功用和软件编程进行更深入的学习。(2)修改时间功能:a 要求键入“A”键,停止计时(显示时间不变)。 b 然后依次从键盘上输入小时十位、小时个位、分十位、分个位、秒十位、秒个位(键入数字时显示器上要同步显示出修改的时间值),秒个位一旦键入完毕则立即恢复计时。(3)设定闹钟功能:要求按“B”键一次,显示以前设定的闹钟时间,如果再按“B”键一次则跳过闹钟时间的设定,恢复计时显示。当闹钟时间到了,就响起闹铃。(4)绘制电路原理图。(5)绘制主要程序流程图。1.3时钟工作原理 设计中的电子时钟的定时计数是利用了单片机内部的定时/计数器,通过对定时/计数器工作方式寄存器和控制寄存器的选取,对定时/计数器的初始值进行计算和编写,从而使其具有了简单的计时能力。在设定了计时单元后,通过中断软件的编写,对计时单元进行无数次重复利用。有计数器对中断次数进行计数和进位,再通过接口电路将其依次显示出来。MCS-51 单片机有两个16位的定时计数器T0和T1,当工作在定时方式时,计数脉冲来自单片机内部,振荡器信号12分频后做计数脉冲,美国机器周期的时间使计数器加一,由于计数脉冲的频率是固定的(即每个脉冲为1个机器周期的时间),故可通过设定计数初值来实现定时功能。如果要实现定时100,当晶振为6MHz时,每个机器周期为2,让T0计50个数后溢出,产生中断告诉CPU定时,100时间到。本实验定时器每100中断一次,在中断服务程序中,对中断次数进行计数,100计数1000次就是1s然后再对秒计数得到分和小时值,并送入显示缓冲区,最后用LCD液晶示出来。第二章 设计要求与方案论证2.1 设计要求本设计为巩固所学知识,对单片机的功用和软件编程进行更深入的学习,对本次设计的电子时钟提出了以下要求。(1)具有修改时间功能: a 要求键入“A”键,停止计时(显示时间不变)。 b 然后依次从键盘上输入小时十位、小时个位、分十位、分个位、秒十位、秒个位(键入数字时显示器上要同步显示出修改的时间值),秒个位一旦键入完毕则立即恢复计时。 (2)设定闹钟功能:要求按“B”键一次,显示以前设定的闹钟时间,如果再按“B”键一次则跳过闹钟时间的设定,恢复计时显示。当闹钟时间到了,就响起闹铃。(3)合理绘制电路原理图。(4)绘制主要程序流程图。(5)合理编辑程序。2.2 方案论证设计的电子时钟是利用8051单片机内部的晶振产生振荡,每秒频率为12MHZ,其精度稳定,不受外界温度和湿度的影响,但是会有如下问题出现:(1)外界复杂的电磁环境,会影响到单片机信号的输入、输出,而且单片机内部运行的机械周期也会使电子时钟的精度受到影响。方案:在电子时钟外壳内装备较薄的金属薄片,屏蔽外部电磁干扰。(2)由于芯片执行程序需要一定的时间,从而使定时计数产生误差。定时计数再未进行初始化的时候,处于原始状态,不能进行定时和计数,所以需要对定时计数器里的初始值进行计算和调整,并且选定合适的工作方式。 方案:通过与日常生活中常用的时钟比较,找出产生误差的原因,计算误差的大小,通过对程序的调整和初始值得设定,减小误差,使之达到使用精度。(3)需随时对时间进行调整,要求设置键盘,并对键盘输入的稳定性进行调整。方案:采用列式键盘,按键数为4,编辑去抖动程序。(4)要求对时间进行动态显示,精确到秒。方案:采用LCD液晶显示器进行动态显示。(5)接线复杂,易出现错接误接。方案:采用电路板进行连接第三章 总体方案确定与实现3.1 电子时钟电路设计框图 图3.1-13.2 系统硬件该电路是由MCS8051单片机为控制核心,具有在线编程功能,低功耗,能在3V超低压工作;时钟电路也由MCS8051单片机提供,减少芯片的使用,节约成本,它可以对年、月、日、周、日、时、分、秒进行计时,时间显示部份采用液晶LM016L(LCD),此次单片机数字时钟的设计采用MCS8051为主控制芯片,并由其定时器提供时钟,利用LCD进行时间按显示。其电路原理图如下所示: 图3.2-13.3软件方案进行应用软件设计时采用模块化程序设计方法,其优点是:(1)每个模块程序机构简单,任务明确,易于编写,调试和修改。(2)程序可读性好,对程序的修改可局部进行,其他部分可保持不变,便于功能的扩充和版本升级。(3)对于使用频繁的子程序可以建立子程序库,便于多模块调用。(4)便于分工合作,多个程序员同时进行程序的编写和调试工作,加快软件研制进度。该程序可划分为7个模块:主程序,LCD显示模块,当前时间计时模块,输入闹钟模块,当前时间调整模块,音频报警模块,数据转坏模块。第四章 硬件设计4.1 LCD显示模块在实际应用中,用户很少直接设计LCD显示器驱动接口,一般是直接使用专用的LCD显示驱动器和LCD显示模块。其中,LCD显示模块LCM(LiquidCrystalDisplayModule)是把LCD显示器、背景光源、线路板和驱动集成电路等部件构成一个整体,作为一个独立的部件使用,具有功能较强、易于控制、接口简单等优点,在单片机系统中应用较多。其内部结构如图4.1-1所示。LCD显示模块只留一个接口与外部通信。显示模块通过这个接口接收显示命令和数据,并按指令和数据的要求进行显示。外部电路通过这个接口读出显示模块的工作状态和显示数据。LCD显示模块一般带有内部显示RAM和字符发生器,只要输入ASCII码就可以进行显示。LCD显示模块按功能显示可分为:LCD段式显示模块、LCD字符型显示模块、LCD图形显示块三类。液晶显示器因其功耗低、重量轻而成为便携式应用中的主流显示技术。这里所用的字符型液晶模块是一种用5x7点阵图形来显示字符的液晶显示器,根据显示的容量可以分为1行16个字、2行16个字、2行20个字等等。液晶显示有点振式和字符式两种,在这里采用字符式液晶显示器1602来实现显示电路的功能。该设计采用液晶显示装置即把时钟信号以及温度信号同时显示在液晶显示器上,不仅结构简单清新可见,而且省电也容易控制。数据的传输采用P0口进行控制, 其引脚VSS接地,VEE接VCC,RS和RW、E是显示器的控制端分别由单片机的引脚P1.0、P1.1、P1.3进行控制。而VDD是作为液晶显示器的灰度调节引脚,接一变阻器来改变其显示的清晰度。图4.1-1 LM016L液晶显示器LCD驱动器LCD显示器LCD控制器VSSVDDVEERSR/WED0-D7图4.1-2LCD显示电路由于1602液晶显示器是本身带有驱动模块的液晶屏,它只有并口线和一些控制线,与单片机的连接有两种不同的方法,直接访问方式和间接访问方式。直接访问方式就是微处理器把液晶显示模块当作存储器或I/O设备直接挂在总线上,模块8位数据总线与微处理器的数据总线相连,用读操作或写操作信号与地址信号共同产生控制信号。4.2 CPU 80518051是ROM型16位单片机,共有40个引脚。内含4K字节的ROM。其主要组成如下:(1) 面向控制的8位CPU和指令系统。(2) 4K字节的程序存储器(ROM或EPROM)。(3) 128字节的数据存储器。(4) 可编程的并行I/O口P0P3,有32位双向输入/输出线。(5) 一个全双工串行口。(6) 两个16位定时器/计数器。(7) 五个中断源,两个优先级中断机构。(8) 一个片内时钟振荡器和时钟电路。(9) 可寻址的64K字节的程序存储器和64K字节的外部数据存储器。MCS-51 的片外三总线结构:(1) 地址总线AB:地址总线的宽度为16位,因此外部存储器直接寻址为64K字节。16位地址总线中,由P0口经地址锁存器提供低8位地址A0A7:P2口直接提供高8位地址A8 A15。(2) 数据总线:数据总线宽度为8位,由P0口提供D0D7。(3) 控制总线CB:由P3口的第二功能状态和4根独立控制线REST,/EA,ALE,和/PSEN组成。 其芯片结构如图4.2-2所示 图4.2-24.3 引脚功能Vcc(40):电源电压 GND(20):接地P0口(32-39):P0口是一个8位双向I/O接口,也即地址/数据总线复用口。作为输出口用时,每位吸收电流的方式驱动8个TTL逻辑门电路,对端口P0写“1”时,可作为高阻抗输入端用。在访问外部数据存储器时,这组口线分时转换地址(低8位)和数据总线复用。P1口(1-8):P1是一个带内部上拉电阻的8位双向I/O口,P1的输出缓冲级可驱动(吸收或输出电流)4个TTL逻辑门电路,对端口写“1”通过内部的上拉电阻把端口拉到高电平时,此时可作输入口。作为输入品使用时,因为内部存在上拉电阻,某个引脚被外部信号拉低时会输出一个电流。与AT89C51不同之处是,P1.0和P1.1还可以分别作为定时/计数器2的外部计数输入(P1.0/T2)和输入(P1.1/T2EX)。P2口(21-28):P2是一个带有内部上拉电阻的8位双向I/O口,P2的输出缓冲级可驱动(吸收或输出电流)4个TTL逻辑门电路,对端口P2写“1”,通过内部的上拉电阻把端口拉到高电平时,此时可作输入口。作为输入品使用时,因为内部存在上拉电阻,某个引脚被外部信号拉低时会输出一个电流。在访问外部程序存储器或16位地址的外部数据存储器(例如执行MOVX DPTR 指令)时,P2口送出高8位地址数据。在访问8位地址的外部数据存储器时,P2口输出P2锁存器的内容。P3口(10-17):P3是一组带有内部上拉电阻的8位双向I/O口,P3口输出缓冲级可驱动(吸收或输出电流)4个TTL逻辑门电路,对端口P3写“1”时,它们被内部上拉电阻拉高并可作为输入端口,此时,被外部拉低的P3口将用上拉电阻输出电流。P3口除了作为一般的I/O口线外,更重要的用途是它的第二功能,如下表所示:端口引脚第二功能P3.0RXD(串行输入口)P3.1TXD(串行输出口)P3.2INT0(外中断0)P3.3INT1(外中断1)P3.4T0(定时/计数器0)P3.5T1(定时/计数器1)P3.6WR(外部数据存储器写通道)P3.7RD(外部数据存储器读通道)表 3-1 P3口的第二功能RST(9):复位信号输入端。当振荡器工作时,RST引脚出现两个机器周期以上高电平将使单片机复位。ALE/PROG(30):地址锁存有效信号输出端。当访问片外程序存储器或数据存储器时,ALE(地址锁存允许)输出脉冲用于锁存地址的低8位字节,一般情况下,ALE仍以时钟振荡频率的1/6输出固定的脉冲信号,因此它可对外输出时钟或用于定时目的,要注意的是:每当访问外部数据存储器时将跳过一个ALE脉冲。PSEN(29):程序存储允许输出端。是片外程序存储器的读选通信号,当AT89C52由外部程序存储器取指令(或数据)时,每个周期两次PSEN有效,即输出两个脉冲。在此期间,当访问外部数据存储器,将跳过两次PSEN信号。EA/VPP(31):外部访问允许。欲使CPU仅访问外部程序存储器(地址为0000HFFFFH),EA端必须保持低电平(接地),需注意的是:如果加密位LB1被编程,复位时内部会锁EA端状态。如EA端为高电平(接Vcc端),CPU则执行内部程序存储器中的指令。Flash存储器编程时,该引脚加上+12V的编程允许电源Vpp,当然这必须是该器件是使用12V编程电压Vpp。XTAL1(19):振荡器反相放大器的及内部时钟发生器的输入端。XTAL1(18):振荡器反相放大器的输出端。通过XTAL1、XTAL2外接晶振后,即可构成自激振荡器,驱动内部时钟发生器向主机提供时钟信号。4.4键盘模块采用矩阵式14键盘,其行接8051的P1口,列接8051P3口,如图所示: 图3.3-1键盘扫描:(1) 确定是否有键按下。(2) 当有键按下时,则对键进行键译码,找出按下的是那个键;当无键按下时,即返回。(3) 当按下的是数字键,则送显示缓冲单元;当按下的是功能键,即转到对应的键服务程序。(4) 去抖动:按键从开启到闭合稳定,或从闭合到完全打开,总要有数毫秒的弹跳时间(即抖动)。弹跳将引起按一次键被多次输入的误动作。为此,在键盘处理程序中,必须设法去掉抖动。可以用硬件去抖动的方法,也可以采用硬件去抖动。第五章 软件设计 5.1程序流程图 图5.1-1 5.2 初始值计算以毫秒为基本计数单元,采用方式0,定时器1,其计算过程如下:因为方式0采用13位计数器,8051的时钟频率为f=12MHZ,计数周期为1us,所以其最大定时时间为8192us,选择定时时间为5ms,再循环200次,即得到1S延时。 计数值为5ms/1us=5000 则定时器1的初值为 C=M-计数值=8192-5000=3192=C78H采用方式0故TMOD=00H5.3主程序设计MAIN: MOV SP,#30H MOV DPTR,#0E100H MOV A,#03H MOVX DPTR,A MOV TCON,#0 MOV IP,#02H MOV IE,8AH MOV TMOD,#21H MOV TH0,#3CH MOV TL0,0B0H MOV R4,#10 ;设置定时器T0的走秒用计数器 MOV 71H,#0 MOV 72H,#0 MOV 73H,#00H MOV 74H,00H MOV CLKBCD,#0 MOV CLKBCD+1,#0 MOV CLKBCD+2,#0 MOV CLKBCD+3,#0 MOV CLKBCD+4,#0 MOV CLKBCD+5,#0SETB TR0 ;启动计数走秒REPDISP; MOV R5,#3 ;将计时值存放区的计时值拆分并存入计时值的BCD数据存放区为显示时间值做好准备 MOV RO,#70H MOV R1,#CLKBCD CLR TRO ;暂停计数,以防出现显示错误CHAIREPI: LCALL CHAI ;开始拆分转存 DJNZ R5,CHAIREPI MOV A,TL0 ADD A,#31H MOV TL0,A ADDC A,#0 MOV TH0,A SETB TR0 ;IT;再次启动计数走秒 LCALL STARTDISPLAY ;显示时间值 LCALL TESTKEY ;有键入吗? JZ AL ;没有键入则跳转到ALARM SJMP NOAL ;有键入则读入键码 AL: LJMP AI NOAL: LCALL GETKEY ;有键入则读入键码 CJNZ A,#0AH,BKEY ;是A键吗?不是则跳转到BKEY CLR TRO ;是“A”键则暂停计数走秒 MOV TH0,#3CH MOV TL0,#0B0H MOV R1,#60H MOV R5,#2 LCALL SETTIME ;继续检测有无键时间修正值“02”键?(时十位) MOV A,60H CJNZ A,#2,NINE MOV R5,#3 SJMP THREE NINE: MOV R5,#9 THREE: LCALL SETTIME ;继续检测有无键时间修正值“03”或“09”键?(时个位) MOV R5,#5 LCALL SETTIME ;继续检测有无键时间修正值“05”键?(分十位) MOV R5,#9 LCALL SETTIME ;继续检测有无键时间修正值“05”键?(分个位) MOV R5,#5 LCALL STETIME ;继续检测有无键时间修正值“05”键?(秒十位) MOV R5,#9 LCALL SETTIME ;继续检测有无键时间修正值“05”键?(秒个位) MOV R5,#3 将修正值存入7072H MOV RO,#60H MOV R1,#70HHEREP: LCALL HE DJNZ R5,HEREP SETB TR0 ;恢复计数走秒 LJMP A1 BEKY:CJNE A,#0BH,AL ;不是“B”键则跳转到ALARM,是“B”键则显示先前设定的闹钟时间 MOV 60H,#0B0H MOV 61H,#10H MOV R5,#2MOV R0,#73H ;显示先前设定的闹钟时间MOV R1,#62H CHAIREP: LCALL CHAI DJNZ R5,CHAIREP BEKY: LCALL STARTDISPLAYLCALL TESTKEY ;继续检测有无键入JZ BKEY1 ;没有键入则继续显示LCALL GERTKEY ;有键入则读入键码CJNE A,#0BH,BKEY2 ;如果再次键入“B”键则跳过设定闹钟值间的程序段SJMP ENDBKEYBKEY2: CJNE A,#2,JJ1MOV 62H,ASJMP JJ3 JJ1: JNC JJ2 MOV 62H,A SJMP JJ3 JJ2: MOV R1,#62H MOV R5,#2 ;如果既不是“B”键又不是“02”之间的键,则等待键入“02”之间的键 LCALL SETTIME JJ3: MOV R1,#63HMOV A,62H ;继续检测是否为闹钟时间值“09”或“03”键(时个位)CJNE A,#2,NINE1MOV R5,#3SJMP THREE1 NINE1: MOV R5,#9HTHREE1: LCALL SETTIME ;继续检测是否为闹钟时间值“09”或“03”键?(时个位) MOV R5,#5LCALL SETTIME ;继续检测是否为闹钟时间值“05”键?(分十位)MOV R5,#2 ;将设定的闹钟时间值存入73H、74H单元MOV R0,#62HMOV R1,#73H HEREP1: LCALL HE DJNZ R5,HEREP1 BKEY3: LCALL STARTDISPLAYLCALL TESTKEY ;继续检测有无键入“B”键,以便结束闹钟时间设定JZ BKEY3LCALL GETKEYCJNE A,#0BH,BKEY3 ;不是“B”键则继续显示刚才设定的闹钟时间 ENDBKEY: NOP A1: MOV R2,74HCJNE R2,#ALARM ;判断是否有闹钟时间MOV R2,73HCJNE R2,#0,ALARMLJMP ALARM1 A1ARM: MOV A,70HCJNE A,73H,NOA1ARM ;判断是否到了闹铃时间MOV A,71HCJNE A,74H,NOA1ARMLCALL MUSICSJMP A1ARMI NOA1ARM: CLR TR1 A1ARM: LJMP REPDISP注:定时器初始化,将定时器控制寄存器TCON置为0,设置定时器方式寄存器TMON为21H(#00100001B)即定时器0为方式1,定时器1为方式2.T0作为走秒定时器,T1作为闹钟定时器。100Ms的计数初值为3CB0H,TH0=3CH,TL0=0B0H,将计时值存放区70H72H放入初始值0,将闹钟时间存放区73H74H放入初始值0 ,将计时值BCD数据存放区置初始值0,启动定时器T0,将70H小时存放区拆成时十位和时个位送给计时值BCD数据存放区,之后存入70H,将64H,65H合并后存入72H,恢复计数走秒。调用A1判断是否有闹铃时间。A为键码与0BH比较,判断是否为B键,不是B键跳转到A1,是B键显示先前设定的闹铃时间。 5.4子程序设计5.4.1键盘扫描程序设计 TESTKEY: MOV DPTR,#OUTBIT MOV A,#0MOVX DPTR,A ;输出线置为0MOV DPTR,#INMOVX A,DPTR ;读入键状态CPI AANL A,#0FH ;高四位不用RETKEYTABLE: ;数字键码定义 DB 00H,01H,04H,07HDB 0FH,02H,05H,08HDB 0CH,03H,06H,09HDB 0DH,OCH,0BH,0AHDB 10H,10H,10H,10H DB 10H,10H,10H,10HGETKEY: MOV DPTR,#OUTBITMOV P2,DPHMOV R0,LOW(IN)MOV R1,#00100000BMOV R2,#6KLOOP: MOV A,R1 ;找出键所在列CPL AMOVX DPTR,ACPL AMOV R1,A ;下一列MOVX A,R0CPL AANL A,#0FHJNZ GOON1 ;该列有键入DJNZ R2,KLOOPMOV R2,#0FFH ;没有键按下,返回0FFHSJMP EXITGOON1: MOV R1,A ;键值=列4+行MOV A,R2DCC AR1 AMOV R2,A ;R2=(R2-1)4MOV A,R1 ;R1中为读入的行值MOV R1,#4LOOPC:RRC A ;移位找出所在行JC EXITINC R2 ;R2=R2+行值DJNZ R1,LOOPCEXIT: MOV A,R2 ;取出键码MOV DPTR,#KEYTABLEMOVC A,A+DPTRMOV R2,AWAITRELEASE: MOV DPTR,#OUTBIT ;等键释放 CLR A MOVX DPTR,AMOV R6,#10CALL DELAYCALL TESTKEYJNZ WAITREICASCMOV A,R2RET5.4.2 时钟计时程序设计TORUN:DJNZ R4,BACKPUSH ACCPUSH 01HPUSH 00HSEC: MOV A,72HADD A,#1CJNE A,#5AH,SEC1MOV 72H,#0MOV 65H,#0SJMP MINSEC: CLR CDA AMOV 72H,AMOV R0,#72HMOV R1,#65HLCALL CHAI1SJMP BACK1MIN: MOV A,72HADD A,#1CJNE A,#5AH,MIN1MOV 71H,#0MOV 63H,#0MOV 62H,#0SJMP HOURMIN1: CLR CDA AMOV 71H,AMOV R0,#71HMOV R1,#63HLCALL CHAI1SJMP BACK1HOUR: MOV A,70HADD A,#1CJNE,#24H,HOUR1MOV 70H,#0MOV 61H,#0MOV 60H,#0SJMP BACK1HOUR1: CLR CDA AMOV 70H,AMOV R1,#61HLCALL CHAI1SJMP BACK1BACK1: POP 00HPOP 01HPOP ACCMOV R4,#10BACK: MOV TH0,#3CHMOV TL0,#0B0HRET5.4.3 数据转换程序设计HE: MOV A,R0 ;合并程序SWAP A INC R0ORL A,R0MOV R1,AINC R0INC R1RET CHAI: MOV A,RO ;拆字程序,目的地址增加ANL A,#0F0HSWAP A MOV R1,AINC R1MOV A,R0ANL A,#0FHMOV R1,AINC R0INC R1RET 5.4.4 时间设置程序设计SETTIME: PUSH 01h ;设置实践值SETTIME1: LCALL STARTDISPLAYLCALL TESTKEY ;检测有无键入时间修正值JZ SETTIME1 ;没有键入时间值继续显示LCALL GETTIME ;有键入则读入键码 POP 01HCJNE A,05H,J1MOV R1,ASJMP J2J1: JNC SETTIMEMOV R1,AJ2: INC R1RET 5.4.5 音乐闹铃程序设计 MUSIC: PUSH DPH PUSH DPLMOV TMOD,#11HMOV IE,#8AHSETB TR0LCALL STARTDISPLAYNO: MOV 30H,#00HNEXT: MOV DPTR,#FIRSTMOV A,30HMOVC A,A+DPTRMOV R2,ACJNZ A,00H,NEXT1CLR TR1POP DPLPOP DPHSETB TR0LCALL STARTDISPLAYRETNEXT: MOV A,R2ANL A,#0FHMOV R5,AMOV A,R2SWAP AANL A,#0FHMOV R5,AMOV A,R2SWAP AANL A,#0FHJNZ SINGCLR TR1SJMP D1SING: DEC ACLR CRL AMOV 22H,AMOV DPTR,#TABLEMOVC A,A+DPTRMOV THI,AMOV 21H,AMOV A,22HADD A,#1MOVC A,A+DPTRMOV TL1,AMOV 20H,A 取到低位字节MOV P1,ASETB ET1SETB TR1 启动定时器T1D1: LCALL DELAYCLR TR1INC 30HSJMP NEXTTISEV: PUSH ACC 保护现场PUSH PSWCLR TR1MOV TL1,20HMOV TH1,21HCPL P1.0POP PSWPOP ACCRETDELAY1: MOV R7,#3 D2: MOV R4,#250D3: MOV R3,#50HD4: MOV R3,D30DJNZ R4,D3DJNZ R7,D2DJNZ R5,DELAYRETFIRST:DB 81H,81H,93H,83H,0B3H,0A3H,03HDB 81H,81H,93H,83H,0C3H,0B3H,03HDB 81H,81H,0F3H,0D3H,0B3H,0A3H,93HDB 0E1H,0E1H,0D3H,0B3H,0C3H,0B3H,03HDB 12H,42H,01H,41H,42H,62H,52H,01H,41HDB 52H,62H,42H,01H,41H,62H,82H,94H,01H,DB 91H,91H,82H,01H,61H,62H,42H,52H,01HDB 41H,52H,62H,42H,01H,91H,22H,12H,44HDB 01H,92H,82H,61H,62H,42H,52H,01H,41HDB 42H,92H,82H,01H,61H,62H,82H,92H,01HDB 41H,82H,01H,62H,42H,00HTABLE:DB 0F6,6FH,0F7H,24H,0F8H,1BH,0F8,8FH DB 0F9H,5EH,0FAH,17H,0FAH,6BH,0FBH,08H DB 0FBH,92H,0FCH,0EH,0FCH,4BH,0FCH,0AFH DB 0FDH,0CH,0FDH,36H,0FDH,84H,0FDH,0C9H END讲解:定时器T1的中断服务子程序。先设置定时器方式寄存器,定时器T0和T1均采用方式0.将码表(FIRST)的首地址DPTR,将30H初值00送给A,MOVC A,A+DPTR,查表可得A为82H。判断歌曲是否唱完一遍,若唱完则清零TR0,重新开始唱(歌曲循环播放)若歌曲未唱完则跳转到ENXT1,将82H分割剥离,取低位02H作为节拍编码,取高位为08H作为音符编码,8-1=7,7*2=14给A,查表(TABLE)得相对应的计数初值的高位和低位,并将计数初值的低高为存入20H,21H。启动定时器T1,唱一个音,(30H)加1,跳转到NEXT,TISEV:将ACC,PSW进栈保护起来,从装计数初值,对P1.0取反,出栈恢复,启动TR1,中断返回。5.5各存储单元的功用 DAT164(0E102H): 段控制口(接164数据位,B口地址) IN(0E103H): 键盘输入口(C口地址) CLKBCD: 计时值的BCD数据存放区(60H65H) LEDBUF: 显示缓冲区(66H6BH) 70H: 计时值的小事存放单元 71H: 计时值的分钟存放单元 72H: 计时值的秒存放单元 73H: 闹钟小时存放单元 74H: 闹钟分钟存放单元 5.6 调试方法 设置断点,观察寄存器的值,跟踪相应的存储单元内容,还可以按下F4将程序指向光标处,不断地按下F7 单步执行或按下F6宏单步执行。本设计为实时I/O试验,因此软件调试一般用全速断点方式运行。将断点分别设在定时器中断入口地址上,中断处理程序结束处,主程序中。分别以全速断点运行方式开始运行,若能碰上断点,则说明程序的总体结构是正确的。5.7 误差分析时钟误差分析:启动定时器/计数去0,使之开始计时,中断后进入中断程序。自停止计数到计数又开始,中间执行了7条指令,也就是延迟13个单周期,共用时间26us。这样,每个中断的总时间应为5.026ms,而原来定时为5ms。所以,每次中断定时多了26us,这样,可改变计数重装值,使每次中断时间为4.974ms,加上执行7条指令所用的时间,正好5ms,计数两百次,刚好1s,这样就可以得到较精确的计时秒数,然后根据进率,得到时分的值。第六章 总结与展望6.1 总结本次设计中,数字时钟的秒
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 培训市场活动方案
- 地理绘图活动方案
- 外科宣传活动方案
- 大学茶协会活动方案
- 大学生舞林大会活动方案
- 夏季赣州团建活动方案
- 夏季商铺活动方案
- 在企业开展科普活动方案
- 地产橙子义卖活动方案
- 培智综合实践活动方案
- 历史●甘肃卷丨2024年甘肃省普通高中学业水平等级性考试高考历史真题试卷及答案
- 2024年杭州市临安区事业单位统一招聘真题
- C语言程序设计基础知到智慧树期末考试答案题库2025年石河子大学
- 党建考试试题及答案国企
- 小学图书馆面试题及答案
- 客运行业事故隐患内部报告奖励管理制度2025
- 快消品包装2025年可再生资源利用现状与前景报告
- 纵隔肿物护理
- 房屋建筑与市政工程重大事故安全隐患判定标准解读课件
- DB43-T 1267-2023 机动车检验机构建设和运行管理规范
- 公司税务注销协议书
评论
0/150
提交评论