本帖最后由 哇哇哇哇哇w 于 2019-11-23 09:19 编辑
一主要功能1)能显示:时时—分分。
2)能够设定定时时间、修改定时时间。3)定时时间到能发出提示声音。 4)提示声音发出后,若要用提示声音驱动某外围元件动作,可接在A1处 二本次设计的系统电路图如下 使用了AT89C51作为控制芯片,连接外围电路组成最小系统。P1口接五个按钮(S1—5)作为控制键输入,外接4位数码管显示时间,另外P3.7附加蜂鸣器作为定时闹钟铃响使用,同时,若要使闹钟信号驱动其他外设元件,可以与蜂鸣器下三极管的发射极相接。按键分为设置当前时间,设置定时时间键,小时加键键,分钟加键,退出键。 AT89C51是一个低电压,高性能CMOS型8位单片机,片内含4KB的可反复擦写的Flash只读程序存储器(ROM)和128B的随机存取数据存储器(RAM),器件采用ATMEL公司的高密度、非易失性存储技术生产,兼容标准MCS-51指令系统,片内置通用8位中央处理器和Flash存储单元,内置功能强大的微型计算机的AT89C51为用户提供了许多高性价比应用场合,可灵活应用于各种控制领域。 AT89C51是一个低功耗高性能单片机,40个引脚,32个外部双向输入/输出(I/O)端口,同时内含2个外中断口,2个16位可编程定时计数器,2个全双工串行通信口,AT89C51可以按照常规方法进行编程,也可以在线编程。其将通用的微处理器和Flash存储器结合在一起,特别是可反复擦写的Flash存储器可有效地降低开发成本。 主要特性: ·与MCS-51 兼容
·4K字节可编程闪烁存储器
·寿命:1000写/擦循环
·数据保留时间:10年
·全静态工作:0Hz-24Hz
·三级程序存储器锁定
·128×8位内部RAM
·32可编程I/O线
·两个16位定时器/计数器
·5个中断源
·可编程串行通道
·低功耗的闲置和掉电模式
·片内振荡器和时钟电路 引脚使用说明: 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口同时为闪烁编程和编程校验接收一些控制信号。 ST:复位输入。当振荡器复位器件时,要保持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)。 XTAL1:反向振荡放大器的输入及内部时钟工作电路的输入。 XTAL2:来自反向振荡器的输出。 振荡器特性: XTAL1和XTAL2分别为反向放大器的输入和输出。该反向放大器可以配置为片内振荡器。石晶振荡和陶瓷振荡均可采用。如采用外部时钟源驱动器件,XTAL2应不接。有余输入至内部时钟信号要通过一个二分频触发器,因此对外部时钟信号的脉宽无任何要求,但必须保证脉冲的高低电平要求的宽度
全部程序清单ORG 0000H LJMP MAIN ORG 000BH LJMP TIME
;×××××主程序部分:××××× ORG 0100H MAIN:MOV SP,#50H MOV 21H,#00H ;分钟 BIN MOV 22H,#00H ;小时 BIN MOV 23H,#01H MOV 24H,#01H MOV 25H,#00H MOV 30H,#00H MOV 31H,#00H MOV 32H,#00H MOV 33H,#00H MOV 34H,#00H MOV 35H,#00H MOV 36H,#01H MOV 37H,#00H MOV 38H,#01H MOV 39H,#00H MOV TMOD,#01H ;16位计数器 MOV TH0,#03CH ;赋计数初值 MOV TL0,#0B0H MOV IE,#10000111B SETB TR0 ;T0启动计数 MOV R2,#14H MOV P2,#0FFH LOOP: LCALL TIMEPRO LCALL DISPLAY1 JB P1.1,M1 LCALL SETTIME ;调用设定时间程序 LJMP LOOP M1:JB P1.2,M2 LCALL SETATIME ;调用设定时间程序 LJMP LOOP M2:JB P1.4,M4 LCALL LOOKATIME ;调用设定闹钟时间程序 M4:LJMP LOOP DELAY:MOV R4,#030H ;延时时间 DL00:MOV R5,#0FFH DL11:MOV R6,#9H DL12:DJNZ R6,DL12 DJNZ R5,DL11 DJNZ R4,DL00 RET ;×××××设定时间程序:××××× SETTIME:
L0:LCALL DISPLAY1 ;调用时间允许程序 MM1: JB P1.2,L1 MOV C,P1.2 JC MM1 LCALL DELAY1 ;调用延时 JC MM1 MSTOP1: MOV C,P1.2 JNC MSTOP1 ;判断P1.2是否释放?释放则继续 LCALL DELAY1 ;调用延时 MOV C,P1.2 JNC MSTOP1 INC 22H ;小时增加1 MOV A,22H CJNE A,#18H,GO12 ;判断小时是否到24时?未到继续循环 MOV 22H,#00H ;小时复位 MOV 34H,#00H MOV 35H,#00H LJMP L0 L1:JB P1.3,L2 MOV C,P1.3 JC L1 LCALL DELAY1 ;延时 JC L1 MSTOP2: MOV C,P1.3 JNC MSTOP2 ;判断P1.3是否释放?释放则继续 LCALL DELAY1 ;调用延时 MOV C,P1.3 JNC MSTOP2 INC 21H ;分钟增加一 MOV A,21H CJNE A,#3CH,GO11 MOV 21H,#00H ;分钟复位 MOV 32H,#00H MOV 33H,#00H LJMP L0 GO11:MOV B,#0AH ;将A中的内容分成高低两部分 DIV AB MOV 32H,B MOV 33H,A LJMP L0
GO12: MOV B,#0AH DIV AB MOV 34H,B MOV 35H,A LJMP L0 L2:JB P1.4,L0 MOV C,P1.4 JC L2 LCALL DELAY1 ;调用延时 MOV C,P1.4 JC L2 STOP1: MOV C,P1.4 ;判断按键P1.4是否释放? JNC STOP1 LCALL DELAY1 ;调用延时 MOV C,P1.4 JNC STOP1 LJMP LOOP
;×××××设置闹钟时间×××××
SETATIME:LCALL DISPLAY2 ;调用时间运行 N0:LCALL DISPLAY2 MM2: JB P1.3,N1 ;判断P1.3是否按下?
MOV C,P1.3 JC MM2 LCALL DELAY1 JC MM2 MSTOP3: MOV C,P1.3 ;判断P1.3是否释放? JNC MSTOP3 LCALL DELAY1 MOV C,P1.3 JNC MSTOP3 INC 24H ;设定小时增加1 MOV A,24H CJNE A,#24,GO22 MOV 24H,#00H ;时钟复位 MOV 38H,#00H MOV 39H,#00H LJMP N0 N1:JB P1.1,N2 ;判断P1.1是否按下?
MOV C,P1.1 JC N1 LCALL DELAY1 JC N1 MSTOP4: MOV C,P1.1 ;判断P1.1是否释放? JNC MSTOP4 LCALL DELAY1 MOV C,P1.1 JNC MSTOP4 INC 23H ;设定闹钟分钟增加1 MOV A,23H CJNE A,#60,GO21 ;判断A是否到60分? MOV 23H,#00H ;分钟复位 MOV 36H,#00H MOV 37H,#00H LJMP N0 GO21:MOV B,#0AH ;将A中的内容分成高低两部分 DIV AB MOV 36H,B MOV 37H,A LJMP N0
GO22: MOV B,#0AH DIV AB MOV 38H,B MOV 39H,A LJMP N0 N2:JB P1.4 ,N0 ;判断P1.4是否按下? MOV C,P1.4 JC N2 LCALL DELAY1 MOV C,P1.4 JC N2 STOP2: MOV C,P1.4 ;判断P1.4是否释放? JNC STOP2 LCALL DELAY1 MOV C,P1.4 JNC STOP2 LJMP LOOP
TIMEPRO:MOV A,21H MOV B,23H CJNE A,B,BK ;判断分钟是否运行到设定的闹钟的分钟? MOV A,22H MOV B,24H CJNE A,B,BK ;判断时钟是否运行到设定的闹钟的时钟? SETB 25H.0 MOV C,25H.0 JC XX XX: LCALL TIMEOUT ;调用时间闹钟响应程序 BK:RET TIMEOUT:
X1:LCALL BZ ;调用喇叭响应程序 LCALL DISPLAY2 CLR 25H.0 JB P1.4, X1 ;判断P1.4是否按下? LCALL DELAY CLR 25H.0 LJMP DISPLAY1 BZ: CLR P3.7 ;喇叭响应程序 MOV R7,#250 ;响应延时时间 T2: MOV R6,#124 T3: DJNZ R6,T3
DJNZ R7,T2 SETB P3.7 RET LOOKATIME:LCALL DISPLAY2 ;调用时间运行程序 MM: JB P1.4,LOOKATIME ;判断按键P1.4是否按下 MOV C,P1.4 JC MM LCALL DELAY1 MOV C,P1.4 JC MM STOP3: MOV C,P1.4 JNC STOP3 LCALL DELAY1 MOV C,P1.4 JNC STOP3 LJMP LOOP DELAY1: MOV R4,#14H ;时间延时 DL001: MOV R5,#0FFH DL111: DJNZ R5,DL111 DJNZ R4,DL001 RET ;×××××时间运行程序××××× TIME: PUSH ACC ;现场保护 PUSH PSW MOV TH0,#03CH ;赋初值 MOV TL0,#0B0H DJNZ R2,RET0 MOV R2,#14H MOV A,20H CLR C MOV 30H,#0 MOV 31H,#0 MOV A,21H INC A ;分钟自加1 CJNE A,#3CH,GO2 ;判断分钟是否到60分? MOV 21H,#0H ;到60分复位 MOV 32H,#0 MOV 33H,#0 MOV A,22H INC A ;时钟自加1 CJNE A,#18H,GO3 ;判断时钟是否到24时? MOV 22H,#00H ;到24时复位 MOV 34H,#0 MOV 35H,#0 AJMP RET0 GO1: MOV 20H,A MOV B,#0AH DIV AB MOV 31H,A MOV 30H,B AJMP RET0 GO2: MOV 21H,A MOV B,#0AH DIV AB MOV 33H,A MOV 32H,B AJMP RET0 GO3: MOV 22H,A MOV B,#0AH DIV AB MOV 35H,A MOV 34H,B AJMP RET0 RET0: POP PSW ;恢复现场 POP ACC RETI ;×××××运行部分××××× DISPLAY1: MOV R0,#30H MOV R3,#0FEH MOV A,R3 PLAY1: MOV P2,A MOV A,@R0 MOV DPTR,#DSEG1 ;表首地址送DPTR MOVC A,@A+DPTR MOV P0,A LCALL DL1 MOV P2,#0FFH ;送高电平到P2 MOV A,R3 RL A ; JNB ACC.6,LD1 INC R0 MOV R3,A LJMP PLAY1 ;调用查表程序 LD1: RET DISPLAY2: PUSH ACC ;现场保护 PUSH PSW MOV R0,#36H MOV R3,#0FBH MOV A,R3 PLAY2: MOV P2,A MOV A,@R0 MOV DPTR,#DSEG1 ;表首地址送DPTR MOVC A,@A+DPTR ;查ASCII特码 MOV P0,A ;查表结果送A LCALL DL1 MOV P2,#0FFH ;送高电平到P2 MOV A,R3 RL A JNB ACC.6,LD2 INC R0 MOV R3,A LJMP PLAY2 LD2: POP PSW ;恢复现场 POP ACC RET ;×××××延时时间××××× DL1: MOV R7,#02H ;延时时间 DL: MOV R6,#020H DL6: DJNZ R6,$ DJNZ R7,DL RET DSEG1:DB 3FH,06H,5BH,4FH,66H DB 6DH,7DH,07H,7FH,6FH END
|